summaryrefslogtreecommitdiff
path: root/bgpd
diff options
context:
space:
mode:
authorJosh Bailey <joshb@google.com>2011-07-20 20:52:06 -0700
committerJosh Bailey <joshb@google.com>2011-07-20 20:52:06 -0700
commit01d7ff0a2166a422c56bd26f04fc22832a9e690b (patch)
tree5fed07bab4751e28e50dd7ff7145b06a565c4f5a /bgpd
parent78d92e1721538ec41feb2b1c34712675b830087b (diff)
bgpd: We try to skip out of updating the multipath aggregate if there are no
changes in the multipath set or attributes, but failed to check for just a bestpath change. The result is there is no attribute on the new bestpath and we hit the assert. Added the bestpath check and rearranged the code to only check attributes when there is no bestpath or multipath change, so we only scan the for attribute changes when necessary. * bgpd/bgp_mpath.c * bgp_info_mpath_aggregate_update(): Added check for bestpath change before skipping the aggregate generation. Skip the attribute check if either the multipath set or bestpath has changed.
Diffstat (limited to 'bgpd')
-rw-r--r--bgpd/bgp_mpath.c37
1 files changed, 22 insertions, 15 deletions
diff --git a/bgpd/bgp_mpath.c b/bgpd/bgp_mpath.c
index 1709c244..d07830d1 100644
--- a/bgpd/bgp_mpath.c
+++ b/bgpd/bgp_mpath.c
@@ -626,25 +626,32 @@ bgp_info_mpath_aggregate_update (struct bgp_info *new_best,
/*
* Bail out here if the following is true:
* - MULTIPATH_CHG bit is not set on new_best, and
+ * - No change in bestpath, and
* - ATTR_CHANGED bit is not set on new_best or any of the multipaths
*/
- attr_chg = 0;
- if (CHECK_FLAG (new_best->flags, BGP_INFO_ATTR_CHANGED))
- attr_chg = 1;
- else
- for (mpinfo = bgp_info_mpath_first (new_best); mpinfo;
- mpinfo = bgp_info_mpath_next (mpinfo))
- {
- if (CHECK_FLAG (mpinfo->flags, BGP_INFO_ATTR_CHANGED))
+ if (!CHECK_FLAG (new_best->flags, BGP_INFO_MULTIPATH_CHG) &&
+ (old_best == new_best))
+ {
+ attr_chg = 0;
+
+ if (CHECK_FLAG (new_best->flags, BGP_INFO_ATTR_CHANGED))
+ attr_chg = 1;
+ else
+ for (mpinfo = bgp_info_mpath_first (new_best); mpinfo;
+ mpinfo = bgp_info_mpath_next (mpinfo))
{
- attr_chg = 1;
- break;
+ if (CHECK_FLAG (mpinfo->flags, BGP_INFO_ATTR_CHANGED))
+ {
+ attr_chg = 1;
+ break;
+ }
}
- }
- if (!CHECK_FLAG (new_best->flags, BGP_INFO_MULTIPATH_CHG) && !attr_chg)
- {
- assert (bgp_info_mpath_attr (new_best));
- return;
+
+ if (!attr_chg)
+ {
+ assert (bgp_info_mpath_attr (new_best));
+ return;
+ }
}
bgp_attr_dup (&attr, new_best->attr);