]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: advertise svi ip as macip config cmd
authorChirag Shah <chirag@cumulusnetworks.com>
Mon, 4 Feb 2019 02:08:46 +0000 (18:08 -0800)
committerChirag Shah <chirag@cumulusnetworks.com>
Thu, 7 Feb 2019 03:57:47 +0000 (19:57 -0800)
Ticket:CM-23782

Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
bgpd/bgp_evpn_private.h
bgpd/bgp_evpn_vty.c

index 43b1f05b3db49fa94b3ea141a0be580850729e96..c7f2671b78377ca2e9c4446044f4a9976f52cbd0 100644 (file)
@@ -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)
index a7da3922be9fef8871b27fdabab7bd57c8949ee5..a3d8b8a6474313e5ed1dc190f0a2bb433060c959 100644 (file)
@@ -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)
@@ -2618,6 +2620,33 @@ static void evpn_show_all_vnis(struct vty *vty, struct bgp *bgp,
                show_l3vni_entry(vty, bgp_temp, json);
 }
 
+/*
+ * 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
  */
@@ -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,