1135446Strhodes/* 2254402Serwin * Copyright (C) 2004-2007, 2009, 2012 Internet Systems Consortium, Inc. ("ISC") 3135446Strhodes * Copyright (C) 1998-2003 Internet Software Consortium. 4135446Strhodes * 5193149Sdougb * Permission to use, copy, modify, and/or distribute this software for any 6135446Strhodes * purpose with or without fee is hereby granted, provided that the above 7135446Strhodes * copyright notice and this permission notice appear in all copies. 8135446Strhodes * 9135446Strhodes * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10135446Strhodes * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11135446Strhodes * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12135446Strhodes * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13135446Strhodes * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14135446Strhodes * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15135446Strhodes * PERFORMANCE OF THIS SOFTWARE. 16135446Strhodes */ 17135446Strhodes 18234010Sdougb/* $Id: sockaddr.h,v 1.57 2009/01/18 23:48:14 tbox Exp $ */ 19135446Strhodes 20135446Strhodes#ifndef ISC_SOCKADDR_H 21135446Strhodes#define ISC_SOCKADDR_H 1 22135446Strhodes 23193149Sdougb/*! \file isc/sockaddr.h */ 24170222Sdougb 25135446Strhodes#include <isc/lang.h> 26135446Strhodes#include <isc/net.h> 27135446Strhodes#include <isc/types.h> 28170222Sdougb#ifdef ISC_PLATFORM_HAVESYSUNH 29170222Sdougb#include <sys/un.h> 30170222Sdougb#endif 31135446Strhodes 32135446Strhodesstruct isc_sockaddr { 33135446Strhodes union { 34135446Strhodes struct sockaddr sa; 35135446Strhodes struct sockaddr_in sin; 36135446Strhodes struct sockaddr_in6 sin6; 37254402Serwin struct sockaddr_storage ss; 38170222Sdougb#ifdef ISC_PLATFORM_HAVESYSUNH 39170222Sdougb struct sockaddr_un sunix; 40170222Sdougb#endif 41135446Strhodes } type; 42135446Strhodes unsigned int length; /* XXXRTH beginning? */ 43135446Strhodes ISC_LINK(struct isc_sockaddr) link; 44135446Strhodes}; 45135446Strhodes 46135446Strhodestypedef ISC_LIST(struct isc_sockaddr) isc_sockaddrlist_t; 47135446Strhodes 48170222Sdougb#define ISC_SOCKADDR_CMPADDR 0x0001 /*%< compare the address 49170222Sdougb * sin_addr/sin6_addr */ 50170222Sdougb#define ISC_SOCKADDR_CMPPORT 0x0002 /*%< compare the port 51170222Sdougb * sin_port/sin6_port */ 52170222Sdougb#define ISC_SOCKADDR_CMPSCOPE 0x0004 /*%< compare the scope 53170222Sdougb * sin6_scope */ 54170222Sdougb#define ISC_SOCKADDR_CMPSCOPEZERO 0x0008 /*%< when comparing scopes 55170222Sdougb * zero scopes always match */ 56170222Sdougb 57135446StrhodesISC_LANG_BEGINDECLS 58135446Strhodes 59135446Strhodesisc_boolean_t 60170222Sdougbisc_sockaddr_compare(const isc_sockaddr_t *a, const isc_sockaddr_t *b, 61170222Sdougb unsigned int flags); 62170222Sdougb/*%< 63170222Sdougb * Compare the elements of the two address ('a' and 'b') as specified 64170222Sdougb * by 'flags' and report if they are equal or not. 65170222Sdougb * 66170222Sdougb * 'flags' is set from ISC_SOCKADDR_CMP*. 67170222Sdougb */ 68170222Sdougb 69170222Sdougbisc_boolean_t 70135446Strhodesisc_sockaddr_equal(const isc_sockaddr_t *a, const isc_sockaddr_t *b); 71170222Sdougb/*%< 72135446Strhodes * Return ISC_TRUE iff the socket addresses 'a' and 'b' are equal. 73135446Strhodes */ 74135446Strhodes 75135446Strhodesisc_boolean_t 76135446Strhodesisc_sockaddr_eqaddr(const isc_sockaddr_t *a, const isc_sockaddr_t *b); 77170222Sdougb/*%< 78135446Strhodes * Return ISC_TRUE iff the address parts of the socket addresses 79135446Strhodes * 'a' and 'b' are equal, ignoring the ports. 80135446Strhodes */ 81135446Strhodes 82135446Strhodesisc_boolean_t 83135446Strhodesisc_sockaddr_eqaddrprefix(const isc_sockaddr_t *a, const isc_sockaddr_t *b, 84135446Strhodes unsigned int prefixlen); 85170222Sdougb/*%< 86135446Strhodes * Return ISC_TRUE iff the most significant 'prefixlen' bits of the 87135446Strhodes * socket addresses 'a' and 'b' are equal, ignoring the ports. 88193149Sdougb * If 'b''s scope is zero then 'a''s scope will be ignored. 89135446Strhodes */ 90135446Strhodes 91135446Strhodesunsigned int 92135446Strhodesisc_sockaddr_hash(const isc_sockaddr_t *sockaddr, isc_boolean_t address_only); 93170222Sdougb/*%< 94135446Strhodes * Return a hash value for the socket address 'sockaddr'. If 'address_only' 95135446Strhodes * is ISC_TRUE, the hash value will not depend on the port. 96135446Strhodes * 97135446Strhodes * IPv6 addresses containing mapped IPv4 addresses generate the same hash 98135446Strhodes * value as the equivalent IPv4 address. 99135446Strhodes */ 100135446Strhodes 101135446Strhodesvoid 102135446Strhodesisc_sockaddr_any(isc_sockaddr_t *sockaddr); 103170222Sdougb/*%< 104135446Strhodes * Return the IPv4 wildcard address. 105135446Strhodes */ 106135446Strhodes 107135446Strhodesvoid 108135446Strhodesisc_sockaddr_any6(isc_sockaddr_t *sockaddr); 109170222Sdougb/*%< 110135446Strhodes * Return the IPv6 wildcard address. 111135446Strhodes */ 112135446Strhodes 113135446Strhodesvoid 114135446Strhodesisc_sockaddr_anyofpf(isc_sockaddr_t *sockaddr, int family); 115170222Sdougb/*%< 116135446Strhodes * Set '*sockaddr' to the wildcard address of protocol family 117135446Strhodes * 'family'. 118135446Strhodes * 119135446Strhodes * Requires: 120170222Sdougb * \li 'family' is AF_INET or AF_INET6. 121135446Strhodes */ 122135446Strhodes 123135446Strhodesvoid 124135446Strhodesisc_sockaddr_fromin(isc_sockaddr_t *sockaddr, const struct in_addr *ina, 125135446Strhodes in_port_t port); 126170222Sdougb/*%< 127135446Strhodes * Construct an isc_sockaddr_t from an IPv4 address and port. 128135446Strhodes */ 129135446Strhodes 130135446Strhodesvoid 131135446Strhodesisc_sockaddr_fromin6(isc_sockaddr_t *sockaddr, const struct in6_addr *ina6, 132135446Strhodes in_port_t port); 133170222Sdougb/*%< 134135446Strhodes * Construct an isc_sockaddr_t from an IPv6 address and port. 135135446Strhodes */ 136135446Strhodes 137135446Strhodesvoid 138135446Strhodesisc_sockaddr_v6fromin(isc_sockaddr_t *sockaddr, const struct in_addr *ina, 139135446Strhodes in_port_t port); 140170222Sdougb/*%< 141135446Strhodes * Construct an IPv6 isc_sockaddr_t representing a mapped IPv4 address. 142135446Strhodes */ 143135446Strhodes 144135446Strhodesvoid 145135446Strhodesisc_sockaddr_fromnetaddr(isc_sockaddr_t *sockaddr, const isc_netaddr_t *na, 146135446Strhodes in_port_t port); 147170222Sdougb/*%< 148135446Strhodes * Construct an isc_sockaddr_t from an isc_netaddr_t and port. 149135446Strhodes */ 150135446Strhodes 151135446Strhodesint 152135446Strhodesisc_sockaddr_pf(const isc_sockaddr_t *sockaddr); 153170222Sdougb/*%< 154135446Strhodes * Get the protocol family of 'sockaddr'. 155135446Strhodes * 156135446Strhodes * Requires: 157135446Strhodes * 158170222Sdougb *\li 'sockaddr' is a valid sockaddr with an address family of AF_INET 159135446Strhodes * or AF_INET6. 160135446Strhodes * 161135446Strhodes * Returns: 162135446Strhodes * 163170222Sdougb *\li The protocol family of 'sockaddr', e.g. PF_INET or PF_INET6. 164135446Strhodes */ 165135446Strhodes 166135446Strhodesvoid 167135446Strhodesisc_sockaddr_setport(isc_sockaddr_t *sockaddr, in_port_t port); 168170222Sdougb/*%< 169135446Strhodes * Set the port of 'sockaddr' to 'port'. 170135446Strhodes */ 171135446Strhodes 172135446Strhodesin_port_t 173165071Sdougbisc_sockaddr_getport(const isc_sockaddr_t *sockaddr); 174170222Sdougb/*%< 175135446Strhodes * Get the port stored in 'sockaddr'. 176135446Strhodes */ 177135446Strhodes 178135446Strhodesisc_result_t 179135446Strhodesisc_sockaddr_totext(const isc_sockaddr_t *sockaddr, isc_buffer_t *target); 180170222Sdougb/*%< 181135446Strhodes * Append a text representation of 'sockaddr' to the buffer 'target'. 182135446Strhodes * The text will include both the IP address (v4 or v6) and the port. 183135446Strhodes * The text is null terminated, but the terminating null is not 184135446Strhodes * part of the buffer's used region. 185135446Strhodes * 186135446Strhodes * Returns: 187170222Sdougb * \li ISC_R_SUCCESS 188170222Sdougb * \li ISC_R_NOSPACE The text or the null termination did not fit. 189135446Strhodes */ 190135446Strhodes 191135446Strhodesvoid 192135446Strhodesisc_sockaddr_format(const isc_sockaddr_t *sa, char *array, unsigned int size); 193170222Sdougb/*%< 194135446Strhodes * Format a human-readable representation of the socket address '*sa' 195135446Strhodes * into the character array 'array', which is of size 'size'. 196135446Strhodes * The resulting string is guaranteed to be null-terminated. 197135446Strhodes */ 198135446Strhodes 199135446Strhodesisc_boolean_t 200165071Sdougbisc_sockaddr_ismulticast(const isc_sockaddr_t *sa); 201170222Sdougb/*%< 202170222Sdougb * Returns #ISC_TRUE if the address is a multicast address. 203135446Strhodes */ 204135446Strhodes 205135446Strhodesisc_boolean_t 206165071Sdougbisc_sockaddr_isexperimental(const isc_sockaddr_t *sa); 207135446Strhodes/* 208135446Strhodes * Returns ISC_TRUE if the address is a experimental (CLASS E) address. 209135446Strhodes */ 210135446Strhodes 211135446Strhodesisc_boolean_t 212165071Sdougbisc_sockaddr_islinklocal(const isc_sockaddr_t *sa); 213170222Sdougb/*%< 214193149Sdougb * Returns ISC_TRUE if the address is a link local address. 215135446Strhodes */ 216135446Strhodes 217135446Strhodesisc_boolean_t 218165071Sdougbisc_sockaddr_issitelocal(const isc_sockaddr_t *sa); 219170222Sdougb/*%< 220135446Strhodes * Returns ISC_TRUE if the address is a sitelocal address. 221135446Strhodes */ 222135446Strhodes 223170222Sdougbisc_result_t 224170222Sdougbisc_sockaddr_frompath(isc_sockaddr_t *sockaddr, const char *path); 225170222Sdougb/* 226170222Sdougb * Create a UNIX domain sockaddr that refers to path. 227170222Sdougb * 228170222Sdougb * Returns: 229170222Sdougb * \li ISC_R_NOSPACE 230170222Sdougb * \li ISC_R_NOTIMPLEMENTED 231170222Sdougb * \li ISC_R_SUCCESS 232170222Sdougb */ 233170222Sdougb 234135446Strhodes#define ISC_SOCKADDR_FORMATSIZE \ 235170222Sdougb sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:XXX.XXX.XXX.XXX%SSSSSSSSSS#YYYYY") 236170222Sdougb/*%< 237135446Strhodes * Minimum size of array to pass to isc_sockaddr_format(). 238135446Strhodes */ 239135446Strhodes 240135446StrhodesISC_LANG_ENDDECLS 241135446Strhodes 242135446Strhodes#endif /* ISC_SOCKADDR_H */ 243