summaryrefslogtreecommitdiffstats
path: root/bgpd
diff options
context:
space:
mode:
authorvivek <vivek@cumulusnetworks.com>2014-09-30 15:54:45 -0700
committerPaul Jakma <paul@quagga.net>2015-09-24 15:26:41 +0100
commitbd4b7f1559ab5cb52bbe9dc2db9e50a032ccdbb7 (patch)
tree158439c616739d81afa59a1b1954cc5ef9e29c02 /bgpd
parentb6404390a713144252b62f49a328315d1952c6d8 (diff)
downloadquagga-bd4b7f1559ab5cb52bbe9dc2db9e50a032ccdbb7.tar.bz2
quagga-bd4b7f1559ab5cb52bbe9dc2db9e50a032ccdbb7.tar.xz
bgpd: Ignore stale entry candidates during bestpath selection.
During best path selection, if one of the candidates is a stale entry, do not perform the neighbor address comparison as that information is invalid for the stale entry. Attempting to perform the comparison results in a bgpd exception. Signed-off-by: Vivek Venkataraman <vivek@cumulusnetworks.com> Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
Diffstat (limited to 'bgpd')
-rw-r--r--bgpd/bgp_route.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 34ba1abe..648dc9c8 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -524,7 +524,11 @@ bgp_info_cmp (struct bgp *bgp, struct bgp_info *new, struct bgp_info *exist,
return 0;
}
- /* 11. Rourter-ID comparision. */
+ /* 11. Router-ID comparision. */
+ /* If one of the paths is "stale", the corresponding peer router-id will
+ * be 0 and would always win over the other path. If originator id is
+ * used for the comparision, it will decide which path is better.
+ */
if (newattr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
new_id.s_addr = newattre->originator_id.s_addr;
else
@@ -553,6 +557,14 @@ bgp_info_cmp (struct bgp *bgp, struct bgp_info *new, struct bgp_info *exist,
return 0;
/* 13. Neighbor address comparision. */
+ /* Do this only if neither path is "stale" as stale paths do not have
+ * valid peer information (as the connection may or may not be up).
+ */
+ if (CHECK_FLAG (exist->flags, BGP_INFO_STALE))
+ return 1;
+ if (CHECK_FLAG (new->flags, BGP_INFO_STALE))
+ return 0;
+
ret = sockunion_cmp (new->peer->su_remote, exist->peer->su_remote);
if (ret == 1)