|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that this notice is preserved and that due credit is given ! 7: * to the University of California at Berkeley. The name of the University ! 8: * may not be used to endorse or promote products derived from this ! 9: * software without specific prior written permission. This software ! 10: * is provided ``as is'' without express or implied warranty. ! 11: */ ! 12: ! 13: #ifndef lint ! 14: static char sccsid[] = "@(#)if.c 5.4 (Berkeley) 2/16/88"; ! 15: #endif /* not lint */ ! 16: ! 17: /* ! 18: * Routing Table Management Daemon ! 19: */ ! 20: #include "defs.h" ! 21: ! 22: extern struct interface *ifnet; ! 23: ! 24: /* ! 25: * Find the interface with address addr. ! 26: */ ! 27: struct interface * ! 28: if_ifwithaddr(addr) ! 29: struct sockaddr *addr; ! 30: { ! 31: register struct interface *ifp; ! 32: ! 33: #define same(a1, a2) \ ! 34: (bcmp((caddr_t)((a1)->sa_data), (caddr_t)((a2)->sa_data), 14) == 0) ! 35: for (ifp = ifnet; ifp; ifp = ifp->int_next) { ! 36: if (ifp->int_flags & IFF_REMOTE) ! 37: continue; ! 38: if (ifp->int_addr.sa_family != addr->sa_family) ! 39: continue; ! 40: if (same(&ifp->int_addr, addr)) ! 41: break; ! 42: if ((ifp->int_flags & IFF_BROADCAST) && ! 43: same(&ifp->int_broadaddr, addr)) ! 44: break; ! 45: } ! 46: return (ifp); ! 47: } ! 48: ! 49: /* ! 50: * Find the point-to-point interface with destination address addr. ! 51: */ ! 52: struct interface * ! 53: if_ifwithdstaddr(addr) ! 54: struct sockaddr *addr; ! 55: { ! 56: register struct interface *ifp; ! 57: ! 58: for (ifp = ifnet; ifp; ifp = ifp->int_next) { ! 59: if ((ifp->int_flags & IFF_POINTOPOINT) == 0) ! 60: continue; ! 61: if (same(&ifp->int_dstaddr, addr)) ! 62: break; ! 63: } ! 64: return (ifp); ! 65: } ! 66: ! 67: /* ! 68: * Find the interface on the network ! 69: * of the specified address. ! 70: */ ! 71: struct interface * ! 72: if_ifwithnet(addr) ! 73: register struct sockaddr *addr; ! 74: { ! 75: register struct interface *ifp; ! 76: register int af = addr->sa_family; ! 77: register int (*netmatch)(); ! 78: ! 79: if (af >= af_max) ! 80: return (0); ! 81: netmatch = afswitch[af].af_netmatch; ! 82: for (ifp = ifnet; ifp; ifp = ifp->int_next) { ! 83: if (ifp->int_flags & IFF_REMOTE) ! 84: continue; ! 85: if (af != ifp->int_addr.sa_family) ! 86: continue; ! 87: if ((*netmatch)(addr, &ifp->int_addr)) ! 88: break; ! 89: } ! 90: return (ifp); ! 91: } ! 92: ! 93: /* ! 94: * Find an interface from which the specified address ! 95: * should have come from. Used for figuring out which ! 96: * interface a packet came in on -- for tracing. ! 97: */ ! 98: struct interface * ! 99: if_iflookup(addr) ! 100: struct sockaddr *addr; ! 101: { ! 102: register struct interface *ifp, *maybe; ! 103: register int af = addr->sa_family; ! 104: register int (*netmatch)(); ! 105: ! 106: if (af >= af_max) ! 107: return (0); ! 108: maybe = 0; ! 109: netmatch = afswitch[af].af_netmatch; ! 110: for (ifp = ifnet; ifp; ifp = ifp->int_next) { ! 111: if (ifp->int_addr.sa_family != af) ! 112: continue; ! 113: if (same(&ifp->int_addr, addr)) ! 114: break; ! 115: if ((ifp->int_flags & IFF_BROADCAST) && ! 116: same(&ifp->int_broadaddr, addr)) ! 117: break; ! 118: if ((ifp->int_flags & IFF_POINTOPOINT) && ! 119: same(&ifp->int_dstaddr, addr)) ! 120: break; ! 121: if (maybe == 0 && (*netmatch)(addr, &ifp->int_addr)) ! 122: maybe = ifp; ! 123: } ! 124: if (ifp == 0) ! 125: ifp = maybe; ! 126: return (ifp); ! 127: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.