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