]> git.puffer.fish Git - mirror/frr.git/commitdiff
2003-11-17 sowmini.varadhan@sun.com
authorpaul <paul>
Mon, 17 Nov 2003 09:15:18 +0000 (09:15 +0000)
committerpaul <paul>
Mon, 17 Nov 2003 09:15:18 +0000 (09:15 +0000)
        * ripd/ripd.c: rip_output_process() fixup aspects of split-horizon
          route suppression. See [quagga-dev 429].

ripd/ripd.c

index df6cf6cfae11a7f17c39b5e81b15ac8430d39165..29e70c44c7c98f445736381fedd21eef41f10d60 100644 (file)
@@ -2119,9 +2119,20 @@ rip_output_process (struct interface *ifp, struct prefix *ifaddr,
        /* if (split_horizon == rip_split_horizon) */
        if (ri->split_horizon == RIP_SPLIT_HORIZON)
          {
-           /* We perform split horizon for RIP and connected route. */
-           if ((rinfo->type == ZEBRA_ROUTE_RIP ||
-                rinfo->type == ZEBRA_ROUTE_CONNECT) &&
+           /* 
+            * We perform split horizon for RIP and connected route. 
+            * For rip routes, we want to suppress the route if we would
+             * end up sending the route back on the interface that we
+             * learned it from, with a higher metric. For connected routes,
+             * we suppress the route if the prefix is a subset of the
+             * source address that we are going to use for the packet 
+             * (in order to handle the case when multiple subnets are
+             * configured on the same interface).
+             */
+           if (rinfo->type == ZEBRA_ROUTE_RIP  &&
+                 rinfo->ifindex == ifp->ifindex) 
+             continue;
+           if (rinfo->type == ZEBRA_ROUTE_CONNECT &&
                  prefix_match((struct prefix *)p, (struct prefix *)saddr))
              continue;
          }
@@ -2206,10 +2217,22 @@ rip_output_process (struct interface *ifp, struct prefix *ifaddr,
         * for RIP and connected routes.
         **/
        if (ri->split_horizon == RIP_SPLIT_HORIZON_POISONED_REVERSE) {
-         if ((rinfo->type == ZEBRA_ROUTE_RIP ||
-              rinfo->type == ZEBRA_ROUTE_CONNECT) &&
+           /* 
+            * We perform split horizon for RIP and connected route. 
+            * For rip routes, we want to suppress the route if we would
+             * end up sending the route back on the interface that we
+             * learned it from, with a higher metric. For connected routes,
+             * we suppress the route if the prefix is a subset of the
+             * source address that we are going to use for the packet 
+             * (in order to handle the case when multiple subnets are
+             * configured on the same interface).
+             */
+         if (rinfo->type == ZEBRA_ROUTE_RIP  &&
               rinfo->ifindex == ifp->ifindex)
               rinfo->metric_out = RIP_METRIC_INFINITY;
+         if (rinfo->type == ZEBRA_ROUTE_CONNECT &&
+              prefix_match((struct prefix *)p, (struct prefix *)saddr))
+              rinfo->metric_out = RIP_METRIC_INFINITY;
        }
  
        /* Write RTE to the stream. */