xref: /csrg-svn/sbin/routed/if.c (revision 27231)
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*27231Skarels static char sccsid[] = "@(#)if.c	5.3 (Berkeley) 04/20/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 
7326340Skarels 	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 
10026340Skarels 	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;
112*27231Skarels 		if ((ifp->int_flags & IFF_POINTOPOINT) &&
113*27231Skarels 		    same(&ifp->int_dstaddr, addr))
114*27231Skarels 			break;
1159015Ssam 		if (maybe == 0 && (*netmatch)(addr, &ifp->int_addr))
1169015Ssam 			maybe = ifp;
1179015Ssam 	}
1189015Ssam 	if (ifp == 0)
1199015Ssam 		ifp = maybe;
1209015Ssam 	return (ifp);
1219015Ssam }
122