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

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

diff --git a/usr/src/sbin/routed/output.c b/usr/src/sbin/routed/output.c
new file mode 100644 (file)
index 0000000..7fcd3b6
--- /dev/null
@@ -0,0 +1,88 @@
+#ifndef lint
+static char sccsid[] = "@(#)output.c   4.1 %G%";
+#endif
+
+/*
+ * Routing Table Management Daemon
+ */
+#include "router.h"
+
+/*
+ * Apply the function "f" to all non-passive
+ * interfaces.  If the interface supports the
+ * use of broadcasting use it, otherwise address
+ * the output to the known router.
+ */
+toall(f)
+       int (*f)();
+{
+       register struct interface *ifp;
+       register struct sockaddr *dst;
+       extern struct interface *ifnet;
+
+       for (ifp = ifnet; ifp; ifp = ifp->int_next) {
+               if (ifp->int_flags & IFF_PASSIVE)
+                       continue;
+               dst = ifp->int_flags & IFF_BROADCAST ? &ifp->int_broadaddr :
+                     ifp->int_flags & IFF_POINTOPOINT ? &ifp->int_dstaddr :
+                     &ifp->int_addr;
+               (*f)(dst, ifp->int_flags & IFF_INTERFACE, ifp);
+       }
+}
+
+/*
+ * Output a preformed packet.
+ */
+/*ARGSUSED*/
+sendmsg(dst, dontroute, ifp)
+       struct sockaddr *dst;
+       int dontroute;
+       struct interface *ifp;
+{
+
+       (*afswitch[dst->sa_family].af_output)(dontroute ? snoroute : s,
+               dst, sizeof (struct rip));
+       TRACE_OUTPUT(ifp, dst, sizeof (struct rip));
+}
+
+/*
+ * Supply dst with the contents of the routing tables.
+ * If this won't fit in one packet, chop it up into several.
+ */
+supply(dst, dontroute, ifp)
+       struct sockaddr *dst;
+       struct interface *ifp;
+{
+       register struct rt_entry *rt;
+       struct netinfo *n = msg->rip_nets;
+       register struct rthash *rh;
+       struct rthash *base = hosthash;
+       int doinghost = 1, size;
+       int (*output)() = afswitch[dst->sa_family].af_output;
+       int sto = dontroute ? snoroute : s;
+
+       msg->rip_cmd = RIPCMD_RESPONSE;
+again:
+       for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++)
+       for (rt = rh->rt_forw; rt != (struct rt_entry *)rh; rt = rt->rt_forw) {
+               size = (char *)n - packet;
+               if (size > MAXPACKETSIZE - sizeof (struct netinfo)) {
+                       (*output)(sto, dst, size);
+                       TRACE_OUTPUT(ifp, dst, size);
+                       n = msg->rip_nets;
+               }
+               n->rip_dst = rt->rt_dst;
+               n->rip_metric = min(rt->rt_metric + 1, HOPCNT_INFINITY);
+               n++;
+       }
+       if (doinghost) {
+               doinghost = 0;
+               base = nethash;
+               goto again;
+       }
+       if (n != msg->rip_nets) {
+               size = (char *)n - packet;
+               (*output)(sto, dst, size);
+               TRACE_OUTPUT(ifp, dst, size);
+       }
+}