diff options
Diffstat (limited to 'bgpd/bgp_mplsvpn.h')
-rw-r--r-- | bgpd/bgp_mplsvpn.h | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/bgpd/bgp_mplsvpn.h b/bgpd/bgp_mplsvpn.h index d0ad8ac84..d35568b83 100644 --- a/bgpd/bgp_mplsvpn.h +++ b/bgpd/bgp_mplsvpn.h @@ -81,6 +81,14 @@ extern void vpn_leak_zebra_vrf_label_withdraw(struct bgp *bgp, afi_t afi); static inline int vpn_leak_to_vpn_active(struct bgp *bgp_vrf, afi_t afi, const char **pmsg) { + if (bgp_vrf->inst_type != BGP_INSTANCE_TYPE_VRF + && bgp_vrf->inst_type != BGP_INSTANCE_TYPE_DEFAULT) { + + if (pmsg) + *pmsg = "source bgp instance neither vrf nor default"; + return 0; + } + /* Is vrf configured to export to vpn? */ if (!CHECK_FLAG(bgp_vrf->af_flags[afi][SAFI_UNICAST], BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT)) { @@ -107,27 +115,21 @@ static inline int vpn_leak_to_vpn_active(struct bgp *bgp_vrf, afi_t afi, } static inline int vpn_leak_from_vpn_active(struct bgp *bgp_vrf, afi_t afi, - const char **pmsg, - struct bgp_redist **pred) + const char **pmsg) { - struct bgp_redist *red; - if (bgp_vrf->inst_type != BGP_INSTANCE_TYPE_VRF - && bgp_vrf->inst_type != BGP_INSTANCE_TYPE_DEFAULT) { + && bgp_vrf->inst_type != BGP_INSTANCE_TYPE_DEFAULT) { if (pmsg) *pmsg = "destination bgp instance neither vrf nor default"; return 0; } - /* Hijack zebra redist bits for this route type */ - red = bgp_redist_lookup(bgp_vrf, afi, ZEBRA_ROUTE_BGP_VPN, 0); - if (red) { - if (pred) - *pred = red; - } else { + /* Is vrf configured to import from vpn? */ + if (!CHECK_FLAG(bgp_vrf->af_flags[afi][SAFI_UNICAST], + BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT)) { if (pmsg) - *pmsg = "redist not set"; + *pmsg = "import not set"; return 0; } if (!bgp_vrf->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_FROMVPN]) { @@ -142,10 +144,16 @@ static inline void vpn_leak_prechange(vpn_policy_direction_t direction, afi_t afi, struct bgp *bgp_vpn, struct bgp *bgp_vrf) { - if (direction == BGP_VPN_POLICY_DIR_FROMVPN) + if ((direction == BGP_VPN_POLICY_DIR_FROMVPN) && + vpn_leak_from_vpn_active(bgp_vrf, afi, NULL)) { + vpn_leak_to_vrf_withdraw_all(bgp_vrf, afi); - if (direction == BGP_VPN_POLICY_DIR_TOVPN) + } + if ((direction == BGP_VPN_POLICY_DIR_TOVPN) && + vpn_leak_to_vpn_active(bgp_vrf, afi, NULL)) { + vpn_leak_from_vrf_withdraw_all(bgp_vpn, bgp_vrf, afi); + } } static inline void vpn_leak_postchange(vpn_policy_direction_t direction, @@ -156,16 +164,14 @@ static inline void vpn_leak_postchange(vpn_policy_direction_t direction, vpn_leak_to_vrf_update_all(bgp_vrf, bgp_vpn, afi); if (direction == BGP_VPN_POLICY_DIR_TOVPN) { - if (bgp_vrf->vpn_policy[afi].tovpn_label - != bgp_vrf->vpn_policy[afi] + if (bgp_vrf->vpn_policy[afi].tovpn_label != + bgp_vrf->vpn_policy[afi] .tovpn_zebra_vrf_label_last_sent) { vpn_leak_zebra_vrf_label_update(bgp_vrf, afi); } vpn_leak_from_vrf_update_all(bgp_vpn, bgp_vrf, afi); } - if (direction == BGP_VPN_POLICY_DIR_TOVPN) - vpn_leak_from_vrf_update_all(bgp_vpn, bgp_vrf, afi); } extern void vpn_policy_routemap_event(const char *rmap_name); |