From: Sam Leffler Date: Wed, 3 Nov 1982 14:28:02 +0000 (-0800) Subject: date and time created 82/11/02 22:28:02 by sam X-Git-Tag: BSD-4_1c_2-Snapshot-Development~1951 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/7ab5124abc72f6c936644d9b7de938ceaa656cc4 date and time created 82/11/02 22:28:02 by sam SCCS-vsn: sbin/routed/if.c 4.1 --- diff --git a/usr/src/sbin/routed/if.c b/usr/src/sbin/routed/if.c new file mode 100644 index 0000000000..7baa3dc2f7 --- /dev/null +++ b/usr/src/sbin/routed/if.c @@ -0,0 +1,94 @@ +#ifndef lint +static char sccsid[] = "@(#)if.c 4.1 %G%"; +#endif + +/* + * Routing Table Management Daemon + */ +#include "router.h" + +extern struct interface *ifnet; + +/* + * Find the interface with address add. + */ +struct interface * +if_ifwithaddr(addr) + struct sockaddr *addr; +{ + register struct interface *ifp; + +#define same(a1, a2) \ + (bcmp((caddr_t)((a1)->sa_data), (caddr_t)((a2)->sa_data), 14) == 0) + for (ifp = ifnet; ifp; ifp = ifp->int_next) { + if (ifp->int_flags & IFF_REMOTE) + continue; + if (ifp->int_addr.sa_family != addr->sa_family) + continue; + if (same(&ifp->int_addr, addr)) + break; + if ((ifp->int_flags & IFF_BROADCAST) && + same(&ifp->int_broadaddr, addr)) + break; + } + return (ifp); +} + +/* + * Find the interface on the network + * of the specified address. + */ +struct interface * +if_ifwithnet(addr) + register struct sockaddr *addr; +{ + register struct interface *ifp; + register int af = addr->sa_family; + register int (*netmatch)(); + + if (af >= AF_MAX) + return (0); + netmatch = afswitch[af].af_netmatch; + for (ifp = ifnet; ifp; ifp = ifp->int_next) { + if (ifp->int_flags & IFF_REMOTE) + continue; + if (af != ifp->int_addr.sa_family) + continue; + if ((*netmatch)(addr, &ifp->int_addr)) + break; + } + return (ifp); +} + +/* + * Find an interface from which the specified address + * should have come from. Used for figuring out which + * interface a packet came in on -- for tracing. + */ +struct interface * +if_iflookup(addr) + struct sockaddr *addr; +{ + register struct interface *ifp, *maybe; + register int af = addr->sa_family; + register int (*netmatch)(); + + if (af >= AF_MAX) + return (0); + maybe = 0; + netmatch = afswitch[af].af_netmatch; + for (ifp = ifnet; ifp; ifp = ifp->int_next) { + if (ifp->int_addr.sa_family != af) + continue; + if (same(&ifp->int_addr, addr)) + break; + if ((ifp->int_flags & IFF_BROADCAST) && + same(&ifp->int_broadaddr, addr)) + break; + if (maybe == 0 && (*netmatch)(addr, &ifp->int_addr)) + maybe = ifp; + } + if (ifp == 0) + ifp = maybe; + return (ifp); +}