From d80da258e377f02f0dcd703b89a1044cc58e949f Mon Sep 17 00:00:00 2001 From: Michael Graff Date: Thu, 15 Jun 2000 18:23:54 +0000 Subject: [PATCH] Add isc_netaddr_ismulticast() and isc_sockaddr_ismulticast() --- lib/isc/include/isc/ipv6.h | 6 ++++++ lib/isc/include/isc/netaddr.h | 6 ++++++ lib/isc/include/isc/sockaddr.h | 6 ++++++ lib/isc/netaddr.c | 16 ++++++++++++++-- lib/isc/sockaddr.c | 8 ++++++++ lib/isc/unix/include/isc/net.h | 13 +++++++++++++ 6 files changed, 53 insertions(+), 2 deletions(-) diff --git a/lib/isc/include/isc/ipv6.h b/lib/isc/include/isc/ipv6.h index 3b3e5fe588..e2f73ca5d1 100644 --- a/lib/isc/include/isc/ipv6.h +++ b/lib/isc/include/isc/ipv6.h @@ -123,4 +123,10 @@ struct sockaddr_in6 { ((a)->s6_addr32[1] == 0) && \ ((a)->s6_addr32[2] == htonl(0x0000ffff))) +/* + * Multicast + */ +#define IN6_IS_ADDR_MULTICAST(a) \ + ((a)->s6_addr8[0] == 0xffU) + #endif /* ISC_IPV6_H */ diff --git a/lib/isc/include/isc/netaddr.h b/lib/isc/include/isc/netaddr.h index f6e569e34b..f01b56d5e7 100644 --- a/lib/isc/include/isc/netaddr.h +++ b/lib/isc/include/isc/netaddr.h @@ -92,6 +92,12 @@ isc_netaddr_fromin(isc_netaddr_t *netaddr, const struct in_addr *ina); void isc_netaddr_fromin6(isc_netaddr_t *netaddr, const struct in6_addr *ina6); +isc_boolean_t +isc_netaddr_ismulticast(isc_netaddr_t *na); +/* + * Returns ISC_TRUE if the address is a multicast address + */ + ISC_LANG_ENDDECLS #endif /* ISC_NETADDR_H */ diff --git a/lib/isc/include/isc/sockaddr.h b/lib/isc/include/isc/sockaddr.h index 781259ae3b..20608dbfbe 100644 --- a/lib/isc/include/isc/sockaddr.h +++ b/lib/isc/include/isc/sockaddr.h @@ -119,6 +119,12 @@ isc_sockaddr_format(isc_sockaddr_t *sa, char *array, unsigned int size); * The resulting string is guaranteed to be null-terminated. */ +isc_boolean_t +isc_sockaddr_ismulticast(isc_sockaddr_t *sa); +/* + * Returns ISC_TRUE if the address is a multicast address + */ + #define ISC_SOCKADDR_FORMATSIZE \ sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:XXX.XXX.XXX.XXX#YYYYY") /* diff --git a/lib/isc/netaddr.c b/lib/isc/netaddr.c index 0029f72608..49a37653f9 100644 --- a/lib/isc/netaddr.c +++ b/lib/isc/netaddr.c @@ -212,8 +212,7 @@ isc_netaddr_fromin6(isc_netaddr_t *netaddr, const struct in6_addr *ina6) { } void -isc_netaddr_fromsockaddr(isc_netaddr_t *t, const isc_sockaddr_t *s) -{ +isc_netaddr_fromsockaddr(isc_netaddr_t *t, const isc_sockaddr_t *s) { int family = s->type.sa.sa_family; t->family = family; switch (family) { @@ -228,3 +227,16 @@ isc_netaddr_fromsockaddr(isc_netaddr_t *t, const isc_sockaddr_t *s) } } +isc_boolean_t +isc_netaddr_ismulticast(isc_netaddr_t *na) { + switch (na->family) { + case AF_INET: + return (ISC_TF(ISC_IPADDR_ISMULTICAST(na->type.in.s_addr))); + break; + case AF_INET6: + return (ISC_TF(IN6_IS_ADDR_MULTICAST(&na->type.in6))); + break; + default: + return (ISC_FALSE); /* XXXMLG ? */ + } +} diff --git a/lib/isc/sockaddr.c b/lib/isc/sockaddr.c index 31bd4399d8..05b5903519 100644 --- a/lib/isc/sockaddr.c +++ b/lib/isc/sockaddr.c @@ -378,3 +378,11 @@ isc_sockaddr_getport(isc_sockaddr_t *sockaddr) { return (port); } + +isc_boolean_t +isc_sockaddr_ismulticast(isc_sockaddr_t *sockaddr) { + isc_netaddr_t netaddr; + + isc_netaddr_fromsockaddr(&netaddr, sockaddr); + return (isc_netaddr_ismulticast(&netaddr)); +} diff --git a/lib/isc/unix/include/isc/net.h b/lib/isc/unix/include/isc/net.h index 710e3ea132..8d4c25f9f1 100644 --- a/lib/isc/unix/include/isc/net.h +++ b/lib/isc/unix/include/isc/net.h @@ -45,6 +45,9 @@ * It ensures that INADDR_ANY, IN6ADDR_ANY_INIT, in6addr_any, and * in6addr_loopback are available. * + * It ensures that IN_MULTICAST() is available to check for multicast + * addresses. + * * MP: * No impact. * @@ -125,6 +128,16 @@ typedef isc_uint16_t in_port_t; #define ISC_PLATFORM_RECVOVERFLOW #endif +#define ISC__IPADDR(x) ((isc_uint32_t)htonl((isc_uint32_t)(x))) + +#ifdef IN_MULTICAST +#define ISC_IPADDR_ISMULTICAST(i) IN_MULTICAST(i) +#else +#define ISC_IPADDR_ISMULTICAST(i) \ + (((isc_uint32_t)(i) & ISC__IPADDR(0xf0000000)) \ + == ISC__IPADDR(0xe0000000)) +#endif + /*** *** Functions. ***/