date and time created 82/11/02 22:28:02 by sam
authorSam Leffler <sam@ucbvax.Berkeley.EDU>
Wed, 3 Nov 1982 14:28:02 +0000 (06:28 -0800)
committerSam Leffler <sam@ucbvax.Berkeley.EDU>
Wed, 3 Nov 1982 14:28:02 +0000 (06:28 -0800)
SCCS-vsn: sbin/routed/if.c 4.1

usr/src/sbin/routed/if.c [new file with mode: 0644]

diff --git a/usr/src/sbin/routed/if.c b/usr/src/sbin/routed/if.c
new file mode 100644 (file)
index 0000000..7baa3dc
--- /dev/null
@@ -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);
+}