diff options
Diffstat (limited to 'zebra/zebra_vty.c')
| -rw-r--r-- | zebra/zebra_vty.c | 232 |
1 files changed, 142 insertions, 90 deletions
diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index 62869b7eec..f8c9833854 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -231,13 +231,19 @@ static int zebra_static_route_leak(struct vty *vty, type = STATIC_IPV6_GATEWAY; } - if (!negate) + if (!negate) { static_add_route(afi, safi, type, &p, src_p, gatep, ifname, bh_type, tag, distance, zvrf, nh_zvrf, &snh_label); - else + /* Mark as having FRR configuration */ + vrf_set_user_cfged(zvrf->vrf); + } else { static_delete_route(afi, safi, type, &p, src_p, gatep, ifname, tag, distance, zvrf, &snh_label); + /* If no other FRR config for this VRF, mark accordingly. */ + if (!zebra_vrf_has_config(zvrf)) + vrf_reset_user_cfged(zvrf->vrf); + } return CMD_SUCCESS; } @@ -247,19 +253,39 @@ static int zebra_static_route(struct vty *vty, afi_t afi, safi_t safi, const char *mask_str, const char *src_str, const char *gate_str, const char *ifname, const char *flag_str, const char *tag_str, - const char *distance_str, const char *vrf_id_str, + const char *distance_str, const char *vrf_name, const char *label_str) { struct zebra_vrf *zvrf; + struct vrf *vrf; /* VRF id */ - zvrf = zebra_vrf_lookup_by_name(vrf_id_str); + zvrf = zebra_vrf_lookup_by_name(vrf_name); - if (!zvrf) { - vty_out(vty, "%% vrf %s is not defined\n", vrf_id_str); + /* When trying to delete, the VRF must exist. */ + if (negate && !zvrf) { + vty_out(vty, "%% vrf %s is not defined\n", vrf_name); return CMD_WARNING_CONFIG_FAILED; } + /* When trying to create, create the VRF if it doesn't exist. + * Note: The VRF isn't active until we hear about it from the kernel. + */ + if (!zvrf) { + vrf = vrf_get(VRF_UNKNOWN, vrf_name); + if (!vrf) { + vty_out(vty, "%% Could not create vrf %s\n", vrf_name); + return CMD_WARNING_CONFIG_FAILED; + } + zvrf = vrf->info; + if (!zvrf) { + vty_out(vty, "%% Could not create vrf-info %s\n", + vrf_name); + return CMD_WARNING_CONFIG_FAILED; + } + /* Mark as having FRR configuration */ + vrf_set_user_cfged(vrf); + } return zebra_static_route_leak(vty, zvrf, zvrf, afi, safi, negate, dest_str, mask_str, src_str, gate_str, ifname, flag_str, tag_str, @@ -2286,16 +2312,67 @@ DEFUN (show_vrf, else vty_out(vty, "id %u table %u", zvrf_id(zvrf), zvrf->table_id); + if (vrf_is_user_cfged(vrf)) + vty_out(vty, " (configured)"); vty_out(vty, "\n"); } return CMD_SUCCESS; } +DEFUN (default_vrf_vni_mapping, + default_vrf_vni_mapping_cmd, + "vni " CMD_VNI_RANGE, + "VNI corresponding to the DEFAULT VRF\n" + "VNI-ID\n") +{ + int ret = 0; + char err[ERR_STR_SZ]; + struct zebra_vrf *zvrf = NULL; + vni_t vni = strtoul(argv[1]->arg, NULL, 10); + + zvrf = vrf_info_lookup(VRF_DEFAULT); + if (!zvrf) + return CMD_WARNING; + + ret = zebra_vxlan_process_vrf_vni_cmd(zvrf, vni, err, ERR_STR_SZ, 1); + if (ret != 0) { + vty_out(vty, "%s\n", err); + return CMD_WARNING; + } + + return CMD_SUCCESS; +} + +DEFUN (no_default_vrf_vni_mapping, + no_default_vrf_vni_mapping_cmd, + "no vni " CMD_VNI_RANGE, + NO_STR + "VNI corresponding to DEFAULT VRF\n" + "VNI-ID") +{ + int ret = 0; + char err[ERR_STR_SZ]; + vni_t vni = strtoul(argv[2]->arg, NULL, 10); + struct zebra_vrf *zvrf = NULL; + + zvrf = vrf_info_lookup(VRF_DEFAULT); + if (!zvrf) + return CMD_WARNING; + + ret = zebra_vxlan_process_vrf_vni_cmd(zvrf, vni, err, ERR_STR_SZ, 0); + if (ret != 0) { + vty_out(vty, "%s\n", err); + return CMD_WARNING; + } + + return CMD_SUCCESS; +} + DEFUN (vrf_vni_mapping, vrf_vni_mapping_cmd, "vni " CMD_VNI_RANGE, - "VNI\n" + "VNI corresponding to tenant VRF\n" "VNI-ID\n") { int ret = 0; @@ -2307,6 +2384,8 @@ DEFUN (vrf_vni_mapping, assert(vrf); assert(zvrf); + /* Mark as having FRR configuration */ + vrf_set_user_cfged(vrf); ret = zebra_vxlan_process_vrf_vni_cmd(zvrf, vni, err, ERR_STR_SZ, 1); if (ret != 0) { vty_out(vty, "%s\n", err); @@ -2320,7 +2399,7 @@ DEFUN (no_vrf_vni_mapping, no_vrf_vni_mapping_cmd, "no vni " CMD_VNI_RANGE, NO_STR - "VNI\n" + "VNI corresponding to tenant VRF\n" "VNI-ID") { int ret = 0; @@ -2338,6 +2417,10 @@ DEFUN (no_vrf_vni_mapping, return CMD_WARNING; } + /* If no other FRR config for this VRF, mark accordingly. */ + if (!zebra_vrf_has_config(zvrf)) + vrf_reset_user_cfged(vrf); + return CMD_SUCCESS; } @@ -2361,29 +2444,16 @@ DEFUN (show_vrf_vni, json_vrfs = json_object_new_array(); } + if (!uj) + vty_out(vty, "%-37s %-10s %-20s %-20s %-5s %-18s\n", + "VRF", "VNI", "VxLAN IF", "L3-SVI", "State", "Rmac"); + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) { zvrf = vrf->info; if (!zvrf) continue; - if (!zvrf->l3vni) - continue; - - if (!uj) { - vty_out(vty, "vrf: %s VNI: %u", - zvrf_name(zvrf), - zvrf->l3vni); - vty_out(vty, "\n"); - } else { - json_object *json_vrf = NULL; - - json_vrf = json_object_new_object(); - json_object_string_add(json_vrf, "vrf", - zvrf_name(zvrf)); - json_object_int_add(json_vrf, "l3vni", - zvrf->l3vni); - json_object_array_add(json_vrfs, json_vrf); - } + zebra_vxlan_print_vrf_vni(vty, zvrf, json_vrfs); } if (uj) { @@ -2396,6 +2466,19 @@ DEFUN (show_vrf_vni, return CMD_SUCCESS; } +DEFUN (show_evpn_global, + show_evpn_global_cmd, + "show evpn [json]", + SHOW_STR + "EVPN\n" + JSON_STR) +{ + u_char uj = use_json(argc, argv); + + zebra_vxlan_print_evpn(vty, uj); + return CMD_SUCCESS; +} + DEFUN (show_evpn_vni, show_evpn_vni_cmd, "show evpn vni [json]", @@ -2431,44 +2514,13 @@ DEFUN (show_evpn_vni_vni, return CMD_SUCCESS; } -DEFUN (show_evpn_l3vni, - show_evpn_l3vni_cmd, - "show evpn l3vni [json]", - SHOW_STR - "EVPN\n" - "L3 VNI\n" - JSON_STR) -{ - u_char uj = use_json(argc, argv); - - zebra_vxlan_print_l3vnis(vty, uj); - return CMD_SUCCESS; -} - -DEFUN (show_evpn_l3vni_vni, - show_evpn_l3vni_vni_cmd, - "show evpn l3vni " CMD_VNI_RANGE "[json]", - SHOW_STR - "EVPN\n" - "L3 VxLAN Network Identifier\n" - "VNI number\n" - JSON_STR) -{ - vni_t vni; - u_char uj = use_json(argc, argv); - - vni = strtoul(argv[3]->arg, NULL, 10); - zebra_vxlan_print_l3vni(vty, vni, uj); - return CMD_SUCCESS; -} - -DEFUN (show_evpn_rmac_l3vni_mac, - show_evpn_rmac_l3vni_mac_cmd, - "show evpn rmac l3vni " CMD_VNI_RANGE " mac WORD [json]", +DEFUN (show_evpn_rmac_vni_mac, + show_evpn_rmac_vni_mac_cmd, + "show evpn rmac vni " CMD_VNI_RANGE " mac WORD [json]", SHOW_STR "EVPN\n" "RMAC\n" - "L3-VNI\n" + "L3 VNI\n" "VNI number\n" "MAC\n" "mac-address (e.g. 0a:0a:0a:0a:0a:0a)\n" @@ -2487,13 +2539,13 @@ DEFUN (show_evpn_rmac_l3vni_mac, return CMD_SUCCESS; } -DEFUN (show_evpn_rmac_l3vni, - show_evpn_rmac_l3vni_cmd, - "show evpn rmac l3vni " CMD_VNI_RANGE "[json]", +DEFUN (show_evpn_rmac_vni, + show_evpn_rmac_vni_cmd, + "show evpn rmac vni " CMD_VNI_RANGE "[json]", SHOW_STR "EVPN\n" "RMAC\n" - "L3-VNI\n" + "L3 VNI\n" "VNI number\n" JSON_STR) { @@ -2506,13 +2558,13 @@ DEFUN (show_evpn_rmac_l3vni, return CMD_SUCCESS; } -DEFUN (show_evpn_rmac_l3vni_all, - show_evpn_rmac_l3vni_all_cmd, - "show evpn rmac l3vni all [json]", +DEFUN (show_evpn_rmac_vni_all, + show_evpn_rmac_vni_all_cmd, + "show evpn rmac vni all [json]", SHOW_STR "EVPN\n" "RMAC addresses\n" - "L3-VNI\n" + "L3 VNI\n" "All VNIs\n" JSON_STR) { @@ -2523,13 +2575,13 @@ DEFUN (show_evpn_rmac_l3vni_all, return CMD_SUCCESS; } -DEFUN (show_evpn_nh_l3vni_ip, - show_evpn_nh_l3vni_ip_cmd, - "show evpn next-hops l3vni " CMD_VNI_RANGE " ip WORD [json]", +DEFUN (show_evpn_nh_vni_ip, + show_evpn_nh_vni_ip_cmd, + "show evpn next-hops vni " CMD_VNI_RANGE " ip WORD [json]", SHOW_STR "EVPN\n" "Remote Vteps\n" - "L3-VNI\n" + "L3 VNI\n" "VNI number\n" "Ip address\n" "Host address (ipv4 or ipv6)\n" @@ -2550,13 +2602,13 @@ DEFUN (show_evpn_nh_l3vni_ip, return CMD_SUCCESS; } -DEFUN (show_evpn_nh_l3vni, - show_evpn_nh_l3vni_cmd, - "show evpn next-hops l3vni " CMD_VNI_RANGE "[json]", +DEFUN (show_evpn_nh_vni, + show_evpn_nh_vni_cmd, + "show evpn next-hops vni " CMD_VNI_RANGE "[json]", SHOW_STR "EVPN\n" "Remote Vteps\n" - "L3-VNI\n" + "L3 VNI\n" "VNI number\n" JSON_STR) { @@ -2569,13 +2621,13 @@ DEFUN (show_evpn_nh_l3vni, return CMD_SUCCESS; } -DEFUN (show_evpn_nh_l3vni_all, - show_evpn_nh_l3vni_all_cmd, - "show evpn next-hops l3vni all [json]", +DEFUN (show_evpn_nh_vni_all, + show_evpn_nh_vni_all_cmd, + "show evpn next-hops vni all [json]", SHOW_STR "EVPN\n" "Remote VTEPs\n" - "L3-VNI\n" + "L3 VNI\n" "All VNIs\n" JSON_STR) { @@ -3283,16 +3335,15 @@ void zebra_vty_init(void) /* Commands for VRF */ install_element(VIEW_NODE, &show_ipv6_mroute_vrf_all_cmd); + install_element(VIEW_NODE, &show_evpn_global_cmd); install_element(VIEW_NODE, &show_evpn_vni_cmd); install_element(VIEW_NODE, &show_evpn_vni_vni_cmd); - install_element(VIEW_NODE, &show_evpn_l3vni_cmd); - install_element(VIEW_NODE, &show_evpn_l3vni_vni_cmd); - install_element(VIEW_NODE, &show_evpn_rmac_l3vni_mac_cmd); - install_element(VIEW_NODE, &show_evpn_rmac_l3vni_cmd); - install_element(VIEW_NODE, &show_evpn_rmac_l3vni_all_cmd); - install_element(VIEW_NODE, &show_evpn_nh_l3vni_ip_cmd); - install_element(VIEW_NODE, &show_evpn_nh_l3vni_cmd); - install_element(VIEW_NODE, &show_evpn_nh_l3vni_all_cmd); + install_element(VIEW_NODE, &show_evpn_rmac_vni_mac_cmd); + install_element(VIEW_NODE, &show_evpn_rmac_vni_cmd); + install_element(VIEW_NODE, &show_evpn_rmac_vni_all_cmd); + install_element(VIEW_NODE, &show_evpn_nh_vni_ip_cmd); + install_element(VIEW_NODE, &show_evpn_nh_vni_cmd); + install_element(VIEW_NODE, &show_evpn_nh_vni_all_cmd); install_element(VIEW_NODE, &show_evpn_mac_vni_cmd); install_element(VIEW_NODE, &show_evpn_mac_vni_all_cmd); install_element(VIEW_NODE, &show_evpn_mac_vni_all_vtep_cmd); @@ -3303,7 +3354,8 @@ void zebra_vty_init(void) install_element(VIEW_NODE, &show_evpn_neigh_vni_neigh_cmd); install_element(VIEW_NODE, &show_evpn_neigh_vni_vtep_cmd); - install_element(CONFIG_NODE, &no_vrf_vni_mapping_cmd); + install_element(CONFIG_NODE, &default_vrf_vni_mapping_cmd); + install_element(CONFIG_NODE, &no_default_vrf_vni_mapping_cmd); install_element(VRF_NODE, &vrf_vni_mapping_cmd); install_element(VRF_NODE, &no_vrf_vni_mapping_cmd); |
