121993Sdist /* 221993Sdist * Copyright (c) 1983 Regents of the University of California. 321993Sdist * All rights reserved. The Berkeley software License Agreement 421993Sdist * specifies the terms and conditions for redistribution. 521993Sdist */ 621993Sdist 79015Ssam #ifndef lint 8*26340Skarels static char sccsid[] = "@(#)if.c 5.2 (Berkeley) 02/23/86"; 921993Sdist #endif not lint 109015Ssam 119015Ssam /* 129015Ssam * Routing Table Management Daemon 139015Ssam */ 1410245Ssam #include "defs.h" 159015Ssam 169015Ssam extern struct interface *ifnet; 179015Ssam 189015Ssam /* 1917569Skarels * Find the interface with address addr. 209015Ssam */ 219015Ssam struct interface * 229015Ssam if_ifwithaddr(addr) 239015Ssam struct sockaddr *addr; 249015Ssam { 259015Ssam register struct interface *ifp; 269015Ssam 279015Ssam #define same(a1, a2) \ 289015Ssam (bcmp((caddr_t)((a1)->sa_data), (caddr_t)((a2)->sa_data), 14) == 0) 299015Ssam for (ifp = ifnet; ifp; ifp = ifp->int_next) { 309015Ssam if (ifp->int_flags & IFF_REMOTE) 319015Ssam continue; 329015Ssam if (ifp->int_addr.sa_family != addr->sa_family) 339015Ssam continue; 349015Ssam if (same(&ifp->int_addr, addr)) 359015Ssam break; 369015Ssam if ((ifp->int_flags & IFF_BROADCAST) && 379015Ssam same(&ifp->int_broadaddr, addr)) 389015Ssam break; 399015Ssam } 409015Ssam return (ifp); 419015Ssam } 429015Ssam 439015Ssam /* 4417569Skarels * Find the point-to-point interface with destination address addr. 4517569Skarels */ 4617569Skarels struct interface * 4717569Skarels if_ifwithdstaddr(addr) 4817569Skarels struct sockaddr *addr; 4917569Skarels { 5017569Skarels register struct interface *ifp; 5117569Skarels 5217569Skarels for (ifp = ifnet; ifp; ifp = ifp->int_next) { 5317569Skarels if ((ifp->int_flags & IFF_POINTOPOINT) == 0) 5417569Skarels continue; 5517569Skarels if (same(&ifp->int_dstaddr, addr)) 5617569Skarels break; 5717569Skarels } 5817569Skarels return (ifp); 5917569Skarels } 6017569Skarels 6117569Skarels /* 629015Ssam * Find the interface on the network 639015Ssam * of the specified address. 649015Ssam */ 659015Ssam struct interface * 669015Ssam if_ifwithnet(addr) 679015Ssam register struct sockaddr *addr; 689015Ssam { 699015Ssam register struct interface *ifp; 709015Ssam register int af = addr->sa_family; 719015Ssam register int (*netmatch)(); 729015Ssam 73*26340Skarels if (af >= af_max) 749015Ssam return (0); 759015Ssam netmatch = afswitch[af].af_netmatch; 769015Ssam for (ifp = ifnet; ifp; ifp = ifp->int_next) { 779015Ssam if (ifp->int_flags & IFF_REMOTE) 789015Ssam continue; 799015Ssam if (af != ifp->int_addr.sa_family) 809015Ssam continue; 819015Ssam if ((*netmatch)(addr, &ifp->int_addr)) 829015Ssam break; 839015Ssam } 849015Ssam return (ifp); 859015Ssam } 869015Ssam 879015Ssam /* 889015Ssam * Find an interface from which the specified address 899015Ssam * should have come from. Used for figuring out which 909015Ssam * interface a packet came in on -- for tracing. 919015Ssam */ 929015Ssam struct interface * 939015Ssam if_iflookup(addr) 949015Ssam struct sockaddr *addr; 959015Ssam { 969015Ssam register struct interface *ifp, *maybe; 979015Ssam register int af = addr->sa_family; 989015Ssam register int (*netmatch)(); 999015Ssam 100*26340Skarels if (af >= af_max) 1019015Ssam return (0); 1029015Ssam maybe = 0; 1039015Ssam netmatch = afswitch[af].af_netmatch; 1049015Ssam for (ifp = ifnet; ifp; ifp = ifp->int_next) { 1059015Ssam if (ifp->int_addr.sa_family != af) 1069015Ssam continue; 1079015Ssam if (same(&ifp->int_addr, addr)) 1089015Ssam break; 1099015Ssam if ((ifp->int_flags & IFF_BROADCAST) && 1109015Ssam same(&ifp->int_broadaddr, addr)) 1119015Ssam break; 1129015Ssam if (maybe == 0 && (*netmatch)(addr, &ifp->int_addr)) 1139015Ssam maybe = ifp; 1149015Ssam } 1159015Ssam if (ifp == 0) 1169015Ssam ifp = maybe; 1179015Ssam return (ifp); 1189015Ssam } 119