On Mon, 26 Oct 2015, Jacqueline Yu wrote:
/* Withdraw the route from the kernel. */
if (old_select
&& old_select->type == ZEBRA_ROUTE_BGP
- && old_select->sub_type == BGP_ROUTE_NORMAL)
- bgp_zebra_withdraw (p, old_select, safi);
So, this should have worked fine. That it does not means the bug then is
that old_select no longer has the information it should have - i.e. the
nexthop info that was sent to zebra.
Something has fiddled with the route in between it being sent to zebra and
this withdraw?
+ && old_select->sub_type == BGP_ROUTE_NORMAL) {
+ if (CHECK_FLAG (old_select->flags, BGP_INFO_NEW_NHOP_INVALID))
{
+ attr = old_select->attr;
+ old_select->attr = (bgp_info_extra_get(old_select))->attr;
And this patch is trying to workaround that by stashing /another/
reference to the attributes in (struct bgp_info_extra). A reference which
whatever other bogus bit of bgpd that is trampling over the (struct
bgp_info).attr doesn't know about, and so it stays valid and pointing to
the original, correct attr. And then retrieving that reference here to
temporarily set the old_select->attr pointer back to.
That's a cute hack, I have to admit :), but it doesn't address the root
cause of this issue, does it? Something is screwing with (struct bgp_info
*)->attr when it should not be, or at least in a bogus manner, right?
Martin, how long does it take you to test for this? Is there any chance
you could do a binary search (ala git bisect) starting with a much earlier
version Quagga and locate the commit that introduces this bug?
This needs fixing properly.
regards,
--
Paul Jakma [email protected] @pjakma Key ID: 64A2FF6A
Fortune:
"Necessity is the mother of invention" is a silly proverb. "Necessity
is the mother of futile dodges" is much nearer the truth.
-- Alfred North Whitehead
_______________________________________________
Quagga-dev mailing list
[email protected]
https://lists.quagga.net/mailman/listinfo/quagga-dev