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