19015Ssam #ifndef lint 2*17569Skarels static char sccsid[] = "@(#)if.c 4.4 (Berkeley) 12/20/84"; 39015Ssam #endif 49015Ssam 59015Ssam /* 69015Ssam * Routing Table Management Daemon 79015Ssam */ 810245Ssam #include "defs.h" 99015Ssam 109015Ssam extern struct interface *ifnet; 119015Ssam 129015Ssam /* 13*17569Skarels * Find the interface with address addr. 149015Ssam */ 159015Ssam struct interface * 169015Ssam if_ifwithaddr(addr) 179015Ssam struct sockaddr *addr; 189015Ssam { 199015Ssam register struct interface *ifp; 209015Ssam 219015Ssam #define same(a1, a2) \ 229015Ssam (bcmp((caddr_t)((a1)->sa_data), (caddr_t)((a2)->sa_data), 14) == 0) 239015Ssam for (ifp = ifnet; ifp; ifp = ifp->int_next) { 249015Ssam if (ifp->int_flags & IFF_REMOTE) 259015Ssam continue; 269015Ssam if (ifp->int_addr.sa_family != addr->sa_family) 279015Ssam continue; 289015Ssam if (same(&ifp->int_addr, addr)) 299015Ssam break; 309015Ssam if ((ifp->int_flags & IFF_BROADCAST) && 319015Ssam same(&ifp->int_broadaddr, addr)) 329015Ssam break; 339015Ssam } 349015Ssam return (ifp); 359015Ssam } 369015Ssam 379015Ssam /* 38*17569Skarels * Find the point-to-point interface with destination address addr. 39*17569Skarels */ 40*17569Skarels struct interface * 41*17569Skarels if_ifwithdstaddr(addr) 42*17569Skarels struct sockaddr *addr; 43*17569Skarels { 44*17569Skarels register struct interface *ifp; 45*17569Skarels 46*17569Skarels for (ifp = ifnet; ifp; ifp = ifp->int_next) { 47*17569Skarels if ((ifp->int_flags & IFF_POINTOPOINT) == 0) 48*17569Skarels continue; 49*17569Skarels if (same(&ifp->int_dstaddr, addr)) 50*17569Skarels break; 51*17569Skarels } 52*17569Skarels return (ifp); 53*17569Skarels } 54*17569Skarels 55*17569Skarels /* 569015Ssam * Find the interface on the network 579015Ssam * of the specified address. 589015Ssam */ 599015Ssam struct interface * 609015Ssam if_ifwithnet(addr) 619015Ssam register struct sockaddr *addr; 629015Ssam { 639015Ssam register struct interface *ifp; 649015Ssam register int af = addr->sa_family; 659015Ssam register int (*netmatch)(); 669015Ssam 679015Ssam if (af >= AF_MAX) 689015Ssam return (0); 699015Ssam netmatch = afswitch[af].af_netmatch; 709015Ssam for (ifp = ifnet; ifp; ifp = ifp->int_next) { 719015Ssam if (ifp->int_flags & IFF_REMOTE) 729015Ssam continue; 739015Ssam if (af != ifp->int_addr.sa_family) 749015Ssam continue; 759015Ssam if ((*netmatch)(addr, &ifp->int_addr)) 769015Ssam break; 779015Ssam } 789015Ssam return (ifp); 799015Ssam } 809015Ssam 819015Ssam /* 829015Ssam * Find an interface from which the specified address 839015Ssam * should have come from. Used for figuring out which 849015Ssam * interface a packet came in on -- for tracing. 859015Ssam */ 869015Ssam struct interface * 879015Ssam if_iflookup(addr) 889015Ssam struct sockaddr *addr; 899015Ssam { 909015Ssam register struct interface *ifp, *maybe; 919015Ssam register int af = addr->sa_family; 929015Ssam register int (*netmatch)(); 939015Ssam 949015Ssam if (af >= AF_MAX) 959015Ssam return (0); 969015Ssam maybe = 0; 979015Ssam netmatch = afswitch[af].af_netmatch; 989015Ssam for (ifp = ifnet; ifp; ifp = ifp->int_next) { 999015Ssam if (ifp->int_addr.sa_family != af) 1009015Ssam continue; 1019015Ssam if (same(&ifp->int_addr, addr)) 1029015Ssam break; 1039015Ssam if ((ifp->int_flags & IFF_BROADCAST) && 1049015Ssam same(&ifp->int_broadaddr, addr)) 1059015Ssam break; 1069015Ssam if (maybe == 0 && (*netmatch)(addr, &ifp->int_addr)) 1079015Ssam maybe = ifp; 1089015Ssam } 1099015Ssam if (ifp == 0) 1109015Ssam ifp = maybe; 1119015Ssam return (ifp); 1129015Ssam } 113