mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-07-31 22:44:58 +00:00
bgpd: Late registration of Extended Nexthop should allow RA's to happen
When we have a late registration of the Extended Nexthop capability for BGP and the peer already has nexthop information stored, go through and enable RA on the important interfaces. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
8dfa7e4680
commit
1ea03b905d
@ -838,3 +838,48 @@ void bgp_nht_register_nexthops(struct bgp *bgp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bgp_nht_register_enhe_capability_interfaces(struct peer *peer)
|
||||||
|
{
|
||||||
|
struct bgp *bgp;
|
||||||
|
struct bgp_node *rn;
|
||||||
|
struct bgp_nexthop_cache *bnc;
|
||||||
|
struct nexthop *nhop;
|
||||||
|
struct interface *ifp;
|
||||||
|
struct prefix p;
|
||||||
|
|
||||||
|
if (peer->ifp)
|
||||||
|
return;
|
||||||
|
|
||||||
|
bgp = peer->bgp;
|
||||||
|
|
||||||
|
if (!bgp->nexthop_cache_table[AFI_IP6])
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!sockunion2hostprefix(&peer->su, &p)) {
|
||||||
|
if (BGP_DEBUG(nht, NHT))
|
||||||
|
zlog_debug("%s: Unable to convert prefix to sockunion",
|
||||||
|
__PRETTY_FUNCTION__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p.family != AF_INET6)
|
||||||
|
return;
|
||||||
|
rn = bgp_node_lookup(bgp->nexthop_cache_table[AFI_IP6], &p);
|
||||||
|
|
||||||
|
bnc = bgp_nexthop_get_node_info(rn);
|
||||||
|
if (!bnc)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (peer != bnc->nht_info)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (nhop = bnc->nexthop; nhop; nhop = nhop->next) {
|
||||||
|
ifp = if_lookup_by_index(nhop->ifindex,
|
||||||
|
nhop->vrf_id);
|
||||||
|
zclient_send_interface_radv_req(zclient,
|
||||||
|
nhop->vrf_id,
|
||||||
|
ifp, true,
|
||||||
|
BGP_UNNUM_DEFAULT_RA_INTERVAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -88,4 +88,13 @@ extern void path_nh_map(struct bgp_path_info *path,
|
|||||||
*/
|
*/
|
||||||
extern void bgp_nht_register_nexthops(struct bgp *bgp);
|
extern void bgp_nht_register_nexthops(struct bgp *bgp);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When we have the the PEER_FLAG_CAPABILITY_ENHE flag
|
||||||
|
* set on a peer *after* it has been brought up we need
|
||||||
|
* to notice and setup the interface based RA,
|
||||||
|
* this code can walk the registered nexthops and
|
||||||
|
* register the important ones with zebra for RA.
|
||||||
|
*/
|
||||||
|
extern void bgp_nht_register_enhe_capability_interfaces(struct peer *peer);
|
||||||
|
|
||||||
#endif /* _BGP_NHT_H */
|
#endif /* _BGP_NHT_H */
|
||||||
|
@ -3905,6 +3905,9 @@ static int peer_flag_modify(struct peer *peer, uint32_t flag, int set)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (set && flag == PEER_FLAG_CAPABILITY_ENHE)
|
||||||
|
bgp_nht_register_enhe_capability_interfaces(peer);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update peer-group members, unless they are explicitely overriding
|
* Update peer-group members, unless they are explicitely overriding
|
||||||
* peer-group configuration.
|
* peer-group configuration.
|
||||||
@ -3928,6 +3931,9 @@ static int peer_flag_modify(struct peer *peer, uint32_t flag, int set)
|
|||||||
/* Update flag on peer-group member. */
|
/* Update flag on peer-group member. */
|
||||||
COND_FLAG(member->flags, flag, set != member_invert);
|
COND_FLAG(member->flags, flag, set != member_invert);
|
||||||
|
|
||||||
|
if (set && flag == PEER_FLAG_CAPABILITY_ENHE)
|
||||||
|
bgp_nht_register_enhe_capability_interfaces(member);
|
||||||
|
|
||||||
/* Execute flag action on peer-group member. */
|
/* Execute flag action on peer-group member. */
|
||||||
if (action.type == peer_change_reset)
|
if (action.type == peer_change_reset)
|
||||||
peer_flag_modify_action(member, flag);
|
peer_flag_modify_action(member, flag);
|
||||||
|
Loading…
Reference in New Issue
Block a user