xref: /csrg-svn/sbin/routed/if.c (revision 17569)
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