From 9920df072a1f293dcaca84e0bddfd20ba0c016dc Mon Sep 17 00:00:00 2001 From: lyq140 <34637052+lyq140@users.noreply.github.com> Date: Wed, 21 Mar 2018 07:46:36 -0400 Subject: [PATCH] ripd: considering a interface with 2 or more IP This commit fixes these three issues: 1) rinfo is used for rip packet sending not tmp_rinfo 2) With RIP_SPLIT_HORIZON and an interface with more than 1 ip addresses we will not send the routes out an interface that they originate on 3) With RIP_SPLIT_HORIZON_POISONED_REVERSE and an interface with more than 1 ip address we will not send out ipA with a metric of 16 and ipb with a metric of 1. Both will be 16 now. Signed-off-by: lyq140 <34637052+lyq140@users.noreply.github.com> --- ripd/ripd.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/ripd/ripd.c b/ripd/ripd.c index 7575c8e1ff..86c0348b94 100644 --- a/ripd/ripd.c +++ b/ripd/ripd.c @@ -2186,6 +2186,7 @@ void rip_output_process(struct connected *ifc, struct sockaddr_in *to, */ int suppress = 0; struct rip_info *tmp_rinfo = NULL; + struct connected *tmp_ifc = NULL; for (ALL_LIST_ELEMENTS_RO(list, listnode, tmp_rinfo)) @@ -2197,10 +2198,17 @@ void rip_output_process(struct connected *ifc, struct sockaddr_in *to, } if (!suppress - && rinfo->type == ZEBRA_ROUTE_CONNECT - && prefix_match((struct prefix *)p, - ifc->address)) - suppress = 1; + && rinfo->type == ZEBRA_ROUTE_CONNECT) { + for (ALL_LIST_ELEMENTS_RO( + ifc->ifp->connected, + listnode, tmp_ifc)) + if (prefix_match( + (struct prefix *)p, + tmp_ifc->address)) { + suppress = 1; + break; + } + } if (suppress) continue; @@ -2311,19 +2319,29 @@ void rip_output_process(struct connected *ifc, struct sockaddr_in *to, * configured on the same interface). */ struct rip_info *tmp_rinfo = NULL; + struct connected *tmp_ifc = NULL; for (ALL_LIST_ELEMENTS_RO(list, listnode, tmp_rinfo)) if (tmp_rinfo->type == ZEBRA_ROUTE_RIP && tmp_rinfo->nh.ifindex == ifc->ifp->ifindex) - tmp_rinfo->metric_out = + rinfo->metric_out = RIP_METRIC_INFINITY; - if (rinfo->type == ZEBRA_ROUTE_CONNECT - && prefix_match((struct prefix *)p, - ifc->address)) - rinfo->metric_out = RIP_METRIC_INFINITY; + if (rinfo->metric_out != RIP_METRIC_INFINITY + && rinfo->type == ZEBRA_ROUTE_CONNECT) { + for (ALL_LIST_ELEMENTS_RO( + ifc->ifp->connected, + listnode, tmp_ifc)) + if (prefix_match( + (struct prefix *)p, + tmp_ifc->address)) { + rinfo->metric_out = + RIP_METRIC_INFINITY; + break; + } + } } /* Prepare preamble, auth headers, if needs be */ -- 2.39.5