From 4fd9919ecf553f8354944390bdc944fe64319fbf Mon Sep 17 00:00:00 2001 From: Igor Ryzhov Date: Fri, 14 May 2021 01:39:29 +0300 Subject: [PATCH] Revert "bgpd: remove duplicated checks from CLI" This reverts commit 45d1d7c9a2b7b41125e565af566e10d470349122. --- bgpd/bgp_nb_config.c | 50 ++---------------------------- bgpd/bgp_vty.c | 72 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 70 insertions(+), 52 deletions(-) diff --git a/bgpd/bgp_nb_config.c b/bgpd/bgp_nb_config.c index 5c238adb3d..65e30d20c4 100644 --- a/bgpd/bgp_nb_config.c +++ b/bgpd/bgp_nb_config.c @@ -160,54 +160,8 @@ int bgp_router_destroy(struct nb_cb_destroy_args *args) struct bgp *tmp_bgp; for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, tmp_bgp)) { - if (tmp_bgp->inst_type != BGP_INSTANCE_TYPE_VRF) - continue; - if (CHECK_FLAG(tmp_bgp->af_flags[AFI_IP] - [SAFI_UNICAST], - BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT) - || CHECK_FLAG( - tmp_bgp->af_flags[AFI_IP6] - [SAFI_UNICAST], - BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT) - || CHECK_FLAG( - tmp_bgp->af_flags[AFI_IP] - [SAFI_UNICAST], - BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT) - || CHECK_FLAG( - tmp_bgp->af_flags[AFI_IP6] - [SAFI_UNICAST], - BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT) - || CHECK_FLAG( - tmp_bgp->af_flags[AFI_IP] - [SAFI_UNICAST], - BGP_CONFIG_VRF_TO_VRF_EXPORT) - || CHECK_FLAG( - tmp_bgp->af_flags[AFI_IP6] - [SAFI_UNICAST], - BGP_CONFIG_VRF_TO_VRF_EXPORT) - || (bgp == bgp_get_evpn() - && (CHECK_FLAG( - tmp_bgp->af_flags - [AFI_L2VPN] - [SAFI_EVPN], - BGP_L2VPN_EVPN_ADV_IPV4_UNICAST) - || CHECK_FLAG( - tmp_bgp->af_flags - [AFI_L2VPN] - [SAFI_EVPN], - BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP) - || CHECK_FLAG( - tmp_bgp->af_flags - [AFI_L2VPN] - [SAFI_EVPN], - BGP_L2VPN_EVPN_ADV_IPV6_UNICAST) - || CHECK_FLAG( - tmp_bgp->af_flags - [AFI_L2VPN] - [SAFI_EVPN], - BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP))) - || (tmp_bgp->vnihash - && hashcount(tmp_bgp->vnihash))) { + if (tmp_bgp->inst_type + == BGP_INSTANCE_TYPE_VRF) { snprintf( args->errmsg, args->errmsg_len, "Cannot delete default BGP instance. Dependent VRF instances exist\n"); diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index 6acce23d54..aa3070b204 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -1486,7 +1486,10 @@ DEFUN_YANG(no_router_bgp, "no router bgp [(1-4294967295)$instasn [ VIEWVRFNAME]]", NO_STR ROUTER_STR BGP_STR AS_STR BGP_INSTANCE_HELP_STR) { + int idx_asn = 3; int idx_vrf = 5; + as_t as = 0; + struct bgp *bgp; const char *name = NULL; char base_xpath[XPATH_MAXLEN]; const struct lyd_node *bgp_glb_dnode; @@ -1508,15 +1511,76 @@ DEFUN_YANG(no_router_bgp, vty_out(vty, "%% Please specify ASN and VRF\n"); return CMD_WARNING_CONFIG_FAILED; } + + /* tcli mode bgp would not be set until apply stage. */ + bgp = nb_running_get_entry(bgp_glb_dnode, NULL, false); + if (!bgp) + return CMD_SUCCESS; + + if (bgp->l3vni) { + vty_out(vty, "%% Please unconfigure l3vni %u", + bgp->l3vni); + return CMD_WARNING_CONFIG_FAILED; + } } else { + as = strtoul(argv[idx_asn]->arg, NULL, 10); + if (argc > 4) name = argv[idx_vrf]->arg; - else - name = VRF_DEFAULT_NAME; - snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_GLOBAL_XPATH, - "frr-bgp:bgp", "bgp", name); + /* Lookup bgp structure. */ + bgp = bgp_lookup(as, name); + if (!bgp) { + vty_out(vty, "%% Can't find BGP instance\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + if (bgp->l3vni) { + vty_out(vty, "%% Please unconfigure l3vni %u\n", + bgp->l3vni); + return CMD_WARNING_CONFIG_FAILED; + } + + /* Cannot delete default instance if vrf instances exist */ + if (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT) { + struct listnode *node; + struct bgp *tmp_bgp; + + for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, tmp_bgp)) { + if (tmp_bgp->inst_type != BGP_INSTANCE_TYPE_VRF) + continue; + if (CHECK_FLAG(tmp_bgp->af_flags[AFI_IP][SAFI_UNICAST], + BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT) || + CHECK_FLAG(tmp_bgp->af_flags[AFI_IP6][SAFI_UNICAST], + BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT) || + CHECK_FLAG(tmp_bgp->af_flags[AFI_IP][SAFI_UNICAST], + BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT) || + CHECK_FLAG(tmp_bgp->af_flags[AFI_IP6][SAFI_UNICAST], + BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT) || + CHECK_FLAG(tmp_bgp->af_flags[AFI_IP][SAFI_UNICAST], + BGP_CONFIG_VRF_TO_VRF_EXPORT) || + CHECK_FLAG(tmp_bgp->af_flags[AFI_IP6][SAFI_UNICAST], + BGP_CONFIG_VRF_TO_VRF_EXPORT) || + (bgp == bgp_get_evpn() && + (CHECK_FLAG(tmp_bgp->af_flags[AFI_L2VPN][SAFI_EVPN], + BGP_L2VPN_EVPN_ADV_IPV4_UNICAST) || + CHECK_FLAG(tmp_bgp->af_flags[AFI_L2VPN][SAFI_EVPN], + BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP) || + CHECK_FLAG(tmp_bgp->af_flags[AFI_L2VPN][SAFI_EVPN], + BGP_L2VPN_EVPN_ADV_IPV6_UNICAST) || + CHECK_FLAG(tmp_bgp->af_flags[AFI_L2VPN][SAFI_EVPN], + BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP))) || + (tmp_bgp->vnihash && hashcount(tmp_bgp->vnihash))) { + vty_out(vty, + "%% Cannot delete default BGP instance. Dependent VRF instances exist\n"); + return CMD_WARNING_CONFIG_FAILED; + } + } + } } + snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_GLOBAL_XPATH, + "frr-bgp:bgp", "bgp", + bgp->name ? bgp->name : VRF_DEFAULT_NAME); nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); -- 2.39.5