xref: /minix3/external/bsd/bind/dist/bin/tests/net/netaddr_multicast.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
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