diff options
author | Chirag Shah <chirag@cumulusnetworks.com> | 2019-02-04 03:08:46 +0100 |
---|---|---|
committer | Chirag Shah <chirag@cumulusnetworks.com> | 2019-02-07 04:57:47 +0100 |
commit | 24864e4497d29a29fc4f940492d199febf5c2f58 (patch) | |
tree | 6420c03f8ce648a23dc45c8bea01cddcbe5e8f19 | |
parent | bgpd: advertise svi ip as macip zebra parse api (diff) | |
download | frr-24864e4497d29a29fc4f940492d199febf5c2f58.tar.xz frr-24864e4497d29a29fc4f940492d199febf5c2f58.zip |
bgpd: advertise svi ip as macip config cmd
Ticket:CM-23782
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
-rw-r--r-- | bgpd/bgp_evpn_private.h | 7 | ||||
-rw-r--r-- | bgpd/bgp_evpn_vty.c | 88 |
2 files changed, 95 insertions, 0 deletions
diff --git a/bgpd/bgp_evpn_private.h b/bgpd/bgp_evpn_private.h index 43b1f05b3..c7f2671b7 100644 --- a/bgpd/bgp_evpn_private.h +++ b/bgpd/bgp_evpn_private.h @@ -73,6 +73,9 @@ struct bgpevpn { * advertising subnet for this VNI */ uint8_t advertise_subnet; + /* Flag to indicate if we are advertising the svi mac ip for this VNI*/ + uint8_t advertise_svi_macip; + /* Id for deriving the RD * automatically for this VNI */ uint16_t rd_id; @@ -177,6 +180,10 @@ struct bgp_evpn_info { bool dad_freeze; /* Recovery time */ uint32_t dad_freeze_time; + + /* EVPN enable - advertise svi macip routes */ + int advertise_svi_macip; + }; static inline int is_vrf_rd_configured(struct bgp *bgp_vrf) diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c index a7da3922b..a3d8b8a64 100644 --- a/bgpd/bgp_evpn_vty.c +++ b/bgpd/bgp_evpn_vty.c @@ -489,6 +489,8 @@ static void display_vni(struct vty *vty, struct bgpevpn *vpn, json_object *json) inet_ntoa(vpn->originator_ip)); vty_out(vty, " Advertise-gw-macip : %s\n", vpn->advertise_gw_macip ? "Yes" : "No"); + vty_out(vty, " Advertise-svi-macip : %s\n", + vpn->advertise_svi_macip ? "Yes" : "No"); } if (!json) @@ -2619,6 +2621,33 @@ static void evpn_show_all_vnis(struct vty *vty, struct bgp *bgp, } /* + * evpn - enable advertisement of svi MAC-IP + */ +static void evpn_set_advertise_svi_macip(struct bgp *bgp, struct bgpevpn *vpn, + uint32_t set) +{ + if (!vpn) { + if (set && bgp->evpn_info->advertise_svi_macip) + return; + else if (!set && !bgp->evpn_info->advertise_svi_macip) + return; + + bgp->evpn_info->advertise_svi_macip = set; + bgp_zebra_advertise_svi_macip(bgp, + bgp->evpn_info->advertise_svi_macip, 0); + } else { + if (set && vpn->advertise_svi_macip) + return; + else if (!set && !vpn->advertise_svi_macip) + return; + + vpn->advertise_svi_macip = set; + bgp_zebra_advertise_svi_macip(bgp, vpn->advertise_svi_macip, + vpn->vni); + } +} + +/* * evpn - enable advertisement of default g/w */ static void evpn_set_advertise_default_gw(struct bgp *bgp, struct bgpevpn *vpn) @@ -2798,6 +2827,9 @@ static void write_vni_config(struct vty *vty, struct bgpevpn *vpn) if (vpn->advertise_gw_macip) vty_out(vty, " advertise-default-gw\n"); + if (vpn->advertise_svi_macip) + vty_out(vty, " advertise-svi-ip\n"); + if (vpn->advertise_subnet) vty_out(vty, " advertise-subnet\n"); @@ -3151,6 +3183,54 @@ DEFPY (no_dup_addr_detection, return CMD_SUCCESS; } +DEFPY(bgp_evpn_advertise_svi_ip, + bgp_evpn_advertise_svi_ip_cmd, + "[no$no] advertise-svi-ip", + NO_STR + "Advertise svi mac-ip routes in EVPN\n") +{ + struct bgp *bgp = VTY_GET_CONTEXT(bgp); + + if (!bgp) + return CMD_WARNING; + + if (bgp->vrf_id != VRF_DEFAULT) { + vty_out(vty, + "This command is only supported under Default VRF\n"); + return CMD_WARNING; + } + + if (no) + evpn_set_advertise_svi_macip(bgp, NULL, 0); + else + evpn_set_advertise_svi_macip(bgp, NULL, 1); + + return CMD_SUCCESS; +} + +DEFPY(bgp_evpn_advertise_svi_ip_vni, + bgp_evpn_advertise_svi_ip_vni_cmd, + "[no$no] advertise-svi-ip", + NO_STR + "Advertise svi mac-ip routes in EVPN for a VNI\n") +{ + struct bgp *bgp = VTY_GET_CONTEXT(bgp); + VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn); + + if (!bgp) + return CMD_WARNING; + + if (!vpn) + return CMD_WARNING; + + if (no) + evpn_set_advertise_svi_macip(bgp, vpn, 0); + else + evpn_set_advertise_svi_macip(bgp, vpn, 1); + + return CMD_SUCCESS; +} + DEFUN_HIDDEN (bgp_evpn_advertise_vni_subnet, bgp_evpn_advertise_vni_subnet_cmd, "advertise-subnet", @@ -3413,6 +3493,9 @@ DEFUN(show_bgp_l2vpn_evpn_vni, vty_out(vty, "Advertise Gateway Macip: %s\n", bgp_def->advertise_gw_macip ? "Enabled" : "Disabled"); + vty_out(vty, "Advertise SVI Macip: %s\n", + bgp_def->evpn_info->advertise_svi_macip ? "Enabled" + : "Disabled"); vty_out(vty, "Advertise All VNI flag: %s\n", is_evpn_enabled() ? "Enabled" : "Disabled"); vty_out(vty, "BUM flooding: %s\n", @@ -5075,6 +5158,9 @@ void bgp_config_write_evpn_info(struct vty *vty, struct bgp *bgp, afi_t afi, if (bgp->advertise_gw_macip) vty_out(vty, " advertise-default-gw\n"); + if (bgp->evpn_info->advertise_svi_macip) + vty_out(vty, " advertise-svi-ip\n"); + if (!bgp->evpn_info->dup_addr_detect) vty_out(vty, " no dup-addr-detection\n"); @@ -5185,6 +5271,7 @@ void bgp_ethernetvpn_init(void) install_element(BGP_EVPN_NODE, &no_bgp_evpn_advertise_autort_rfc8365_cmd); install_element(BGP_EVPN_NODE, &bgp_evpn_advertise_default_gw_cmd); install_element(BGP_EVPN_NODE, &no_bgp_evpn_advertise_default_gw_cmd); + install_element(BGP_EVPN_NODE, &bgp_evpn_advertise_svi_ip_cmd); install_element(BGP_EVPN_NODE, &bgp_evpn_advertise_type5_cmd); install_element(BGP_EVPN_NODE, &no_bgp_evpn_advertise_type5_cmd); install_element(BGP_EVPN_NODE, &bgp_evpn_default_originate_cmd); @@ -5241,6 +5328,7 @@ void bgp_ethernetvpn_init(void) install_element(BGP_NODE, &no_bgp_evpn_vrf_rd_without_val_cmd); install_element(BGP_EVPN_NODE, &bgp_evpn_vrf_rt_cmd); install_element(BGP_EVPN_NODE, &no_bgp_evpn_vrf_rt_cmd); + install_element(BGP_EVPN_VNI_NODE, &bgp_evpn_advertise_svi_ip_vni_cmd); install_element(BGP_EVPN_VNI_NODE, &bgp_evpn_advertise_default_gw_vni_cmd); install_element(BGP_EVPN_VNI_NODE, |