5c02d3183f46ba8621a4bdecc71facda5f8e0717Michael Graff/*
bd911976d51f102751848568ccf56592fd5f6d77Tinderbox User * Copyright (C) 1999-2007, 2010-2012, 2014-2017 Internet Systems Consortium, Inc. ("ISC")
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5c02d3183f46ba8621a4bdecc71facda5f8e0717Michael Graff */
5c02d3183f46ba8621a4bdecc71facda5f8e0717Michael Graff
28a8f5b0de57d269cf2845c69cb6abe18cbd3b3aMark Andrews/* $Id$ */
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*! \file */
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence
5c02d3183f46ba8621a4bdecc71facda5f8e0717Michael Graff#include <config.h>
5c02d3183f46ba8621a4bdecc71facda5f8e0717Michael Graff
ff89d6add5f529ffd2119708ef6d70aca69f45b1Mark Andrews#include <stdio.h>
5c02d3183f46ba8621a4bdecc71facda5f8e0717Michael Graff
2cc1d2536d5834fbe20281068b8bd34dd1ee5337David Lawrence#include <isc/buffer.h>
1e107b3d7b54de5022c3328423164e533afcc15eMark Andrews#include <isc/hash.h>
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence#include <isc/msgs.h>
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson#include <isc/netaddr.h>
b68f341a48d140912f73e79489386f55cf03e50eAndreas Gustafsson#include <isc/print.h>
0f7045b0c437b158c61c195c319d2762882ece83Andreas Gustafsson#include <isc/region.h>
0f7045b0c437b158c61c195c319d2762882ece83Andreas Gustafsson#include <isc/sockaddr.h>
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#include <isc/string.h>
364a82f7c25b62967678027043425201a5e5171aBob Halley#include <isc/util.h>
5c02d3183f46ba8621a4bdecc71facda5f8e0717Michael Graff
5c02d3183f46ba8621a4bdecc71facda5f8e0717Michael Graffisc_boolean_t
2cc1d2536d5834fbe20281068b8bd34dd1ee5337David Lawrenceisc_sockaddr_equal(const isc_sockaddr_t *a, const isc_sockaddr_t *b) {
c1807114ce574896694e3f449c73b098fe91730fMark Andrews return (isc_sockaddr_compare(a, b, ISC_SOCKADDR_CMPADDR|
c1807114ce574896694e3f449c73b098fe91730fMark Andrews ISC_SOCKADDR_CMPPORT|
c1807114ce574896694e3f449c73b098fe91730fMark Andrews ISC_SOCKADDR_CMPSCOPE));
c1807114ce574896694e3f449c73b098fe91730fMark Andrews}
c1807114ce574896694e3f449c73b098fe91730fMark Andrews
c1807114ce574896694e3f449c73b098fe91730fMark Andrewsisc_boolean_t
c1807114ce574896694e3f449c73b098fe91730fMark Andrewsisc_sockaddr_eqaddr(const isc_sockaddr_t *a, const isc_sockaddr_t *b) {
c1807114ce574896694e3f449c73b098fe91730fMark Andrews return (isc_sockaddr_compare(a, b, ISC_SOCKADDR_CMPADDR|
c1807114ce574896694e3f449c73b098fe91730fMark Andrews ISC_SOCKADDR_CMPSCOPE));
c1807114ce574896694e3f449c73b098fe91730fMark Andrews}
c1807114ce574896694e3f449c73b098fe91730fMark Andrews
c1807114ce574896694e3f449c73b098fe91730fMark Andrewsisc_boolean_t
c1807114ce574896694e3f449c73b098fe91730fMark Andrewsisc_sockaddr_compare(const isc_sockaddr_t *a, const isc_sockaddr_t *b,
c1807114ce574896694e3f449c73b098fe91730fMark Andrews unsigned int flags)
c1807114ce574896694e3f449c73b098fe91730fMark Andrews{
56f6fd83625392a3055483e6a55c6d4b666fecd3Bob Halley REQUIRE(a != NULL && b != NULL);
5c02d3183f46ba8621a4bdecc71facda5f8e0717Michael Graff
56f6fd83625392a3055483e6a55c6d4b666fecd3Bob Halley if (a->length != b->length)
5c02d3183f46ba8621a4bdecc71facda5f8e0717Michael Graff return (ISC_FALSE);
5c02d3183f46ba8621a4bdecc71facda5f8e0717Michael Graff
3724ec85fb720159dd4542d9c590725bb7effb6fBob Halley /*
3724ec85fb720159dd4542d9c590725bb7effb6fBob Halley * We don't just memcmp because the sin_zero field isn't always
3724ec85fb720159dd4542d9c590725bb7effb6fBob Halley * zero.
3724ec85fb720159dd4542d9c590725bb7effb6fBob Halley */
3724ec85fb720159dd4542d9c590725bb7effb6fBob Halley
3724ec85fb720159dd4542d9c590725bb7effb6fBob Halley if (a->type.sa.sa_family != b->type.sa.sa_family)
5c02d3183f46ba8621a4bdecc71facda5f8e0717Michael Graff return (ISC_FALSE);
3724ec85fb720159dd4542d9c590725bb7effb6fBob Halley switch (a->type.sa.sa_family) {
3724ec85fb720159dd4542d9c590725bb7effb6fBob Halley case AF_INET:
c1807114ce574896694e3f449c73b098fe91730fMark Andrews if ((flags & ISC_SOCKADDR_CMPADDR) != 0 &&
c1807114ce574896694e3f449c73b098fe91730fMark Andrews memcmp(&a->type.sin.sin_addr, &b->type.sin.sin_addr,
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sizeof(a->type.sin.sin_addr)) != 0)
3724ec85fb720159dd4542d9c590725bb7effb6fBob Halley return (ISC_FALSE);
c1807114ce574896694e3f449c73b098fe91730fMark Andrews if ((flags & ISC_SOCKADDR_CMPPORT) != 0 &&
c1807114ce574896694e3f449c73b098fe91730fMark Andrews a->type.sin.sin_port != b->type.sin.sin_port)
3724ec85fb720159dd4542d9c590725bb7effb6fBob Halley return (ISC_FALSE);
3724ec85fb720159dd4542d9c590725bb7effb6fBob Halley break;
3724ec85fb720159dd4542d9c590725bb7effb6fBob Halley case AF_INET6:
c1807114ce574896694e3f449c73b098fe91730fMark Andrews if ((flags & ISC_SOCKADDR_CMPADDR) != 0 &&
c1807114ce574896694e3f449c73b098fe91730fMark Andrews memcmp(&a->type.sin6.sin6_addr, &b->type.sin6.sin6_addr,
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sizeof(a->type.sin6.sin6_addr)) != 0)
3724ec85fb720159dd4542d9c590725bb7effb6fBob Halley return (ISC_FALSE);
ec3f1d35170225c74d11c27bb184e250d150b209Tatuya JINMEI 神明達哉#ifdef ISC_PLATFORM_HAVESCOPEID
c1807114ce574896694e3f449c73b098fe91730fMark Andrews /*
c1807114ce574896694e3f449c73b098fe91730fMark Andrews * If ISC_SOCKADDR_CMPSCOPEZERO is set then don't return
c1807114ce574896694e3f449c73b098fe91730fMark Andrews * ISC_FALSE if one of the scopes in zero.
c1807114ce574896694e3f449c73b098fe91730fMark Andrews */
c1807114ce574896694e3f449c73b098fe91730fMark Andrews if ((flags & ISC_SOCKADDR_CMPSCOPE) != 0 &&
c1807114ce574896694e3f449c73b098fe91730fMark Andrews a->type.sin6.sin6_scope_id != b->type.sin6.sin6_scope_id &&
c1807114ce574896694e3f449c73b098fe91730fMark Andrews ((flags & ISC_SOCKADDR_CMPSCOPEZERO) == 0 ||
c1807114ce574896694e3f449c73b098fe91730fMark Andrews (a->type.sin6.sin6_scope_id != 0 &&
c1807114ce574896694e3f449c73b098fe91730fMark Andrews b->type.sin6.sin6_scope_id != 0)))
ec3f1d35170225c74d11c27bb184e250d150b209Tatuya JINMEI 神明達哉 return (ISC_FALSE);
ec3f1d35170225c74d11c27bb184e250d150b209Tatuya JINMEI 神明達哉#endif
c1807114ce574896694e3f449c73b098fe91730fMark Andrews if ((flags & ISC_SOCKADDR_CMPPORT) != 0 &&
c1807114ce574896694e3f449c73b098fe91730fMark Andrews a->type.sin6.sin6_port != b->type.sin6.sin6_port)
54570ba7ffb85ad8449d86bd0e14fb6fb2e271c4James Brister return (ISC_FALSE);
54570ba7ffb85ad8449d86bd0e14fb6fb2e271c4James Brister break;
54570ba7ffb85ad8449d86bd0e14fb6fb2e271c4James Brister default:
54570ba7ffb85ad8449d86bd0e14fb6fb2e271c4James Brister if (memcmp(&a->type, &b->type, a->length) != 0)
54570ba7ffb85ad8449d86bd0e14fb6fb2e271c4James Brister return (ISC_FALSE);
54570ba7ffb85ad8449d86bd0e14fb6fb2e271c4James Brister }
54570ba7ffb85ad8449d86bd0e14fb6fb2e271c4James Brister return (ISC_TRUE);
54570ba7ffb85ad8449d86bd0e14fb6fb2e271c4James Brister}
54570ba7ffb85ad8449d86bd0e14fb6fb2e271c4James Brister
33911b409bea2e0576cb1a58e0f3408f63187976Andreas Gustafssonisc_boolean_t
33911b409bea2e0576cb1a58e0f3408f63187976Andreas Gustafssonisc_sockaddr_eqaddrprefix(const isc_sockaddr_t *a, const isc_sockaddr_t *b,
33911b409bea2e0576cb1a58e0f3408f63187976Andreas Gustafsson unsigned int prefixlen)
33911b409bea2e0576cb1a58e0f3408f63187976Andreas Gustafsson{
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson isc_netaddr_t na, nb;
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson isc_netaddr_fromsockaddr(&na, a);
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson isc_netaddr_fromsockaddr(&nb, b);
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson return (isc_netaddr_eqprefix(&na, &nb, prefixlen));
33911b409bea2e0576cb1a58e0f3408f63187976Andreas Gustafsson}
33911b409bea2e0576cb1a58e0f3408f63187976Andreas Gustafsson
4ed0c326e6c344589db02738358f98d96c6299d2Andreas Gustafssonisc_result_t
4ed0c326e6c344589db02738358f98d96c6299d2Andreas Gustafssonisc_sockaddr_totext(const isc_sockaddr_t *sockaddr, isc_buffer_t *target) {
bb25076ffc6fd068c081c3c41b9782f715edd883Andreas Gustafsson isc_result_t result;
bb25076ffc6fd068c081c3c41b9782f715edd883Andreas Gustafsson isc_netaddr_t netaddr;
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson char pbuf[sizeof("65000")];
4ed0c326e6c344589db02738358f98d96c6299d2Andreas Gustafsson unsigned int plen;
4ed0c326e6c344589db02738358f98d96c6299d2Andreas Gustafsson isc_region_t avail;
ff89d6add5f529ffd2119708ef6d70aca69f45b1Mark Andrews
ff89d6add5f529ffd2119708ef6d70aca69f45b1Mark Andrews REQUIRE(sockaddr != NULL);
ff89d6add5f529ffd2119708ef6d70aca69f45b1Mark Andrews
35af0018ddee51e2a9551d7aec343933498d0a79Andreas Gustafsson /*
35af0018ddee51e2a9551d7aec343933498d0a79Andreas Gustafsson * Do the port first, giving us the opportunity to check for
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * unsupported address families before calling
35af0018ddee51e2a9551d7aec343933498d0a79Andreas Gustafsson * isc_netaddr_fromsockaddr().
35af0018ddee51e2a9551d7aec343933498d0a79Andreas Gustafsson */
bb25076ffc6fd068c081c3c41b9782f715edd883Andreas Gustafsson switch (sockaddr->type.sa.sa_family) {
ff89d6add5f529ffd2119708ef6d70aca69f45b1Mark Andrews case AF_INET:
806c235ecf533b98d068b3f8df9d7abbe1e30cf9Mark Andrews snprintf(pbuf, sizeof(pbuf), "%u", ntohs(sockaddr->type.sin.sin_port));
ff89d6add5f529ffd2119708ef6d70aca69f45b1Mark Andrews break;
ff89d6add5f529ffd2119708ef6d70aca69f45b1Mark Andrews case AF_INET6:
806c235ecf533b98d068b3f8df9d7abbe1e30cf9Mark Andrews snprintf(pbuf, sizeof(pbuf), "%u", ntohs(sockaddr->type.sin6.sin6_port));
ff89d6add5f529ffd2119708ef6d70aca69f45b1Mark Andrews break;
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews#ifdef ISC_PLAFORM_HAVESYSUNH
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews case AF_UNIX:
15683369e0113bd08863a705a8a1785c093455d3Mark Andrews plen = strlen(sockaddr->type.sunix.sun_path);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews if (plen >= isc_buffer_availablelength(target))
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews return (ISC_R_NOSPACE);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews
15683369e0113bd08863a705a8a1785c093455d3Mark Andrews isc_buffer_putmem(target, sockaddr->type.sunix.sun_path, plen);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews /*
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews * Null terminate after used region.
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews */
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews isc_buffer_availableregion(target, &avail);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews INSIST(avail.length >= 1);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews avail.base[0] = '\0';
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews return (ISC_R_SUCCESS);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews#endif
ff89d6add5f529ffd2119708ef6d70aca69f45b1Mark Andrews default:
35af0018ddee51e2a9551d7aec343933498d0a79Andreas Gustafsson return (ISC_R_FAILURE);
ff89d6add5f529ffd2119708ef6d70aca69f45b1Mark Andrews }
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
4ed0c326e6c344589db02738358f98d96c6299d2Andreas Gustafsson plen = strlen(pbuf);
bb25076ffc6fd068c081c3c41b9782f715edd883Andreas Gustafsson INSIST(plen < sizeof(pbuf));
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
35af0018ddee51e2a9551d7aec343933498d0a79Andreas Gustafsson isc_netaddr_fromsockaddr(&netaddr, sockaddr);
35af0018ddee51e2a9551d7aec343933498d0a79Andreas Gustafsson result = isc_netaddr_totext(&netaddr, target);
35af0018ddee51e2a9551d7aec343933498d0a79Andreas Gustafsson if (result != ISC_R_SUCCESS)
35af0018ddee51e2a9551d7aec343933498d0a79Andreas Gustafsson return (result);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
bb25076ffc6fd068c081c3c41b9782f715edd883Andreas Gustafsson if (1 + plen + 1 > isc_buffer_availablelength(target))
4ed0c326e6c344589db02738358f98d96c6299d2Andreas Gustafsson return (ISC_R_NOSPACE);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
87cafc5e70f79f2586d067fbdd64f61bbab069d2David Lawrence isc_buffer_putmem(target, (const unsigned char *)"#", 1);
87cafc5e70f79f2586d067fbdd64f61bbab069d2David Lawrence isc_buffer_putmem(target, (const unsigned char *)pbuf, plen);
4ed0c326e6c344589db02738358f98d96c6299d2Andreas Gustafsson
87cafc5e70f79f2586d067fbdd64f61bbab069d2David Lawrence /*
87cafc5e70f79f2586d067fbdd64f61bbab069d2David Lawrence * Null terminate after used region.
87cafc5e70f79f2586d067fbdd64f61bbab069d2David Lawrence */
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrence isc_buffer_availableregion(target, &avail);
91fbf6ef97974c3a9be56f637db69e5b2288647dAndreas Gustafsson INSIST(avail.length >= 1);
91fbf6ef97974c3a9be56f637db69e5b2288647dAndreas Gustafsson avail.base[0] = '\0';
91fbf6ef97974c3a9be56f637db69e5b2288647dAndreas Gustafsson
4ed0c326e6c344589db02738358f98d96c6299d2Andreas Gustafsson return (ISC_R_SUCCESS);
ff89d6add5f529ffd2119708ef6d70aca69f45b1Mark Andrews}
ff89d6add5f529ffd2119708ef6d70aca69f45b1Mark Andrews
527ea00c176abc167a6daf978e06f52c7e70aa06Andreas Gustafssonvoid
28e509b145c3d241d1d2d9102fea38afad95bbd4Andreas Gustafssonisc_sockaddr_format(const isc_sockaddr_t *sa, char *array, unsigned int size) {
527ea00c176abc167a6daf978e06f52c7e70aa06Andreas Gustafsson isc_result_t result;
527ea00c176abc167a6daf978e06f52c7e70aa06Andreas Gustafsson isc_buffer_t buf;
527ea00c176abc167a6daf978e06f52c7e70aa06Andreas Gustafsson
0b8c40c8d841de7e539f03fbc8e8815f06d49425Mark Andrews if (size == 0U)
0b8c40c8d841de7e539f03fbc8e8815f06d49425Mark Andrews return;
0b8c40c8d841de7e539f03fbc8e8815f06d49425Mark Andrews
527ea00c176abc167a6daf978e06f52c7e70aa06Andreas Gustafsson isc_buffer_init(&buf, array, size);
527ea00c176abc167a6daf978e06f52c7e70aa06Andreas Gustafsson result = isc_sockaddr_totext(sa, &buf);
527ea00c176abc167a6daf978e06f52c7e70aa06Andreas Gustafsson if (result != ISC_R_SUCCESS) {
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence /*
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence * The message is the same as in netaddr.c.
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence */
527ea00c176abc167a6daf978e06f52c7e70aa06Andreas Gustafsson snprintf(array, size,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence isc_msgcat_get(isc_msgcat, ISC_MSGSET_NETADDR,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence ISC_MSG_UNKNOWNADDR,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence "<unknown address, family %u>"),
527ea00c176abc167a6daf978e06f52c7e70aa06Andreas Gustafsson sa->type.sa.sa_family);
527ea00c176abc167a6daf978e06f52c7e70aa06Andreas Gustafsson array[size - 1] = '\0';
527ea00c176abc167a6daf978e06f52c7e70aa06Andreas Gustafsson }
527ea00c176abc167a6daf978e06f52c7e70aa06Andreas Gustafsson}
527ea00c176abc167a6daf978e06f52c7e70aa06Andreas Gustafsson
56f6fd83625392a3055483e6a55c6d4b666fecd3Bob Halleyunsigned int
0f0ed7ea47ce9911e9249fba14ecfef8d6054008Mark Andrewsisc_sockaddr_hash(const isc_sockaddr_t *sockaddr, isc_boolean_t address_only) {
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews unsigned int length = 0;
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews const unsigned char *s = NULL;
56f6fd83625392a3055483e6a55c6d4b666fecd3Bob Halley unsigned int h = 0;
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews unsigned int p = 0;
8138bb315d89b63fe1946d9341e3aa36d7ff6aebMark Andrews const struct in6_addr *in6;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
56f6fd83625392a3055483e6a55c6d4b666fecd3Bob Halley REQUIRE(sockaddr != NULL);
56f6fd83625392a3055483e6a55c6d4b666fecd3Bob Halley
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews switch (sockaddr->type.sa.sa_family) {
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews case AF_INET:
1e107b3d7b54de5022c3328423164e533afcc15eMark Andrews s = (const unsigned char *)&sockaddr->type.sin.sin_addr;
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews p = ntohs(sockaddr->type.sin.sin_port);
1e107b3d7b54de5022c3328423164e533afcc15eMark Andrews length = sizeof(sockaddr->type.sin.sin_addr.s_addr);
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews break;
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews case AF_INET6:
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews in6 = &sockaddr->type.sin6.sin6_addr;
47c5b8af920a93763c97d9a93ea1fd766961a5b3Evan Hunt s = (const unsigned char *)in6;
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews if (IN6_IS_ADDR_V4MAPPED(in6)) {
47c5b8af920a93763c97d9a93ea1fd766961a5b3Evan Hunt s += 12;
1e107b3d7b54de5022c3328423164e533afcc15eMark Andrews length = sizeof(sockaddr->type.sin.sin_addr.s_addr);
47c5b8af920a93763c97d9a93ea1fd766961a5b3Evan Hunt } else
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson length = sizeof(sockaddr->type.sin6.sin6_addr);
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews p = ntohs(sockaddr->type.sin6.sin6_port);
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews break;
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews default:
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews UNEXPECTED_ERROR(__FILE__, __LINE__,
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews isc_msgcat_get(isc_msgcat,
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews ISC_MSGSET_SOCKADDR,
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews ISC_MSG_UNKNOWNFAMILY,
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews "unknown address family: %d"),
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews (int)sockaddr->type.sa.sa_family);
87cafc5e70f79f2586d067fbdd64f61bbab069d2David Lawrence s = (const unsigned char *)&sockaddr->type;
56f6fd83625392a3055483e6a55c6d4b666fecd3Bob Halley length = sockaddr->length;
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews p = 0;
5c02d3183f46ba8621a4bdecc71facda5f8e0717Michael Graff }
1e107b3d7b54de5022c3328423164e533afcc15eMark Andrews
5d79b60fc5e4dad4f04da39570517d20a2425f8bMukund Sivaraman h = isc_hash_function(s, length, ISC_TRUE, NULL);
5d79b60fc5e4dad4f04da39570517d20a2425f8bMukund Sivaraman if (!address_only)
5d79b60fc5e4dad4f04da39570517d20a2425f8bMukund Sivaraman h = isc_hash_function(&p, sizeof(p), ISC_TRUE, &h);
1e107b3d7b54de5022c3328423164e533afcc15eMark Andrews
56f6fd83625392a3055483e6a55c6d4b666fecd3Bob Halley return (h);
5c02d3183f46ba8621a4bdecc71facda5f8e0717Michael Graff}
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graffvoid
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graffisc_sockaddr_any(isc_sockaddr_t *sockaddr)
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff{
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson memset(sockaddr, 0, sizeof(*sockaddr));
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff sockaddr->type.sin.sin_family = AF_INET;
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff#ifdef ISC_PLATFORM_HAVESALEN
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->type.sin.sin_len = sizeof(sockaddr->type.sin);
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff#endif
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff sockaddr->type.sin.sin_addr.s_addr = INADDR_ANY;
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff sockaddr->type.sin.sin_port = 0;
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->length = sizeof(sockaddr->type.sin);
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff ISC_LINK_INIT(sockaddr, link);
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff}
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graffvoid
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graffisc_sockaddr_any6(isc_sockaddr_t *sockaddr)
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff{
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson memset(sockaddr, 0, sizeof(*sockaddr));
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff sockaddr->type.sin6.sin6_family = AF_INET6;
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff#ifdef ISC_PLATFORM_HAVESALEN
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->type.sin6.sin6_len = sizeof(sockaddr->type.sin6);
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff#endif
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff sockaddr->type.sin6.sin6_addr = in6addr_any;
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff sockaddr->type.sin6.sin6_port = 0;
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->length = sizeof(sockaddr->type.sin6);
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff ISC_LINK_INIT(sockaddr, link);
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff}
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halleyvoid
0f0ed7ea47ce9911e9249fba14ecfef8d6054008Mark Andrewsisc_sockaddr_fromin(isc_sockaddr_t *sockaddr, const struct in_addr *ina,
a252c2771f59409d38b12d076513aeef89c3aeb1David Lawrence in_port_t port)
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley{
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson memset(sockaddr, 0, sizeof(*sockaddr));
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley sockaddr->type.sin.sin_family = AF_INET;
0e42fb6588b36adfab49647542c1d717c441c544Andreas Gustafsson#ifdef ISC_PLATFORM_HAVESALEN
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->type.sin.sin_len = sizeof(sockaddr->type.sin);
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley#endif
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley sockaddr->type.sin.sin_addr = *ina;
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley sockaddr->type.sin.sin_port = htons(port);
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->length = sizeof(sockaddr->type.sin);
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley ISC_LINK_INIT(sockaddr, link);
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley}
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley
5bba7216f3263dc49dd4db2ac64b6203a9e2b180Andreas Gustafssonvoid
5bba7216f3263dc49dd4db2ac64b6203a9e2b180Andreas Gustafssonisc_sockaddr_anyofpf(isc_sockaddr_t *sockaddr, int pf) {
5bba7216f3263dc49dd4db2ac64b6203a9e2b180Andreas Gustafsson switch (pf) {
5bba7216f3263dc49dd4db2ac64b6203a9e2b180Andreas Gustafsson case AF_INET:
5bba7216f3263dc49dd4db2ac64b6203a9e2b180Andreas Gustafsson isc_sockaddr_any(sockaddr);
5bba7216f3263dc49dd4db2ac64b6203a9e2b180Andreas Gustafsson break;
5bba7216f3263dc49dd4db2ac64b6203a9e2b180Andreas Gustafsson case AF_INET6:
5bba7216f3263dc49dd4db2ac64b6203a9e2b180Andreas Gustafsson isc_sockaddr_any6(sockaddr);
5bba7216f3263dc49dd4db2ac64b6203a9e2b180Andreas Gustafsson break;
5bba7216f3263dc49dd4db2ac64b6203a9e2b180Andreas Gustafsson default:
5bba7216f3263dc49dd4db2ac64b6203a9e2b180Andreas Gustafsson INSIST(0);
5bba7216f3263dc49dd4db2ac64b6203a9e2b180Andreas Gustafsson }
5bba7216f3263dc49dd4db2ac64b6203a9e2b180Andreas Gustafsson}
5bba7216f3263dc49dd4db2ac64b6203a9e2b180Andreas Gustafsson
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halleyvoid
0f0ed7ea47ce9911e9249fba14ecfef8d6054008Mark Andrewsisc_sockaddr_fromin6(isc_sockaddr_t *sockaddr, const struct in6_addr *ina6,
a252c2771f59409d38b12d076513aeef89c3aeb1David Lawrence in_port_t port)
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley{
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson memset(sockaddr, 0, sizeof(*sockaddr));
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley sockaddr->type.sin6.sin6_family = AF_INET6;
0e42fb6588b36adfab49647542c1d717c441c544Andreas Gustafsson#ifdef ISC_PLATFORM_HAVESALEN
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->type.sin6.sin6_len = sizeof(sockaddr->type.sin6);
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley#endif
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley sockaddr->type.sin6.sin6_addr = *ina6;
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley sockaddr->type.sin6.sin6_port = htons(port);
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->length = sizeof(sockaddr->type.sin6);
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley ISC_LINK_INIT(sockaddr, link);
1ece2b413f2f6495af943f972d5a52ed16b71f44Bob Halley}
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halleyvoid
0f0ed7ea47ce9911e9249fba14ecfef8d6054008Mark Andrewsisc_sockaddr_v6fromin(isc_sockaddr_t *sockaddr, const struct in_addr *ina,
a252c2771f59409d38b12d076513aeef89c3aeb1David Lawrence in_port_t port)
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley{
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson memset(sockaddr, 0, sizeof(*sockaddr));
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley sockaddr->type.sin6.sin6_family = AF_INET6;
0e42fb6588b36adfab49647542c1d717c441c544Andreas Gustafsson#ifdef ISC_PLATFORM_HAVESALEN
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->type.sin6.sin6_len = sizeof(sockaddr->type.sin6);
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley#endif
2dcb05b6a864f418c9f40ff525f56ce9c449006cMichael Graff sockaddr->type.sin6.sin6_addr.s6_addr[10] = 0xff;
2dcb05b6a864f418c9f40ff525f56ce9c449006cMichael Graff sockaddr->type.sin6.sin6_addr.s6_addr[11] = 0xff;
e851ea826066ac5a5b01c2c23218faa0273a12e8Evan Hunt memmove(&sockaddr->type.sin6.sin6_addr.s6_addr[12], ina, 4);
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley sockaddr->type.sin6.sin6_port = htons(port);
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->length = sizeof(sockaddr->type.sin6);
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley ISC_LINK_INIT(sockaddr, link);
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley}
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halleyint
0f0ed7ea47ce9911e9249fba14ecfef8d6054008Mark Andrewsisc_sockaddr_pf(const isc_sockaddr_t *sockaddr) {
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley /*
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley * Get the protocol family of 'sockaddr'.
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley */
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley#if (AF_INET == PF_INET && AF_INET6 == PF_INET6)
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley /*
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley * Assume that PF_xxx == AF_xxx for all AF and PF.
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley */
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley return (sockaddr->type.sa.sa_family);
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley#else
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley switch (sockaddr->type.sa.sa_family) {
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley case AF_INET:
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley return (PF_INET);
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley case AF_INET6:
35af0018ddee51e2a9551d7aec343933498d0a79Andreas Gustafsson return (PF_INET6);
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley default:
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence FATAL_ERROR(__FILE__, __LINE__,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence isc_msgcat_get(isc_msgcat, ISC_MSGSET_SOCKADDR,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence ISC_MSG_UNKNOWNFAMILY,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence "unknown address family: %d"),
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence (int)sockaddr->type.sa.sa_family);
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley }
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley#endif
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley}
043c6c62e63f0fcdd573f47137fb3be5c565aef1Bob Halley
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafssonvoid
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafssonisc_sockaddr_fromnetaddr(isc_sockaddr_t *sockaddr, const isc_netaddr_t *na,
6d27aeb4e2d12b507abadf83a781484d1f567bdbTinderbox User in_port_t port)
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson{
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson memset(sockaddr, 0, sizeof(*sockaddr));
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson sockaddr->type.sin.sin_family = na->family;
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson switch (na->family) {
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson case AF_INET:
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->length = sizeof(sockaddr->type.sin);
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson#ifdef ISC_PLATFORM_HAVESALEN
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->type.sin.sin_len = sizeof(sockaddr->type.sin);
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson#endif
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson sockaddr->type.sin.sin_addr = na->type.in;
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson sockaddr->type.sin.sin_port = htons(port);
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson break;
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson case AF_INET6:
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->length = sizeof(sockaddr->type.sin6);
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson#ifdef ISC_PLATFORM_HAVESALEN
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->type.sin6.sin6_len = sizeof(sockaddr->type.sin6);
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson#endif
e851ea826066ac5a5b01c2c23218faa0273a12e8Evan Hunt memmove(&sockaddr->type.sin6.sin6_addr, &na->type.in6, 16);
6526fd032fc418411da3af4201214e95c113d3e2Mark Andrews#ifdef ISC_PLATFORM_HAVESCOPEID
6526fd032fc418411da3af4201214e95c113d3e2Mark Andrews sockaddr->type.sin6.sin6_scope_id = isc_netaddr_getzone(na);
6526fd032fc418411da3af4201214e95c113d3e2Mark Andrews#endif
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson sockaddr->type.sin6.sin6_port = htons(port);
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson break;
33cc94f04cb44dc247f605a954e45e5adc699977Automatic Updater default:
33cc94f04cb44dc247f605a954e45e5adc699977Automatic Updater INSIST(0);
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson }
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson ISC_LINK_INIT(sockaddr, link);
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson}
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson
043c6c62e63f0fcdd573f47137fb3be5c565aef1Bob Halleyvoid
043c6c62e63f0fcdd573f47137fb3be5c565aef1Bob Halleyisc_sockaddr_setport(isc_sockaddr_t *sockaddr, in_port_t port) {
043c6c62e63f0fcdd573f47137fb3be5c565aef1Bob Halley switch (sockaddr->type.sa.sa_family) {
043c6c62e63f0fcdd573f47137fb3be5c565aef1Bob Halley case AF_INET:
043c6c62e63f0fcdd573f47137fb3be5c565aef1Bob Halley sockaddr->type.sin.sin_port = htons(port);
043c6c62e63f0fcdd573f47137fb3be5c565aef1Bob Halley break;
043c6c62e63f0fcdd573f47137fb3be5c565aef1Bob Halley case AF_INET6:
043c6c62e63f0fcdd573f47137fb3be5c565aef1Bob Halley sockaddr->type.sin6.sin6_port = htons(port);
043c6c62e63f0fcdd573f47137fb3be5c565aef1Bob Halley break;
043c6c62e63f0fcdd573f47137fb3be5c565aef1Bob Halley default:
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence FATAL_ERROR(__FILE__, __LINE__,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence isc_msgcat_get(isc_msgcat, ISC_MSGSET_SOCKADDR,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence ISC_MSG_UNKNOWNFAMILY,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence "unknown address family: %d"),
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence (int)sockaddr->type.sa.sa_family);
043c6c62e63f0fcdd573f47137fb3be5c565aef1Bob Halley }
043c6c62e63f0fcdd573f47137fb3be5c565aef1Bob Halley}
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrence
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrencein_port_t
45e1bd63587102c3bb361eaca42ee7b714fb3542Mark Andrewsisc_sockaddr_getport(const isc_sockaddr_t *sockaddr) {
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrence in_port_t port = 0;
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrence
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrence switch (sockaddr->type.sa.sa_family) {
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrence case AF_INET:
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrence port = ntohs(sockaddr->type.sin.sin_port);
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrence break;
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrence case AF_INET6:
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrence port = ntohs(sockaddr->type.sin6.sin6_port);
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrence break;
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrence default:
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence FATAL_ERROR(__FILE__, __LINE__,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence isc_msgcat_get(isc_msgcat, ISC_MSGSET_SOCKADDR,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence ISC_MSG_UNKNOWNFAMILY,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence "unknown address family: %d"),
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence (int)sockaddr->type.sa.sa_family);
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrence }
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrence
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrence return (port);
c5f33ba0f0003a55d3aa9252bf688161608f9f4eDavid Lawrence}
d80da258e377f02f0dcd703b89a1044cc58e949fMichael Graff
d80da258e377f02f0dcd703b89a1044cc58e949fMichael Graffisc_boolean_t
45e1bd63587102c3bb361eaca42ee7b714fb3542Mark Andrewsisc_sockaddr_ismulticast(const isc_sockaddr_t *sockaddr) {
d80da258e377f02f0dcd703b89a1044cc58e949fMichael Graff isc_netaddr_t netaddr;
d80da258e377f02f0dcd703b89a1044cc58e949fMichael Graff
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews if (sockaddr->type.sa.sa_family == AF_INET ||
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews sockaddr->type.sa.sa_family == AF_INET6) {
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews isc_netaddr_fromsockaddr(&netaddr, sockaddr);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews return (isc_netaddr_ismulticast(&netaddr));
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews }
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews return (ISC_FALSE);
d80da258e377f02f0dcd703b89a1044cc58e949fMichael Graff}
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews
22fa4e3206c2048cabaf75a3ae21132fd5542848Mark Andrewsisc_boolean_t
45e1bd63587102c3bb361eaca42ee7b714fb3542Mark Andrewsisc_sockaddr_isexperimental(const isc_sockaddr_t *sockaddr) {
22fa4e3206c2048cabaf75a3ae21132fd5542848Mark Andrews isc_netaddr_t netaddr;
22fa4e3206c2048cabaf75a3ae21132fd5542848Mark Andrews
22fa4e3206c2048cabaf75a3ae21132fd5542848Mark Andrews if (sockaddr->type.sa.sa_family == AF_INET) {
22fa4e3206c2048cabaf75a3ae21132fd5542848Mark Andrews isc_netaddr_fromsockaddr(&netaddr, sockaddr);
22fa4e3206c2048cabaf75a3ae21132fd5542848Mark Andrews return (isc_netaddr_isexperimental(&netaddr));
22fa4e3206c2048cabaf75a3ae21132fd5542848Mark Andrews }
22fa4e3206c2048cabaf75a3ae21132fd5542848Mark Andrews return (ISC_FALSE);
22fa4e3206c2048cabaf75a3ae21132fd5542848Mark Andrews}
22fa4e3206c2048cabaf75a3ae21132fd5542848Mark Andrews
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrewsisc_boolean_t
45e1bd63587102c3bb361eaca42ee7b714fb3542Mark Andrewsisc_sockaddr_issitelocal(const isc_sockaddr_t *sockaddr) {
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews isc_netaddr_t netaddr;
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews if (sockaddr->type.sa.sa_family == AF_INET6) {
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews isc_netaddr_fromsockaddr(&netaddr, sockaddr);
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews return (isc_netaddr_issitelocal(&netaddr));
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews }
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews return (ISC_FALSE);
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews}
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrewsisc_boolean_t
45e1bd63587102c3bb361eaca42ee7b714fb3542Mark Andrewsisc_sockaddr_islinklocal(const isc_sockaddr_t *sockaddr) {
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews isc_netaddr_t netaddr;
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews if (sockaddr->type.sa.sa_family == AF_INET6) {
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews isc_netaddr_fromsockaddr(&netaddr, sockaddr);
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews return (isc_netaddr_islinklocal(&netaddr));
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews }
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews return (ISC_FALSE);
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews}
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews
6588a2b404365cea59e71a3f639349272600f68dMark Andrewsisc_boolean_t
6588a2b404365cea59e71a3f639349272600f68dMark Andrewsisc_sockaddr_isnetzero(const isc_sockaddr_t *sockaddr) {
6588a2b404365cea59e71a3f639349272600f68dMark Andrews isc_netaddr_t netaddr;
6588a2b404365cea59e71a3f639349272600f68dMark Andrews
6588a2b404365cea59e71a3f639349272600f68dMark Andrews if (sockaddr->type.sa.sa_family == AF_INET) {
6588a2b404365cea59e71a3f639349272600f68dMark Andrews isc_netaddr_fromsockaddr(&netaddr, sockaddr);
6588a2b404365cea59e71a3f639349272600f68dMark Andrews return (isc_netaddr_isnetzero(&netaddr));
6588a2b404365cea59e71a3f639349272600f68dMark Andrews }
6588a2b404365cea59e71a3f639349272600f68dMark Andrews return (ISC_FALSE);
6588a2b404365cea59e71a3f639349272600f68dMark Andrews}
6588a2b404365cea59e71a3f639349272600f68dMark Andrews
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrewsisc_result_t
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrewsisc_sockaddr_frompath(isc_sockaddr_t *sockaddr, const char *path) {
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews#ifdef ISC_PLATFORM_HAVESYSUNH
15683369e0113bd08863a705a8a1785c093455d3Mark Andrews if (strlen(path) >= sizeof(sockaddr->type.sunix.sun_path))
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews return (ISC_R_NOSPACE);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews memset(sockaddr, 0, sizeof(*sockaddr));
15683369e0113bd08863a705a8a1785c093455d3Mark Andrews sockaddr->length = sizeof(sockaddr->type.sunix);
15683369e0113bd08863a705a8a1785c093455d3Mark Andrews sockaddr->type.sunix.sun_family = AF_UNIX;
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews#ifdef ISC_PLATFORM_HAVESALEN
ea5775a7fde44639e2b4b7ad96d1499b7f8b4401Mark Andrews sockaddr->type.sunix.sun_len =
ea5775a7fde44639e2b4b7ad96d1499b7f8b4401Mark Andrews (unsigned char)sizeof(sockaddr->type.sunix);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews#endif
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt strlcpy(sockaddr->type.sunix.sun_path, path,
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt sizeof(sockaddr->type.sunix.sun_path));
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews return (ISC_R_SUCCESS);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews#else
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews UNUSED(sockaddr);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews UNUSED(path);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews return (ISC_R_NOTIMPLEMENTED);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews#endif
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews}