diff options
author | paul <paul> | 2003-11-17 09:15:18 +0000 |
---|---|---|
committer | paul <paul> | 2003-11-17 09:15:18 +0000 |
commit | 42d14d985049a6e810a4036b684e38c005480373 (patch) | |
tree | 865f9c98ff0482e7e5ce9baf0883f36ec943d096 /ripd | |
parent | d62262a0260760dc536b4d2fff0bee2b1c18052c (diff) |
2003-11-17 sowmini.varadhan@sun.com
* ripd/ripd.c: rip_output_process() fixup aspects of split-horizon
route suppression. See [quagga-dev 429].
Diffstat (limited to 'ripd')
-rw-r--r-- | ripd/ripd.c | 33 |
1 files changed, 28 insertions, 5 deletions
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. */ |