Commit 79a6a331 authored by Mark Andrews's avatar Mark Andrews
Browse files

1246. [func] New functions isc_sockaddr_issitelocal(),

                        isc_sockaddr_islinklocal(), isc_netaddr_issitelocal()
                        and isc_netaddr_islinklocal().
parent 5d26560e
1246. [func] New functions isc_sockaddr_issitelocal(),
isc_sockaddr_islinklocal(), isc_netaddr_issitelocal()
and isc_netaddr_islinklocal().
1245. [bug] Treat ENOBUFS, ENOMEM and ENFILE as soft errors for
accept().
......
......@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: ipv6.h,v 1.18 2001/11/19 03:08:24 mayer Exp $ */
/* $Id: ipv6.h,v 1.19 2002/04/03 06:38:33 marka Exp $ */
#ifndef ISC_IPV6_H
#define ISC_IPV6_H 1
......@@ -137,4 +137,12 @@ struct sockaddr_in6 {
#define IN6_IS_ADDR_MULTICAST(a) \
((a)->s6_addr8[0] == 0xffU)
/*
* Unicast link / site local.
*/
#define IN6_IS_ADDR_LINKLOCAL(a) \
(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
#define IN6_IS_ADDR_SITELOCAL(a) \
(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
#endif /* ISC_IPV6_H */
......@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: netaddr.h,v 1.20 2002/02/20 03:35:36 marka Exp $ */
/* $Id: netaddr.h,v 1.21 2002/04/03 06:38:35 marka Exp $ */
#ifndef ISC_NETADDR_H
#define ISC_NETADDR_H 1
......@@ -109,7 +109,19 @@ isc_netaddr_any6(isc_netaddr_t *netaddr);
isc_boolean_t
isc_netaddr_ismulticast(isc_netaddr_t *na);
/*
* Returns ISC_TRUE if the address is a multicast address
* Returns ISC_TRUE if the address is a multicast address.
*/
isc_boolean_t
isc_netaddr_islinklocal(isc_netaddr_t *na);
/*
* Returns ISC_TRUE if the address is a link local address.
*/
isc_boolean_t
isc_netaddr_issitelocal(isc_netaddr_t *na);
/*
* Returns ISC_TRUE if the address is a site local address.
*/
void
......
......@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: sockaddr.h,v 1.38 2002/02/20 03:35:38 marka Exp $ */
/* $Id: sockaddr.h,v 1.39 2002/04/03 06:38:36 marka Exp $ */
#ifndef ISC_SOCKADDR_H
#define ISC_SOCKADDR_H 1
......@@ -170,7 +170,19 @@ isc_sockaddr_format(const isc_sockaddr_t *sa, char *array, unsigned int size);
isc_boolean_t
isc_sockaddr_ismulticast(isc_sockaddr_t *sa);
/*
* Returns ISC_TRUE if the address is a multicast address
* Returns ISC_TRUE if the address is a multicast address.
*/
isc_boolean_t
isc_sockaddr_islinklocal(isc_sockaddr_t *sa);
/*
* Returns ISC_TRUE if the address is a link local addresss.
*/
isc_boolean_t
isc_sockaddr_issitelocal(isc_sockaddr_t *sa);
/*
* Returns ISC_TRUE if the address is a sitelocal address.
*/
#define ISC_SOCKADDR_FORMATSIZE \
......
......@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: netaddr.c,v 1.21 2002/02/20 03:35:27 marka Exp $ */
/* $Id: netaddr.c,v 1.22 2002/04/03 06:38:31 marka Exp $ */
#include <config.h>
......@@ -258,6 +258,30 @@ isc_netaddr_ismulticast(isc_netaddr_t *na) {
}
}
isc_boolean_t
isc_netaddr_islinklocal(isc_netaddr_t *na) {
switch (na->family) {
case AF_INET:
return (ISC_FALSE);
case AF_INET6:
return (ISC_TF(IN6_IS_ADDR_LINKLOCAL(&na->type.in6)));
default:
return (ISC_FALSE);
}
}
isc_boolean_t
isc_netaddr_issitelocal(isc_netaddr_t *na) {
switch (na->family) {
case AF_INET:
return (ISC_FALSE);
case AF_INET6:
return (ISC_TF(IN6_IS_ADDR_SITELOCAL(&na->type.in6)));
default:
return (ISC_FALSE);
}
}
void
isc_netaddr_fromv4mapped(isc_netaddr_t *t, const isc_netaddr_t *s) {
isc_netaddr_t *src;
......
......@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: sockaddr.c,v 1.53 2002/02/20 03:35:29 marka Exp $ */
/* $Id: sockaddr.c,v 1.54 2002/04/03 06:38:32 marka Exp $ */
#include <config.h>
......@@ -426,3 +426,25 @@ isc_sockaddr_ismulticast(isc_sockaddr_t *sockaddr) {
isc_netaddr_fromsockaddr(&netaddr, sockaddr);
return (isc_netaddr_ismulticast(&netaddr));
}
isc_boolean_t
isc_sockaddr_issitelocal(isc_sockaddr_t *sockaddr) {
isc_netaddr_t netaddr;
if (sockaddr->type.sa.sa_family == AF_INET6) {
isc_netaddr_fromsockaddr(&netaddr, sockaddr);
return (isc_netaddr_issitelocal(&netaddr));
}
return (ISC_FALSE);
}
isc_boolean_t
isc_sockaddr_islinklocal(isc_sockaddr_t *sockaddr) {
isc_netaddr_t netaddr;
if (sockaddr->type.sa.sa_family == AF_INET6) {
isc_netaddr_fromsockaddr(&netaddr, sockaddr);
return (isc_netaddr_islinklocal(&netaddr));
}
return (ISC_FALSE);
}
......@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: net.h,v 1.33 2001/11/21 13:06:20 marka Exp $ */
/* $Id: net.h,v 1.34 2002/04/03 06:38:38 marka Exp $ */
#ifndef ISC_NET_H
#define ISC_NET_H 1
......@@ -137,6 +137,17 @@
#define IN6_IS_ADDR_MULTICAST(a) ((a)->s6_addr[0] == 0xff)
#endif
#ifndef IN6_IS_ADDR_LINKLOCAL
#define IN6_IS_ADDR_LINKLOCAL(a) \
(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
#endif
#ifndef IN6_IS_ADDR_SITELOCAL
#define IN6_IS_ADDR_SITELOCAL(a) \
(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
#endif
#ifndef IN6_IS_ADDR_LOOPBACK
#define IN6_IS_ADDR_LOOPBACK(x) \
(memcmp((x)->s6_addr, in6addr_loopback.s6_addr, 16) == 0)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment