1*8485SPeter.Memishian@Sun.COM /* 2*8485SPeter.Memishian@Sun.COM * CDDL HEADER START 3*8485SPeter.Memishian@Sun.COM * 4*8485SPeter.Memishian@Sun.COM * The contents of this file are subject to the terms of the 5*8485SPeter.Memishian@Sun.COM * Common Development and Distribution License (the "License"). 6*8485SPeter.Memishian@Sun.COM * You may not use this file except in compliance with the License. 7*8485SPeter.Memishian@Sun.COM * 8*8485SPeter.Memishian@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*8485SPeter.Memishian@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*8485SPeter.Memishian@Sun.COM * See the License for the specific language governing permissions 11*8485SPeter.Memishian@Sun.COM * and limitations under the License. 12*8485SPeter.Memishian@Sun.COM * 13*8485SPeter.Memishian@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*8485SPeter.Memishian@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*8485SPeter.Memishian@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*8485SPeter.Memishian@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*8485SPeter.Memishian@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*8485SPeter.Memishian@Sun.COM * 19*8485SPeter.Memishian@Sun.COM * CDDL HEADER END 20*8485SPeter.Memishian@Sun.COM */ 21*8485SPeter.Memishian@Sun.COM 22*8485SPeter.Memishian@Sun.COM /* 23*8485SPeter.Memishian@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24*8485SPeter.Memishian@Sun.COM * Use is subject to license terms. 25*8485SPeter.Memishian@Sun.COM */ 26*8485SPeter.Memishian@Sun.COM 27*8485SPeter.Memishian@Sun.COM #include <unistd.h> 28*8485SPeter.Memishian@Sun.COM #include <netinet/in.h> 29*8485SPeter.Memishian@Sun.COM #include <libinetutil.h> 30*8485SPeter.Memishian@Sun.COM 31*8485SPeter.Memishian@Sun.COM extern int getnetmaskbyaddr(const struct in_addr, struct in_addr *); 32*8485SPeter.Memishian@Sun.COM 33*8485SPeter.Memishian@Sun.COM /* 34*8485SPeter.Memishian@Sun.COM * Internet utility functions. 35*8485SPeter.Memishian@Sun.COM */ 36*8485SPeter.Memishian@Sun.COM 37*8485SPeter.Memishian@Sun.COM /* 38*8485SPeter.Memishian@Sun.COM * Given a host-order address, calculate client's default net mask. 39*8485SPeter.Memishian@Sun.COM * Consult netmasks database to see if net is further subnetted. 40*8485SPeter.Memishian@Sun.COM * We'll only snag the first netmask that matches our criteria. 41*8485SPeter.Memishian@Sun.COM * We return the resultant netmask in host order. 42*8485SPeter.Memishian@Sun.COM */ 43*8485SPeter.Memishian@Sun.COM void 44*8485SPeter.Memishian@Sun.COM get_netmask4(const struct in_addr *n_addrp, struct in_addr *s_addrp) 45*8485SPeter.Memishian@Sun.COM { 46*8485SPeter.Memishian@Sun.COM struct in_addr hp, tp; 47*8485SPeter.Memishian@Sun.COM 48*8485SPeter.Memishian@Sun.COM /* 49*8485SPeter.Memishian@Sun.COM * First check if VLSM is in use. 50*8485SPeter.Memishian@Sun.COM */ 51*8485SPeter.Memishian@Sun.COM hp.s_addr = htonl(n_addrp->s_addr); 52*8485SPeter.Memishian@Sun.COM if (getnetmaskbyaddr(hp, &tp) == 0) { 53*8485SPeter.Memishian@Sun.COM s_addrp->s_addr = ntohl(tp.s_addr); 54*8485SPeter.Memishian@Sun.COM return; 55*8485SPeter.Memishian@Sun.COM } 56*8485SPeter.Memishian@Sun.COM 57*8485SPeter.Memishian@Sun.COM /* 58*8485SPeter.Memishian@Sun.COM * Fall back on standard classed networks. 59*8485SPeter.Memishian@Sun.COM */ 60*8485SPeter.Memishian@Sun.COM if (IN_CLASSA(n_addrp->s_addr)) 61*8485SPeter.Memishian@Sun.COM s_addrp->s_addr = IN_CLASSA_NET; 62*8485SPeter.Memishian@Sun.COM else if (IN_CLASSB(n_addrp->s_addr)) 63*8485SPeter.Memishian@Sun.COM s_addrp->s_addr = IN_CLASSB_NET; 64*8485SPeter.Memishian@Sun.COM else if (IN_CLASSC(n_addrp->s_addr)) 65*8485SPeter.Memishian@Sun.COM s_addrp->s_addr = IN_CLASSC_NET; 66*8485SPeter.Memishian@Sun.COM else 67*8485SPeter.Memishian@Sun.COM s_addrp->s_addr = IN_CLASSE_NET; 68*8485SPeter.Memishian@Sun.COM } 69*8485SPeter.Memishian@Sun.COM 70*8485SPeter.Memishian@Sun.COM /* 71*8485SPeter.Memishian@Sun.COM * Checks if the IP addresses `ssp1' and `ssp2' are equal. 72*8485SPeter.Memishian@Sun.COM */ 73*8485SPeter.Memishian@Sun.COM boolean_t 74*8485SPeter.Memishian@Sun.COM sockaddrcmp(const struct sockaddr_storage *ssp1, 75*8485SPeter.Memishian@Sun.COM const struct sockaddr_storage *ssp2) 76*8485SPeter.Memishian@Sun.COM { 77*8485SPeter.Memishian@Sun.COM struct in_addr addr1, addr2; 78*8485SPeter.Memishian@Sun.COM const struct in6_addr *addr6p1, *addr6p2; 79*8485SPeter.Memishian@Sun.COM 80*8485SPeter.Memishian@Sun.COM if (ssp1->ss_family != ssp2->ss_family) 81*8485SPeter.Memishian@Sun.COM return (B_FALSE); 82*8485SPeter.Memishian@Sun.COM 83*8485SPeter.Memishian@Sun.COM if (ssp1 == ssp2) 84*8485SPeter.Memishian@Sun.COM return (B_TRUE); 85*8485SPeter.Memishian@Sun.COM 86*8485SPeter.Memishian@Sun.COM switch (ssp1->ss_family) { 87*8485SPeter.Memishian@Sun.COM case AF_INET: 88*8485SPeter.Memishian@Sun.COM addr1 = ((const struct sockaddr_in *)ssp1)->sin_addr; 89*8485SPeter.Memishian@Sun.COM addr2 = ((const struct sockaddr_in *)ssp2)->sin_addr; 90*8485SPeter.Memishian@Sun.COM return (addr1.s_addr == addr2.s_addr); 91*8485SPeter.Memishian@Sun.COM case AF_INET6: 92*8485SPeter.Memishian@Sun.COM addr6p1 = &((const struct sockaddr_in6 *)ssp1)->sin6_addr; 93*8485SPeter.Memishian@Sun.COM addr6p2 = &((const struct sockaddr_in6 *)ssp2)->sin6_addr; 94*8485SPeter.Memishian@Sun.COM return (IN6_ARE_ADDR_EQUAL(addr6p1, addr6p2)); 95*8485SPeter.Memishian@Sun.COM } 96*8485SPeter.Memishian@Sun.COM return (B_FALSE); 97*8485SPeter.Memishian@Sun.COM } 98