diff options
| -rw-r--r-- | bgpd/bgp_zebra.c | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index 4e02eeb470..99a7be21b4 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -822,7 +822,7 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp, sa if (nexthop == NULL) return; - if (IN6_IS_ADDR_LINKLOCAL (nexthop) && ! ifindex) + if (!ifindex) { if (info->peer->ifname) ifindex = if_nametoindex (info->peer->ifname); @@ -836,13 +836,14 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp, sa for (mpinfo = bgp_info_mpath_first (info); mpinfo; mpinfo = bgp_info_mpath_next (mpinfo)) { + ifindex = 0; + /* Only global address nexthop exists. */ if (mpinfo->attr->extra->mp_nexthop_len == 16) - { nexthop = &mpinfo->attr->extra->mp_nexthop_global; - } + /* If both global and link-local address present. */ - if (mpinfo->attr->extra->mp_nexthop_len == 32) + if (mpinfo->attr->extra->mp_nexthop_len == 32) { /* Workaround for Cisco's nexthop bug. */ if (IN6_IS_ADDR_UNSPECIFIED (&mpinfo->attr->extra->mp_nexthop_global) @@ -860,26 +861,28 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp, sa ifindex = mpinfo->peer->nexthop.ifp->ifindex; } } - if (nexthop == NULL) - { - continue; - } - if (IN6_IS_ADDR_LINKLOCAL (nexthop) && ! ifindex) - { - if (mpinfo->peer->ifname) - { - ifindex = if_nametoindex (mpinfo->peer->ifname); + if (nexthop == NULL) + { + continue; + } + + if (!ifindex) + { + if (mpinfo->peer->ifname) + { + ifindex = if_nametoindex (mpinfo->peer->ifname); } - else if (mpinfo->peer->nexthop.ifp) - { - ifindex = mpinfo->peer->nexthop.ifp->ifindex; - } - } - if (ifindex == 0) - { - continue; + else if (mpinfo->peer->nexthop.ifp) + { + ifindex = mpinfo->peer->nexthop.ifp->ifindex; } + } + + if (ifindex == 0) + { + continue; + } stream_put (bgp_nexthop_buf, &nexthop, sizeof (struct in6_addr *)); stream_put (bgp_ifindices_buf, &ifindex, sizeof (unsigned int)); |
