continue;
new_select = ri1;
- if (do_mpath)
- bgp_mp_list_add (&mp_list, ri1);
old_select = CHECK_FLAG (ri1->flags, BGP_INFO_SELECTED) ? ri1 : NULL;
if (ri1->next)
for (ri2 = ri1->next; ri2; ri2 = ri2->next)
{
bgp_info_unset_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
new_select = ri2;
- if (do_mpath && !paths_eq)
- {
- bgp_mp_list_clear (&mp_list);
- bgp_mp_list_add (&mp_list, ri2);
- }
}
- if (do_mpath && paths_eq)
- bgp_mp_list_add (&mp_list, ri2);
-
bgp_info_set_flag (rn, ri2, BGP_INFO_DMED_CHECK);
}
}
bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_CHECK);
bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
-
- bgp_info_mpath_update (rn, new_select, old_select, &mp_list, mpath_cfg);
- bgp_mp_list_clear (&mp_list);
}
/* Check old selected route and new selected route. */
if (bgp_info_cmp (bgp, ri, new_select, &paths_eq, mpath_cfg))
{
- if (do_mpath && bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
- bgp_mp_dmed_deselect (new_select);
-
new_select = ri;
-
- if (do_mpath && !paths_eq)
- {
- bgp_mp_list_clear (&mp_list);
- bgp_mp_list_add (&mp_list, ri);
- }
}
- else if (do_mpath && bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
- bgp_mp_dmed_deselect (ri);
-
- if (do_mpath && paths_eq)
- bgp_mp_list_add (&mp_list, ri);
}
+ /* Now that we know which path is the bestpath see if any of the other paths
+ * qualify as multipaths
+ */
+ if (do_mpath && new_select)
+ {
+ for (ri = rn->info; (ri != NULL) && (nextri = ri->next, 1); ri = nextri)
+ {
+ if (ri == new_select)
+ {
+ bgp_mp_list_add (&mp_list, ri);
+ continue;
+ }
+
+ if (BGP_INFO_HOLDDOWN (ri))
+ continue;
+
+ if (ri->peer &&
+ ri->peer != bgp->peer_self &&
+ !CHECK_FLAG (ri->peer->sflags, PEER_STATUS_NSF_WAIT))
+ if (ri->peer->status != Established)
+ continue;
+
+ if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED)
+ && (! CHECK_FLAG (ri->flags, BGP_INFO_DMED_SELECTED)))
+ continue;
+
+ bgp_info_cmp (bgp, ri, new_select, &paths_eq, mpath_cfg);
+
+ if (paths_eq)
+ {
+ bgp_mp_list_add (&mp_list, ri);
+ }
+ }
+ }
if (!bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
bgp_info_mpath_update (rn, new_select, old_select, &mp_list, mpath_cfg);