delay deletion from internal tables when cur router deletes
authorMike Karels <karels@ucbvax.Berkeley.EDU>
Fri, 31 Oct 1986 12:36:17 +0000 (04:36 -0800)
committerMike Karels <karels@ucbvax.Berkeley.EDU>
Fri, 31 Oct 1986 12:36:17 +0000 (04:36 -0800)
(so can advertise deletion)

SCCS-vsn: sbin/routed/input.c 5.7
SCCS-vsn: sbin/routed/tables.c 5.6

usr/src/sbin/routed/input.c
usr/src/sbin/routed/tables.c

index e96cfbf..d9bc288 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)input.c    5.6 (Berkeley) %G%";
+static char sccsid[] = "@(#)input.c    5.7 (Berkeley) %G%";
 #endif not lint
 
 /*
 #endif not lint
 
 /*
@@ -27,6 +27,7 @@ rip_input(from, size)
        struct interface *if_ifwithdstaddr();
        int newsize;
        register struct afswitch *afp;
        struct interface *if_ifwithdstaddr();
        int newsize;
        register struct afswitch *afp;
+       static struct sockaddr badfrom;
 
        ifp = 0;
        TRACE_INPUT(ifp, from, size);
 
        ifp = 0;
        TRACE_INPUT(ifp, from, size);
@@ -94,7 +95,7 @@ rip_input(from, size)
                        return;
                if (if_iflookup(from) == 0) {
                        syslog(LOG_ERR, "trace command from unknown router, %s",
                        return;
                if (if_iflookup(from) == 0) {
                        syslog(LOG_ERR, "trace command from unknown router, %s",
-                          (*afswitch[from->sa_family].af_format)(from));
+                           (*afswitch[from->sa_family].af_format)(from));
                        return;
                }
                packet[size] = '\0';
                        return;
                }
                packet[size] = '\0';
@@ -130,8 +131,13 @@ rip_input(from, size)
                else if (ifp = if_ifwithdstaddr(from))
                        addrouteforif(ifp);
                else if (if_iflookup(from) == 0) {
                else if (ifp = if_ifwithdstaddr(from))
                        addrouteforif(ifp);
                else if (if_iflookup(from) == 0) {
-                       syslog(LOG_ERR, "packet from unknown router, %s",
-                          (*afswitch[from->sa_family].af_format)(from));
+                       if (bcmp((char *)from, (char *)&badfrom,
+                           sizeof(badfrom)) != 0) {
+                               syslog(LOG_ERR,
+                                 "packet from unknown router, %s",
+                                 (*afswitch[from->sa_family].af_format)(from));
+                               badfrom = *from;
+                       }
                        return;
                }
                size -= 4 * sizeof (char);
                        return;
                }
                size -= 4 * sizeof (char);
@@ -181,10 +187,6 @@ rip_input(from, size)
                         * shorter, or getting stale and equivalent.
                         */
                        if (equal(from, &rt->rt_router)) {
                         * shorter, or getting stale and equivalent.
                         */
                        if (equal(from, &rt->rt_router)) {
-                               if (n->rip_metric == HOPCNT_INFINITY) {
-                                       rtdelete(rt);
-                                       continue;
-                               }
                                if (n->rip_metric != rt->rt_metric)
                                        rtchange(rt, from, n->rip_metric);
                                rt->rt_timer = 0;
                                if (n->rip_metric != rt->rt_metric)
                                        rtchange(rt, from, n->rip_metric);
                                rt->rt_timer = 0;
index 529ad0a..3d37667 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)tables.c   5.5 (Berkeley) %G%";
+static char sccsid[] = "@(#)tables.c   5.6 (Berkeley) %G%";
 #endif not lint
 
 /*
 #endif not lint
 
 /*
@@ -165,13 +165,16 @@ rtchange(rt, gate, metric)
        struct sockaddr *gate;
        short metric;
 {
        struct sockaddr *gate;
        short metric;
 {
-       int doioctl = 0, metricchanged = 0;
+       int doioctl = 0, metricchanged = 0, delete = 0;
        struct rtentry oldroute;
 
        if (!equal(&rt->rt_router, gate) && (rt->rt_state & RTS_INTERNAL) == 0)
                doioctl++;
        struct rtentry oldroute;
 
        if (!equal(&rt->rt_router, gate) && (rt->rt_state & RTS_INTERNAL) == 0)
                doioctl++;
-       if (metric != rt->rt_metric)
+       if (metric != rt->rt_metric) {
                metricchanged++;
                metricchanged++;
+               if (metric == HOPCNT_INFINITY)
+                       delete++;
+       }
        if (doioctl || metricchanged) {
                TRACE_ACTION(CHANGE FROM, rt);
                if ((rt->rt_state & RTS_INTERFACE) && metric) {
        if (doioctl || metricchanged) {
                TRACE_ACTION(CHANGE FROM, rt);
                if ((rt->rt_state & RTS_INTERFACE) && metric) {
@@ -195,12 +198,12 @@ rtchange(rt, gate, metric)
                rt->rt_state |= RTS_CHANGED;
                TRACE_ACTION(CHANGE TO, rt);
        }
                rt->rt_state |= RTS_CHANGED;
                TRACE_ACTION(CHANGE TO, rt);
        }
-       if (doioctl && install) {
+       if (doioctl && install)
                if (ioctl(s, SIOCADDRT, (char *)&rt->rt_rt) < 0)
                        perror("SIOCADDRT");
                if (ioctl(s, SIOCADDRT, (char *)&rt->rt_rt) < 0)
                        perror("SIOCADDRT");
+       if ((doioctl || delete) && install)
                if (ioctl(s, SIOCDELRT, (char *)&oldroute) < 0)
                        perror("SIOCDELRT");
                if (ioctl(s, SIOCDELRT, (char *)&oldroute) < 0)
                        perror("SIOCDELRT");
-       }
 }
 
 rtdelete(rt)
 }
 
 rtdelete(rt)
@@ -212,6 +215,7 @@ rtdelete(rt)
                        rt->rt_ifp->int_name);
        TRACE_ACTION(DELETE, rt);
        if (install && (rt->rt_state & (RTS_INTERNAL | RTS_EXTERNAL)) == 0 &&
                        rt->rt_ifp->int_name);
        TRACE_ACTION(DELETE, rt);
        if (install && (rt->rt_state & (RTS_INTERNAL | RTS_EXTERNAL)) == 0 &&
+           rt->rt_metric != HOPCNT_INFINITY &&
            ioctl(s, SIOCDELRT, (char *)&rt->rt_rt))
                perror("SIOCDELRT");
        remque(rt);
            ioctl(s, SIOCDELRT, (char *)&rt->rt_rt))
                perror("SIOCDELRT");
        remque(rt);