1 /* 2 * Copyright (c) 1983, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by the University of 16 * California, Berkeley and its contributors. 17 * 4. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34 #ifndef lint 35 /*static char sccsid[] = "from: @(#)if.c 8.1 (Berkeley) 6/5/93";*/ 36 static char *rcsid = "$Id: if.c,v 1.6 1994/09/23 23:49:23 mycroft Exp $"; 37 #endif /* not lint */ 38 39 /* 40 * Routing Table Management Daemon 41 */ 42 #include "defs.h" 43 44 extern struct interface *ifnet; 45 46 /* 47 * Find the interface with address addr. 48 */ 49 struct interface * 50 if_ifwithaddr(addr) 51 struct sockaddr *addr; 52 { 53 register struct interface *ifp; 54 55 #define same(a1, a2) \ 56 (memcmp((a1)->sa_data, (a2)->sa_data, 14) == 0) 57 for (ifp = ifnet; ifp; ifp = ifp->int_next) { 58 if (ifp->int_flags & IFF_REMOTE) 59 continue; 60 if (ifp->int_addr.sa_family != addr->sa_family) 61 continue; 62 if (same(&ifp->int_addr, addr)) 63 break; 64 if ((ifp->int_flags & IFF_BROADCAST) && 65 same(&ifp->int_broadaddr, addr)) 66 break; 67 } 68 return (ifp); 69 } 70 71 /* 72 * Find the point-to-point interface with destination address addr. 73 */ 74 struct interface * 75 if_ifwithdstaddr(addr) 76 struct sockaddr *addr; 77 { 78 register struct interface *ifp; 79 80 for (ifp = ifnet; ifp; ifp = ifp->int_next) { 81 if ((ifp->int_flags & IFF_POINTOPOINT) == 0) 82 continue; 83 if (same(&ifp->int_dstaddr, addr)) 84 break; 85 } 86 return (ifp); 87 } 88 89 /* 90 * Find the interface on the network 91 * of the specified address. 92 */ 93 struct interface * 94 if_ifwithnet(addr) 95 register struct sockaddr *addr; 96 { 97 register struct interface *ifp; 98 register int af = addr->sa_family; 99 register int (*netmatch)(); 100 101 if (af >= af_max) 102 return (0); 103 netmatch = afswitch[af].af_netmatch; 104 for (ifp = ifnet; ifp; ifp = ifp->int_next) { 105 if (ifp->int_flags & IFF_REMOTE) 106 continue; 107 if (af != ifp->int_addr.sa_family) 108 continue; 109 if ((*netmatch)(addr, &ifp->int_addr)) 110 break; 111 } 112 return (ifp); 113 } 114 115 /* 116 * Find an interface from which the specified address 117 * should have come from. Used for figuring out which 118 * interface a packet came in on -- for tracing. 119 */ 120 struct interface * 121 if_iflookup(addr) 122 struct sockaddr *addr; 123 { 124 register struct interface *ifp, *maybe; 125 register int af = addr->sa_family; 126 register int (*netmatch)(); 127 128 if (af >= af_max) 129 return (0); 130 maybe = 0; 131 netmatch = afswitch[af].af_netmatch; 132 for (ifp = ifnet; ifp; ifp = ifp->int_next) { 133 if (ifp->int_addr.sa_family != af) 134 continue; 135 if (same(&ifp->int_addr, addr)) 136 break; 137 if ((ifp->int_flags & IFF_BROADCAST) && 138 same(&ifp->int_broadaddr, addr)) 139 break; 140 if ((ifp->int_flags & IFF_POINTOPOINT) && 141 same(&ifp->int_dstaddr, addr)) 142 break; 143 if (maybe == 0 && (*netmatch)(addr, &ifp->int_addr)) 144 maybe = ifp; 145 } 146 if (ifp == 0) 147 ifp = maybe; 148 return (ifp); 149 } 150