1*00b67f09SDavid van Moolenbroek /* $NetBSD: netaddr_multicast.c,v 1.4 2014/12/10 04:37:53 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek * Copyright (C) 2000, 2001 Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek *
7*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek *
11*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek */
19*00b67f09SDavid van Moolenbroek
20*00b67f09SDavid van Moolenbroek /* Id: netaddr_multicast.c,v 1.12 2007/06/19 23:47:00 tbox Exp */
21*00b67f09SDavid van Moolenbroek
22*00b67f09SDavid van Moolenbroek #include <config.h>
23*00b67f09SDavid van Moolenbroek
24*00b67f09SDavid van Moolenbroek #include <stdlib.h>
25*00b67f09SDavid van Moolenbroek #include <stdio.h>
26*00b67f09SDavid van Moolenbroek
27*00b67f09SDavid van Moolenbroek #include <isc/net.h>
28*00b67f09SDavid van Moolenbroek #include <isc/netaddr.h>
29*00b67f09SDavid van Moolenbroek #include <isc/string.h>
30*00b67f09SDavid van Moolenbroek #include <isc/types.h>
31*00b67f09SDavid van Moolenbroek #include <isc/util.h>
32*00b67f09SDavid van Moolenbroek
33*00b67f09SDavid van Moolenbroek #include "driver.h"
34*00b67f09SDavid van Moolenbroek
35*00b67f09SDavid van Moolenbroek TESTDECL(netaddr_multicast);
36*00b67f09SDavid van Moolenbroek
37*00b67f09SDavid van Moolenbroek typedef struct {
38*00b67f09SDavid van Moolenbroek int family;
39*00b67f09SDavid van Moolenbroek const char *addr;
40*00b67f09SDavid van Moolenbroek isc_boolean_t is_multicast;
41*00b67f09SDavid van Moolenbroek } t_addr_t;
42*00b67f09SDavid van Moolenbroek
43*00b67f09SDavid van Moolenbroek static t_addr_t addrs[] = {
44*00b67f09SDavid van Moolenbroek { AF_INET, "1.2.3.4", ISC_FALSE },
45*00b67f09SDavid van Moolenbroek { AF_INET, "4.3.2.1", ISC_FALSE },
46*00b67f09SDavid van Moolenbroek { AF_INET, "224.1.1.1", ISC_TRUE },
47*00b67f09SDavid van Moolenbroek { AF_INET, "1.1.1.244", ISC_FALSE },
48*00b67f09SDavid van Moolenbroek { AF_INET6, "::1", ISC_FALSE },
49*00b67f09SDavid van Moolenbroek { AF_INET6, "ff02::1", ISC_TRUE }
50*00b67f09SDavid van Moolenbroek };
51*00b67f09SDavid van Moolenbroek #define NADDRS (sizeof(addrs) / sizeof(t_addr_t))
52*00b67f09SDavid van Moolenbroek
53*00b67f09SDavid van Moolenbroek static isc_result_t to_netaddr(t_addr_t *, isc_netaddr_t *);
54*00b67f09SDavid van Moolenbroek
55*00b67f09SDavid van Moolenbroek static isc_result_t
to_netaddr(t_addr_t * addr,isc_netaddr_t * na)56*00b67f09SDavid van Moolenbroek to_netaddr(t_addr_t *addr, isc_netaddr_t *na) {
57*00b67f09SDavid van Moolenbroek int r;
58*00b67f09SDavid van Moolenbroek struct in_addr in;
59*00b67f09SDavid van Moolenbroek struct in6_addr in6;
60*00b67f09SDavid van Moolenbroek
61*00b67f09SDavid van Moolenbroek switch (addr->family) {
62*00b67f09SDavid van Moolenbroek case AF_INET:
63*00b67f09SDavid van Moolenbroek r = inet_pton(AF_INET, addr->addr, (unsigned char *)&in);
64*00b67f09SDavid van Moolenbroek if (r != 1)
65*00b67f09SDavid van Moolenbroek return (ISC_R_FAILURE);
66*00b67f09SDavid van Moolenbroek isc_netaddr_fromin(na, &in);
67*00b67f09SDavid van Moolenbroek break;
68*00b67f09SDavid van Moolenbroek case AF_INET6:
69*00b67f09SDavid van Moolenbroek r = inet_pton(AF_INET6, addr->addr, (unsigned char *)&in6);
70*00b67f09SDavid van Moolenbroek if (r != 1)
71*00b67f09SDavid van Moolenbroek return (ISC_R_FAILURE);
72*00b67f09SDavid van Moolenbroek isc_netaddr_fromin6(na, &in6);
73*00b67f09SDavid van Moolenbroek break;
74*00b67f09SDavid van Moolenbroek default:
75*00b67f09SDavid van Moolenbroek return (ISC_R_UNEXPECTED);
76*00b67f09SDavid van Moolenbroek }
77*00b67f09SDavid van Moolenbroek
78*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
79*00b67f09SDavid van Moolenbroek }
80*00b67f09SDavid van Moolenbroek
81*00b67f09SDavid van Moolenbroek test_result_t
netaddr_multicast(void)82*00b67f09SDavid van Moolenbroek netaddr_multicast(void) {
83*00b67f09SDavid van Moolenbroek isc_netaddr_t na;
84*00b67f09SDavid van Moolenbroek unsigned int n_fail;
85*00b67f09SDavid van Moolenbroek t_addr_t *addr;
86*00b67f09SDavid van Moolenbroek unsigned int i;
87*00b67f09SDavid van Moolenbroek isc_result_t result;
88*00b67f09SDavid van Moolenbroek isc_boolean_t tf;
89*00b67f09SDavid van Moolenbroek
90*00b67f09SDavid van Moolenbroek n_fail = 0;
91*00b67f09SDavid van Moolenbroek for (i = 0; i < NADDRS; i++) {
92*00b67f09SDavid van Moolenbroek addr = &addrs[i];
93*00b67f09SDavid van Moolenbroek result = to_netaddr(addr, &na);
94*00b67f09SDavid van Moolenbroek if (result != ISC_R_SUCCESS) {
95*00b67f09SDavid van Moolenbroek printf("I:to_netaddr() returned %s on item %u\n",
96*00b67f09SDavid van Moolenbroek isc_result_totext(result), i);
97*00b67f09SDavid van Moolenbroek return (UNKNOWN);
98*00b67f09SDavid van Moolenbroek }
99*00b67f09SDavid van Moolenbroek tf = isc_netaddr_ismulticast(&na);
100*00b67f09SDavid van Moolenbroek if (tf == addr->is_multicast) {
101*00b67f09SDavid van Moolenbroek printf("I:%s is%s multicast (PASSED)\n",
102*00b67f09SDavid van Moolenbroek (addr->addr), (tf ? "" : " not"));
103*00b67f09SDavid van Moolenbroek } else {
104*00b67f09SDavid van Moolenbroek printf("I:%s is%s multicast (FAILED)\n",
105*00b67f09SDavid van Moolenbroek (addr->addr), (tf ? "" : " not"));
106*00b67f09SDavid van Moolenbroek n_fail++;
107*00b67f09SDavid van Moolenbroek }
108*00b67f09SDavid van Moolenbroek }
109*00b67f09SDavid van Moolenbroek
110*00b67f09SDavid van Moolenbroek if (n_fail > 0)
111*00b67f09SDavid van Moolenbroek return (FAILED);
112*00b67f09SDavid van Moolenbroek
113*00b67f09SDavid van Moolenbroek return (PASSED);
114*00b67f09SDavid van Moolenbroek }
115