From 42d14d985049a6e810a4036b684e38c005480373 Mon Sep 17 00:00:00 2001 From: paul Date: Mon, 17 Nov 2003 09:15:18 +0000 Subject: 2003-11-17 sowmini.varadhan@sun.com * ripd/ripd.c: rip_output_process() fixup aspects of split-horizon route suppression. See [quagga-dev 429]. --- ripd/ripd.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'ripd') diff --git a/ripd/ripd.c b/ripd/ripd.c index df6cf6cf..29e70c44 100644 --- a/ripd/ripd.c +++ b/ripd/ripd.c @@ -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. */ -- cgit v1.2.1