From 4cce389e0ee6e661f5761dbb9baabb941eceee14 Mon Sep 17 00:00:00 2001 From: Mitesh Kanjariya Date: Wed, 15 Nov 2017 01:01:00 -0800 Subject: [PATCH] bgpd/zebra: show command enhancements for EVPN symmetric routing 0. move all global EVPN details to 'show evpn [json]' command 1. change "VRF" to "Tenant VRF" in 'show evpn vni' 2. change 'show vrf vni' command to tabular form and add l3-vni related params to the output 3. show evpn rmac should show refcount only in detailed output 4. show evpn next-hop should show refcount only in detailed output 5. move VRF in 'show evpn l3vni' to the end 6. add num rmacs and num nexthops to show evpn l3vni 7. remove "info" from 'show bgp vrf <> l3vni info' 8. show evpn vni should show l2vni details or l3 vni details 9. show evpn vni should show both L2 and L3 VNIs 10. show bgp l2vpn evpn - shows all global bgp l2vpn evpn details 11. show bgp l2vpn evpn vni - will show both l2 and l3 vnis 12. show bgp l2vpn evpn vni - should show both l2 and l3 vnis 13. follow camel notation for all json keys Signed-off-by: Mitesh Kanjariya --- bgpd/bgp_evpn_vty.c | 267 +++++++++++++++++++++++++++---- zebra/zebra_vty.c | 130 ++++++--------- zebra/zebra_vxlan.c | 333 ++++++++++++++++++++++----------------- zebra/zebra_vxlan.h | 7 +- zebra/zebra_vxlan_null.c | 8 +- 5 files changed, 487 insertions(+), 258 deletions(-) diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c index 932046f7e0..7d4a199f02 100644 --- a/bgpd/bgp_evpn_vty.c +++ b/bgpd/bgp_evpn_vty.c @@ -335,6 +335,83 @@ static void bgp_evpn_show_route_header(struct vty *vty, struct bgp *bgp, vty_out(vty, "%s", ri_header); } +static void display_l3vni(struct vty *vty, struct bgp *bgp_vrf, + json_object *json) +{ + char buf1[INET6_ADDRSTRLEN]; + char *ecom_str; + struct listnode *node, *nnode; + struct ecommunity *ecom; + json_object *json_import_rtl = NULL; + json_object *json_export_rtl = NULL; + + json_import_rtl = json_export_rtl = 0; + + if (json) { + json_import_rtl = json_object_new_array(); + json_export_rtl = json_object_new_array(); + json_object_int_add(json, "vni", bgp_vrf->l3vni); + json_object_string_add(json, "type", "L3"); + json_object_string_add(json, "kernelFlag", "Yes"); + json_object_string_add( + json, "rd", + prefix_rd2str(&bgp_vrf->vrf_prd, buf1, RD_ADDRSTRLEN)); + json_object_string_add(json, "originatorIp", + inet_ntoa(bgp_vrf->originator_ip)); + json_object_string_add(json, "advertiseGatewayMacip", "n/a"); + } else { + vty_out(vty, "VNI: %d", bgp_vrf->l3vni); + vty_out(vty, " (known to the kernel)"); + vty_out(vty, "\n"); + + vty_out(vty, " Type: %s\n", "L3"); + vty_out(vty, " Tenant VRF: %s\n", + vrf_id_to_name(bgp_vrf->vrf_id)); + vty_out(vty, " RD: %s\n", + prefix_rd2str(&bgp_vrf->vrf_prd, buf1, RD_ADDRSTRLEN)); + vty_out(vty, " Originator IP: %s\n", + inet_ntoa(bgp_vrf->originator_ip)); + vty_out(vty, " Advertise-gw-macip : %s\n", "n/a"); + } + + if (!json) + vty_out(vty, " Import Route Target:\n"); + + for (ALL_LIST_ELEMENTS(bgp_vrf->vrf_import_rtl, node, nnode, ecom)) { + ecom_str = ecommunity_ecom2str(ecom, + ECOMMUNITY_FORMAT_ROUTE_MAP, 0); + + if (json) + json_object_array_add(json_import_rtl, + json_object_new_string(ecom_str)); + else + vty_out(vty, " %s\n", ecom_str); + + XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); + } + + if (json) + json_object_object_add(json, "importRts", json_import_rtl); + else + vty_out(vty, " Export Route Target:\n"); + + for (ALL_LIST_ELEMENTS(bgp_vrf->vrf_export_rtl, node, nnode, ecom)) { + ecom_str = ecommunity_ecom2str(ecom, + ECOMMUNITY_FORMAT_ROUTE_MAP, 0); + + if (json) + json_object_array_add(json_export_rtl, + json_object_new_string(ecom_str)); + else + vty_out(vty, " %s\n", ecom_str); + + XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); + } + + if (json) + json_object_object_add(json, "exportRts", json_export_rtl); +} + static void display_vni(struct vty *vty, struct bgpevpn *vpn, json_object *json) { char buf1[RD_ADDRSTRLEN]; @@ -348,6 +425,7 @@ static void display_vni(struct vty *vty, struct bgpevpn *vpn, json_object *json) json_import_rtl = json_object_new_array(); json_export_rtl = json_object_new_array(); json_object_int_add(json, "vni", vpn->vni); + json_object_string_add(json, "type", "L2"); json_object_string_add(json, "kernelFlag", is_vni_live(vpn) ? "Yes" : "No"); json_object_string_add( @@ -363,6 +441,7 @@ static void display_vni(struct vty *vty, struct bgpevpn *vpn, json_object *json) vty_out(vty, " (known to the kernel)"); vty_out(vty, "\n"); + vty_out(vty, " Type: %s\n", "L2"); vty_out(vty, " Tenant-Vrf: %s\n", vrf_id_to_name(vpn->tenant_vrf_id)); vty_out(vty, " RD: %s\n", @@ -570,6 +649,108 @@ static void show_vni_routes_hash(struct hash_backet *backet, void *arg) json_object_object_add(json, vni_str, json_vni); } +static void show_l3vni_entry(struct vty *vty, struct bgp *bgp, + json_object *json) +{ + json_object *json_vni; + json_object *json_import_rtl; + json_object *json_export_rtl; + char buf1[10]; + char buf2[INET6_ADDRSTRLEN]; + char rt_buf[25]; + char *ecom_str; + struct listnode *node, *nnode; + struct ecommunity *ecom; + + if (!bgp->l3vni) + return; + + if (json) { + json_vni = json_object_new_object(); + json_import_rtl = json_object_new_array(); + json_export_rtl = json_object_new_array(); + } + + /* if an l3vni is present in bgp it is live */ + buf1[0] = '\0'; + sprintf(buf1, "*"); + + if (json) { + json_object_int_add(json_vni, "vni", bgp->l3vni); + json_object_string_add(json_vni, "type", "L3"); + json_object_string_add(json_vni, "inKernel", "True"); + json_object_string_add( + json_vni, "rd", + prefix_rd2str(&bgp->vrf_prd, buf2, RD_ADDRSTRLEN)); + } else { + vty_out(vty, "%-1s %-10u %-4s %-21s", + buf1, bgp->l3vni, "L3", + prefix_rd2str(&bgp->vrf_prd, buf2, RD_ADDRSTRLEN)); + } + + for (ALL_LIST_ELEMENTS(bgp->vrf_import_rtl, node, nnode, ecom)) { + ecom_str = ecommunity_ecom2str(ecom, + ECOMMUNITY_FORMAT_ROUTE_MAP, 0); + + if (json) { + json_object_array_add(json_import_rtl, + json_object_new_string(ecom_str)); + } else { + if (listcount(bgp->vrf_import_rtl) > 1) + sprintf(rt_buf, "%s, ...", ecom_str); + else + sprintf(rt_buf, "%s", ecom_str); + vty_out(vty, " %-25s", rt_buf); + } + + XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); + + /* If there are multiple import RTs we break here and show only + * one */ + if (!json) + break; + } + + if (json) + json_object_object_add(json_vni, "importRTs", json_import_rtl); + + for (ALL_LIST_ELEMENTS(bgp->vrf_export_rtl, node, nnode, ecom)) { + ecom_str = ecommunity_ecom2str(ecom, + ECOMMUNITY_FORMAT_ROUTE_MAP, 0); + + if (json) { + json_object_array_add(json_export_rtl, + json_object_new_string(ecom_str)); + } else { + if (listcount(bgp->vrf_export_rtl) > 1) + sprintf(rt_buf, "%s, ...", ecom_str); + else + sprintf(rt_buf, "%s", ecom_str); + vty_out(vty, " %-25s", rt_buf); + } + + XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); + + /* If there are multiple export RTs we break here and show only + * one */ + if (!json) + break; + } + + if (!json) + vty_out(vty, "%-37s", vrf_id_to_name(bgp->vrf_id)); + + if (json) { + char vni_str[VNI_STR_LEN]; + + json_object_object_add(json_vni, "exportRTs", json_export_rtl); + snprintf(vni_str, VNI_STR_LEN, "%u", bgp->l3vni); + json_object_object_add(json, vni_str, json_vni); + } else { + vty_out(vty, "\n"); + } +} + static void show_vni_entry(struct hash_backet *backet, void *args[]) { struct vty *vty; @@ -600,6 +781,7 @@ static void show_vni_entry(struct hash_backet *backet, void *args[]) if (json) { json_object_int_add(json_vni, "vni", vpn->vni); + json_object_string_add(json_vni, "type", "L2"); json_object_string_add(json_vni, "inKernel", is_vni_live(vpn) ? "True" : "False"); json_object_string_add(json_vni, "originatorIp", @@ -608,8 +790,8 @@ static void show_vni_entry(struct hash_backet *backet, void *args[]) json_vni, "rd", prefix_rd2str(&vpn->prd, buf2, sizeof(buf2))); } else { - vty_out(vty, "%-1s %-10u %-15s %-21s", buf1, vpn->vni, - inet_ntoa(vpn->originator_ip), + vty_out(vty, "%-1s %-10u %-4s %-21s", + buf1, vpn->vni, "L2", prefix_rd2str(&vpn->prd, buf2, RD_ADDRSTRLEN)); } @@ -2181,10 +2363,26 @@ static void evpn_show_all_routes(struct vty *vty, struct bgp *bgp, int type, static void evpn_show_vni(struct vty *vty, struct bgp *bgp, vni_t vni, json_object *json) { + u_char found = 0; struct bgpevpn *vpn; vpn = bgp_evpn_lookup_vni(bgp, vni); - if (!vpn) { + if (vpn) { + found = 1; + display_vni(vty, vpn, json); + } else { + struct bgp *bgp_temp; + struct listnode *node = NULL; + + for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, bgp_temp)) { + if (bgp_temp->l3vni == vni) { + found = 1; + display_l3vni(vty, bgp_temp, json); + } + } + } + + if (!found) { if (json) { vty_out(vty, "{}\n"); } else { @@ -2192,8 +2390,6 @@ static void evpn_show_vni(struct vty *vty, struct bgp *bgp, vni_t vni, return; } } - - display_vni(vty, vpn, json); } /* @@ -2202,28 +2398,29 @@ static void evpn_show_vni(struct vty *vty, struct bgp *bgp, vni_t vni, static void evpn_show_all_vnis(struct vty *vty, struct bgp *bgp, json_object *json) { - u_int32_t num_vnis; void *args[2]; + struct bgp *bgp_temp = NULL; + struct listnode *node; - num_vnis = hashcount(bgp->vnihash); - if (!num_vnis) - return; - if (json) { - json_object_int_add(json, "numVnis", num_vnis); - } else { - vty_out(vty, "Number of VNIs: %u\n", num_vnis); + if (!json) { vty_out(vty, "Flags: * - Kernel\n"); - vty_out(vty, " %-10s %-15s %-21s %-25s %-25s %-37s\n", "VNI", - "Orig IP", "RD", "Import RT", - "Export RT", "Tenant-Vrf"); + vty_out(vty, " %-10s %-4s %-21s %-25s %-25s %-37s\n", "VNI", + "Type", "RD", "Import RT", + "Export RT", "Tenant VRF"); } + /* print all L2 VNIS */ args[0] = vty; args[1] = json; hash_iterate(bgp->vnihash, (void (*)(struct hash_backet *, void *))show_vni_entry, args); + + /* print all L3 VNIs */ + for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, bgp_temp)) + show_l3vni_entry(vty, bgp_temp, json); + } /* @@ -2642,16 +2839,20 @@ DEFUN(show_bgp_l2vpn_evpn_vni, "VNI number\n" JSON_STR) { - struct bgp *bgp; + struct bgp *bgp_def; vni_t vni; int idx = 0; u_char uj = 0; json_object *json = NULL; + u_int32_t num_l2vnis = 0; + u_int32_t num_l3vnis = 0; + struct listnode *node = NULL; + struct bgp *bgp_temp = NULL; uj = use_json(argc, argv); - bgp = bgp_get_default(); - if (!bgp) + bgp_def = bgp_get_default(); + if (!bgp_def) return CMD_WARNING; if (!argv_find(argv, argc, "evpn", &idx)) @@ -2661,26 +2862,36 @@ DEFUN(show_bgp_l2vpn_evpn_vni, json = json_object_new_object(); if ((uj && argc == ((idx + 1) + 2)) || (!uj && argc == (idx + 1) + 1)) { + + num_l2vnis = hashcount(bgp_def->vnihash); + if (!num_l2vnis) + return CMD_SUCCESS; + + for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, bgp_temp)) { + if (bgp_temp->l3vni) + num_l3vnis++; + } if (uj) { json_object_string_add(json, "advertiseGatewayMacip", - bgp->advertise_gw_macip + bgp_def->advertise_gw_macip ? "Enabled" : "Disabled"); json_object_string_add(json, "advertiseAllVnis", is_evpn_enabled() ? "Enabled" : "Disabled"); + json_object_int_add(json, "numL2Vnis", num_l2vnis); + json_object_int_add(json, "numL3Vnis", num_l3vnis); } else { vty_out(vty, "Advertise Gateway Macip: %s\n", - bgp->advertise_gw_macip ? "Enabled" + bgp_def->advertise_gw_macip ? "Enabled" : "Disabled"); - - /* Display all VNIs */ vty_out(vty, "Advertise All VNI flag: %s\n", is_evpn_enabled() ? "Enabled" : "Disabled"); + vty_out(vty, "Number of L2 VNIs: %u\n", num_l2vnis); + vty_out(vty, "Number of L3 VNIs: %u\n", num_l3vnis); } - - evpn_show_all_vnis(vty, bgp, json); + evpn_show_all_vnis(vty, bgp_def, json); } else { int vni_idx = 0; @@ -2689,7 +2900,7 @@ DEFUN(show_bgp_l2vpn_evpn_vni, /* Display specific VNI */ vni = strtoul(argv[vni_idx + 1]->arg, NULL, 10); - evpn_show_vni(vty, bgp, vni, json); + evpn_show_vni(vty, bgp_def, vni, json); } if (uj) { @@ -2767,7 +2978,6 @@ DEFUN(show_bgp_l2vpn_evpn_route, json, JSON_C_TO_STRING_PRETTY)); json_object_free(json); } - return CMD_SUCCESS; } @@ -3623,13 +3833,12 @@ static int bgp_evpn_rt_matches_existing(struct list *rtl, /* display L3VNI related info for a VRF instance */ DEFUN (show_bgp_vrf_l3vni_info, show_bgp_vrf_l3vni_info_cmd, - "show bgp vrf VRFNAME l3vni info [json]", + "show bgp vrf VRFNAME vni [json]", SHOW_STR BGP_STR "show bgp vrf\n" "VRF Name\n" "L3-VNI\n" - "L3-VNI info\n" JSON_STR) { char buf[ETHER_ADDR_STRLEN]; diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index 3b731a64dd..fc4e37f0f9 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -2393,29 +2393,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) { @@ -2428,6 +2415,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]", @@ -2463,44 +2463,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" @@ -2519,13 +2488,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) { @@ -2538,13 +2507,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) { @@ -2555,13 +2524,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" @@ -2582,13 +2551,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) { @@ -2601,13 +2570,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) { @@ -3315,16 +3284,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); diff --git a/zebra/zebra_vxlan.c b/zebra/zebra_vxlan.c index 6b92d80953..47aa883d11 100644 --- a/zebra/zebra_vxlan.c +++ b/zebra/zebra_vxlan.c @@ -46,7 +46,6 @@ #include "zebra/zebra_vxlan.h" #include "zebra/zebra_memory.h" #include "zebra/zebra_l2.h" -#include "lib/json.h" DEFINE_MTYPE_STATIC(ZEBRA, HOST_PREFIX, "host prefix"); DEFINE_MTYPE_STATIC(ZEBRA, ZVNI, "VNI hash"); @@ -451,7 +450,8 @@ static void zl3vni_print_nh(zebra_neigh_t *n, ipaddr2str(&n->ip, buf2, sizeof(buf2))); vty_out(vty, " RMAC: %s\n", prefix_mac2str(&n->emac, buf1, sizeof(buf1))); - vty_out(vty, " Host-List:\n"); + vty_out(vty, " Refcount: %d\n", listcount(n->host_list)); + vty_out(vty, " Prefixes:\n"); for (ALL_LIST_ELEMENTS_RO(n->host_list, node, p)) vty_out(vty, " %s\n", prefix2str(p, buf2, sizeof(buf2))); @@ -460,15 +460,16 @@ static void zl3vni_print_nh(zebra_neigh_t *n, json_object_string_add(json, "ip", ipaddr2str(&(n->ip), buf2, sizeof(buf2))); - json_object_string_add(json, "rmac", + json_object_string_add(json, "routerMac", prefix_mac2str(&n->emac, buf2, sizeof(buf2))); + json_object_int_add(json, "refCount", listcount(n->host_list)); for (ALL_LIST_ELEMENTS_RO(n->host_list, node, p)) json_object_array_add(json_hosts, json_object_new_string( prefix2str(p, buf2, sizeof(buf2)))); - json_object_object_add(json, "hosts", json_hosts); + json_object_object_add(json, "prefixList", json_hosts); } } @@ -488,24 +489,27 @@ static void zl3vni_print_rmac(zebra_mac_t *zrmac, prefix_mac2str(&zrmac->macaddr, buf1, sizeof(buf1))); vty_out(vty, " Remote VTEP: %s\n", inet_ntoa(zrmac->fwd_info.r_vtep_ip)); - vty_out(vty, " Host-List:\n"); + vty_out(vty, " Refcount: %d\n", listcount(zrmac->host_list)); + vty_out(vty, " Prefixes:\n"); for (ALL_LIST_ELEMENTS_RO(zrmac->host_list, node, p)) vty_out(vty, " %s\n", prefix2str(p, buf2, sizeof(buf2))); } else { json_hosts = json_object_new_array(); - json_object_string_add(json, "Rmac", + json_object_string_add(json, "routerMac", prefix_mac2str(&zrmac->macaddr, buf1, sizeof(buf1))); - json_object_string_add(json, "vtep-ip", + json_object_string_add(json, "vtepIp", inet_ntoa(zrmac->fwd_info.r_vtep_ip)); + json_object_int_add(json, "refCount", + listcount(zrmac->host_list)); for (ALL_LIST_ELEMENTS_RO(zrmac->host_list, node, p)) json_object_array_add(json_hosts, json_object_new_string( prefix2str(p, buf2, sizeof(buf2)))); - json_object_object_add(json, "hosts", json_hosts); + json_object_object_add(json, "prefixList", json_hosts); } } @@ -754,17 +758,15 @@ static void zl3vni_print_nh_hash(struct hash_backet *backet, return; if (!json_vni) { - vty_out(vty, "%-15s %-17s %6d\n", + vty_out(vty, "%-15s %-17s\n", ipaddr2str(&(n->ip), buf2, sizeof(buf2)), - prefix_mac2str(&n->emac, buf1, sizeof(buf1)), - listcount(n->host_list)); + prefix_mac2str(&n->emac, buf1, sizeof(buf1))); } else { - json_object_string_add(json_nh, "nexthop-ip", + json_object_string_add(json_nh, "nexthopIp", ipaddr2str(&n->ip, buf2, sizeof(buf2))); - json_object_string_add(json_nh, "rmac", + json_object_string_add(json_nh, "routerMac", prefix_mac2str(&n->emac, buf1, sizeof(buf1))); - json_object_int_add(json_nh, "refCnt", listcount(n->host_list)); json_object_object_add(json_vni, ipaddr2str(&(n->ip), buf2, sizeof(buf2)), json_nh); @@ -804,10 +806,9 @@ static void zl3vni_print_nh_hash_all_vni(struct hash_backet *backet, if (json == NULL) { vty_out(vty, "\nVNI %u #Next-Hops %u\n\n", zl3vni->vni, num_nh); - vty_out(vty, "%-15s %-17s %6s\n", "IP", - "RMAC", "Refcnt"); + vty_out(vty, "%-15s %-17s\n", "IP", "RMAC"); } else - json_object_int_add(json_vni, "numNh", num_nh); + json_object_int_add(json_vni, "numNextHops", num_nh); memset(&wctx, 0, sizeof(struct nh_walk_ctx)); wctx.vty = vty; @@ -848,10 +849,9 @@ static void zl3vni_print_rmac_hash_all_vni(struct hash_backet *backet, } if (json == NULL) { - vty_out(vty, "\nVNI %u #MACs %u\n\n", + vty_out(vty, "\nVNI %u #RMACs %u\n\n", zl3vni->vni, num_rmacs); - vty_out(vty, "%-17s %-21s %-6s\n", "MAC", - "Remote VTEP", "Refcnt"); + vty_out(vty, "%-17s %-21s\n", "RMAC", "Remote VTEP"); } else json_object_int_add(json_vni, "numRmacs", num_rmacs); @@ -887,18 +887,15 @@ static void zl3vni_print_rmac_hash(struct hash_backet *backet, return; if (!json) { - vty_out(vty, "%-17s %-21s %-6d\n", + vty_out(vty, "%-17s %-21s\n", prefix_mac2str(&zrmac->macaddr, buf, sizeof(buf)), - inet_ntoa(zrmac->fwd_info.r_vtep_ip), - listcount(zrmac->host_list)); + inet_ntoa(zrmac->fwd_info.r_vtep_ip)); } else { - json_object_string_add(json_rmac, "rmac", + json_object_string_add(json_rmac, "routerMac", prefix_mac2str(&zrmac->macaddr, buf, sizeof(buf))); - json_object_string_add(json_rmac, "vtep-ip", + json_object_string_add(json_rmac, "vtepIp", inet_ntoa(zrmac->fwd_info.r_vtep_ip)); - json_object_int_add(json_rmac, "refcnt", - listcount(zrmac->host_list)); json_object_object_add(json, prefix_mac2str(&zrmac->macaddr, buf, sizeof(buf)), @@ -921,7 +918,10 @@ static void zl3vni_print(zebra_l3vni_t *zl3vni, void **ctx) if (!json) { vty_out(vty, "VNI: %u\n", zl3vni->vni); - vty_out(vty, " Local Vtep Ip: %s", + vty_out(vty, " Type: %s\n", "L3"); + vty_out(vty, " Tenant VRF: %s\n", + zl3vni_vrf_name(zl3vni)); + vty_out(vty, " Local Vtep Ip: %s\n", inet_ntoa(zl3vni->local_vtep_ip)); vty_out(vty, " Vxlan-Intf: %s\n", zl3vni_vxlan_if_name(zl3vni)); @@ -929,35 +929,34 @@ static void zl3vni_print(zebra_l3vni_t *zl3vni, void **ctx) zl3vni_svi_if_name(zl3vni)); vty_out(vty, " State: %s\n", zl3vni_state2str(zl3vni)); - vty_out(vty, " Vrf: %s\n", - zl3vni_vrf_name(zl3vni)); - vty_out(vty, " Rmac: %s\n", + vty_out(vty, " Router MAC: %s\n", zl3vni_rmac2str(zl3vni, buf, sizeof(buf))); - vty_out(vty, " L2-VNIs: "); + vty_out(vty, " L2 VNIs: "); for (ALL_LIST_ELEMENTS(zl3vni->l2vnis, node, nnode, zvni)) vty_out(vty, "%u ", zvni->vni); vty_out(vty, "\n"); } else { json_vni_list = json_object_new_array(); json_object_int_add(json, "vni", zl3vni->vni); - json_object_string_add(json, "local-vtep-ip", + json_object_string_add(json, "type", "L3"); + json_object_string_add(json, "localVtepIp", inet_ntoa(zl3vni->local_vtep_ip)); - json_object_string_add(json, "vxlan-intf", + json_object_string_add(json, "vxlanIntf", zl3vni_vxlan_if_name(zl3vni)); - json_object_string_add(json, "svi-if", + json_object_string_add(json, "sviIntf", zl3vni_svi_if_name(zl3vni)); json_object_string_add(json, "state", zl3vni_state2str(zl3vni)); json_object_string_add(json, "vrf", zl3vni_vrf_name(zl3vni)); - json_object_string_add(json, "rmac", + json_object_string_add(json, "routerMac", zl3vni_rmac2str(zl3vni, buf, sizeof(buf))); for (ALL_LIST_ELEMENTS(zl3vni->l2vnis, node, nnode, zvni)) { json_object_array_add(json_vni_list, json_object_new_int(zvni->vni)); } - json_object_object_add(json, "l2-vnis", json_vni_list); + json_object_object_add(json, "l2Vnis", json_vni_list); } } @@ -979,9 +978,11 @@ static void zvni_print(zebra_vni_t *zvni, void **ctxt) if (json == NULL) { vty_out(vty, "VNI: %u\n", zvni->vni); - vty_out(vty, " VRF: %s\n", vrf_id_to_name(zvni->vrf_id)); + vty_out(vty, " Type: %s\n", "L2"); + vty_out(vty, " Tenant VRF: %s\n", vrf_id_to_name(zvni->vrf_id)); } else { json_object_int_add(json, "vni", zvni->vni); + json_object_string_add(json, "type", "L2"); json_object_string_add(json, "vrf", vrf_id_to_name(zvni->vrf_id)); } @@ -993,11 +994,13 @@ static void zvni_print(zebra_vni_t *zvni, void **ctxt) } num_macs = num_valid_macs(zvni); num_neigh = hashcount(zvni->neigh_table); - if (json == NULL) - vty_out(vty, " VxLAN interface: %s ifIndex: %u VTEP IP: %s\n", - zvni->vxlan_if->name, zvni->vxlan_if->ifindex, + if (json == NULL) { + vty_out(vty, " VxLAN interface: %s\n", + zvni->vxlan_if->name); + vty_out(vty, " VxLAN ifIndex: %u\n", zvni->vxlan_if->ifindex); + vty_out(vty," Local VTEP IP: %s\n", inet_ntoa(zvni->local_vtep_ip)); - else { + } else { json_object_string_add(json, "vxlanInterface", zvni->vxlan_if->name); json_object_int_add(json, "ifindex", zvni->vxlan_if->ifindex); @@ -1048,7 +1051,6 @@ static void zvni_print(zebra_vni_t *zvni, void **ctxt) static void zl3vni_print_hash(struct hash_backet *backet, void *ctx[]) { - char buf[ETHER_ADDR_STRLEN]; struct vty *vty = NULL; json_object *json = NULL; json_object *json_vni = NULL; @@ -1062,33 +1064,30 @@ static void zl3vni_print_hash(struct hash_backet *backet, return; if (!json) { - vty_out(vty, "%-10u %-15s %-20s %-20s %-5s %-37s %-18s\n", - zl3vni->vni, - inet_ntoa(zl3vni->local_vtep_ip), + vty_out(vty, + "%-10u %-4s %-21s %-8lu %-8lu %-15s %-37s\n", + zl3vni->vni, "L3", zl3vni_vxlan_if_name(zl3vni), - zl3vni_svi_if_name(zl3vni), - zl3vni_state2str(zl3vni), - zl3vni_vrf_name(zl3vni), - zl3vni_rmac2str(zl3vni, buf, sizeof(buf))); + hashcount(zl3vni->rmac_table), + hashcount(zl3vni->nh_table), + "n/a", + zl3vni_vrf_name(zl3vni)); } else { char vni_str[VNI_STR_LEN]; snprintf(vni_str, VNI_STR_LEN, "%u", zl3vni->vni); json_vni = json_object_new_object(); json_object_int_add(json_vni, "vni", zl3vni->vni); - json_object_string_add(json_vni, "local-ip", - inet_ntoa(zl3vni->local_vtep_ip)); - json_object_string_add(json_vni, "vxlan-if", + json_object_string_add(json_vni, "vxlanIf", zl3vni_vxlan_if_name(zl3vni)); - json_object_string_add(json_vni, "svi-if", - zl3vni_svi_if_name(zl3vni)); - json_object_string_add(json_vni, "state", - zl3vni_state2str(zl3vni)); - json_object_string_add(json_vni, "vrf", + json_object_int_add(json_vni, "numMacs", + hashcount(zl3vni->rmac_table)); + json_object_int_add(json_vni, "numArpNd", + hashcount(zl3vni->nh_table)); + json_object_string_add(json_vni, "numRemoteVteps", "n/a"); + json_object_string_add(json_vni, "type", "L3"); + json_object_string_add(json_vni, "tenantVrf", zl3vni_vrf_name(zl3vni)); - json_object_string_add(json_vni, "rmac", - zl3vni_rmac2str(zl3vni, buf, - sizeof(buf))); json_object_object_add(json, vni_str, json_vni); } @@ -1126,24 +1125,26 @@ static void zvni_print_hash(struct hash_backet *backet, void *ctxt[]) num_macs = num_valid_macs(zvni); num_neigh = hashcount(zvni->neigh_table); if (json == NULL) - vty_out(vty, "%-10u %-21s %-15s %-8u %-8u %-15u %-37s\n", - zvni->vni, + vty_out(vty, + "%-10u %-4s %-21s %-8u %-8u %-15u %-37s\n", + zvni->vni, "L2", zvni->vxlan_if ? zvni->vxlan_if->name : "unknown", - inet_ntoa(zvni->local_vtep_ip), num_macs, num_neigh, - num_vteps, + num_macs, num_neigh, num_vteps, vrf_id_to_name(zvni->vrf_id)); else { char vni_str[VNI_STR_LEN]; snprintf(vni_str, VNI_STR_LEN, "%u", zvni->vni); json_vni = json_object_new_object(); + json_object_int_add(json_vni, "vni", zvni->vni); + json_object_string_add(json_vni, "type", "L2"); json_object_string_add(json_vni, "vxlanIf", zvni->vxlan_if ? zvni->vxlan_if->name : "unknown"); - json_object_string_add(json_vni, "vtepIp", - inet_ntoa(zvni->local_vtep_ip)); json_object_int_add(json_vni, "numMacs", num_macs); json_object_int_add(json_vni, "numArpNd", num_neigh); json_object_int_add(json_vni, "numRemoteVteps", num_vteps); + json_object_string_add(json_vni, "tenantVrf", + vrf_id_to_name(zvni->vrf_id)); if (num_vteps) { json_vtep_list = json_object_new_array(); for (zvtep = zvni->vteps; zvtep; zvtep = zvtep->next) { @@ -3941,8 +3942,7 @@ void zebra_vxlan_print_rmacs_l3vni(struct vty *vty, vty_out(vty, "Number of Remote RMACs known for this VNI: %u\n", num_rmacs); - vty_out(vty, "%-17s %-21s %-6s\n", "MAC", - "Remote VTEP", "Refcnt"); + vty_out(vty, "%-17s %-21s\n", "MAC", "Remote VTEP"); } else json_object_int_add(json, "numRmacs", num_rmacs); @@ -4073,10 +4073,9 @@ void zebra_vxlan_print_nh_l3vni(struct vty *vty, vty_out(vty, "Number of NH Neighbors known for this VNI: %u\n", num_nh); - vty_out(vty, "%-15s %-17s %6s\n", "IP", - "RMAC", "Refcnt"); + vty_out(vty, "%-15s %-17s\n", "IP", "RMAC"); } else - json_object_int_add(json, "numNh", num_nh); + json_object_int_add(json, "numNextHops", num_nh); hash_iterate(zl3vni->nh_table, zl3vni_print_nh_hash, &wctx); @@ -4160,52 +4159,40 @@ void zebra_vxlan_print_l3vni(struct vty *vty, vni_t vni, u_char use_json) } } -/* - * Display L3 VNI hash table (VTY command handler). - */ -void zebra_vxlan_print_l3vnis(struct vty *vty, u_char use_json) +void zebra_vxlan_print_vrf_vni(struct vty *vty, struct zebra_vrf *zvrf, + json_object *json_vrfs) { - u_int32_t num_vnis; - void *args[2]; - json_object *json = NULL; - struct zebra_ns *zns = NULL; - - if (!is_evpn_enabled()) { - if (use_json) - vty_out(vty, "{}\n"); - return; - } - - zns = zebra_ns_lookup(NS_DEFAULT); - assert(zns); + char buf[ETHER_ADDR_STRLEN]; + zebra_l3vni_t *zl3vni = NULL; - num_vnis = hashcount(zns->l3vni_table); - if (!num_vnis) { - if (use_json) - vty_out(vty, "{}\n"); + zl3vni = zl3vni_lookup(zvrf->l3vni); + if (!zl3vni) return; - } - if (use_json) { - json = json_object_new_object(); - json_object_int_add(json, "numVnis", num_vnis); + if (!json_vrfs) { + vty_out(vty, "%-37s %-10u %-20s %-20s %-5s %-18s\n", + zvrf_name(zvrf), + zl3vni->vni, + zl3vni_vxlan_if_name(zl3vni), + zl3vni_svi_if_name(zl3vni), + zl3vni_state2str(zl3vni), + zl3vni_rmac2str(zl3vni, buf, sizeof(buf))); } else { - vty_out(vty, "Number of L3 VNIs: %u\n", num_vnis); - vty_out(vty, "%-10s %-15s %-20s %-20s %-5s %-37s %-18s\n", - "VNI", "Local-ip", "Vx-intf", "L3-SVI", "State", - "VRF", "Rmac"); - } - - args[0] = vty; - args[1] = json; - hash_iterate(zns->l3vni_table, - (void (*)(struct hash_backet *, void *))zl3vni_print_hash, - args); - - if (use_json) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); + 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, "vni", zl3vni->vni); + json_object_string_add(json_vrf, "vxlanIntf", + zl3vni_vxlan_if_name(zl3vni)); + json_object_string_add(json_vrf, "sviIntf", + zl3vni_svi_if_name(zl3vni)); + json_object_string_add(json_vrf, "state", + zl3vni_state2str(zl3vni)); + json_object_string_add(json_vrf, "routerMac", + zl3vni_rmac2str(zl3vni, buf, + sizeof(buf))); + json_object_array_add(json_vrfs, json_vrf); } } @@ -4574,25 +4561,45 @@ void zebra_vxlan_print_macs_vni_vtep(struct vty *vty, struct zebra_vrf *zvrf, void zebra_vxlan_print_vni(struct vty *vty, struct zebra_vrf *zvrf, vni_t vni, u_char use_json) { - zebra_vni_t *zvni; json_object *json = NULL; void *args[2]; if (!is_evpn_enabled()) return; - zvni = zvni_lookup(vni); - if (!zvni) { - if (use_json) - vty_out(vty, "{}\n"); - else - vty_out(vty, "%% VNI %u does not exist\n", vni); - return; - } + if (use_json) json = json_object_new_object(); args[0] = vty; args[1] = json; - zvni_print(zvni, (void *)args); + + if (is_vni_l3(vni)) { + zebra_l3vni_t *zl3vni = NULL; + + zl3vni = zl3vni_lookup(vni); + if (!zl3vni) { + if (use_json) + vty_out(vty, "{}\n"); + else + vty_out(vty, "%% VNI %u does not exist\n", vni); + return; + } + + zl3vni_print(zl3vni, (void *)args); + } else { + zebra_vni_t *zvni; + + zvni = zvni_lookup(vni); + if (!zvni) { + if (use_json) + vty_out(vty, "{}\n"); + else + vty_out(vty, "%% VNI %u does not exist\n", vni); + return; + } + + zvni_print(zvni, (void *)args); + } + if (use_json) { vty_out(vty, "%s\n", json_object_to_json_string_ext( json, JSON_C_TO_STRING_PRETTY)); @@ -4600,44 +4607,88 @@ void zebra_vxlan_print_vni(struct vty *vty, struct zebra_vrf *zvrf, vni_t vni, } } -/* - * Display VNI hash table (VTY command handler). - */ -void zebra_vxlan_print_vnis(struct vty *vty, struct zebra_vrf *zvrf, - u_char use_json) +/* Display all global details for EVPN */ +void zebra_vxlan_print_evpn(struct vty *vty, u_char uj) { - u_int32_t num_vnis; + int num_l2vnis = 0; + int num_l3vnis = 0; json_object *json = NULL; - void *args[2]; + struct zebra_ns *zns = NULL; + struct zebra_vrf *zvrf = NULL; if (!is_evpn_enabled()) return; - num_vnis = hashcount(zvrf->vni_table); - if (!num_vnis) { - if (use_json) - vty_out(vty, "{}\n"); + + zns = zebra_ns_lookup(NS_DEFAULT); + if (!zns) return; - } - if (use_json) { + + zvrf = vrf_info_lookup(VRF_DEFAULT); + if (!zvrf) + return; + + num_l3vnis = hashcount(zns->l3vni_table); + num_l2vnis = hashcount(zvrf->vni_table); + + if (uj) { json = json_object_new_object(); json_object_string_add(json, "advertiseGatewayMacip", zvrf->advertise_gw_macip ? "Yes" : "No"); - json_object_int_add(json, "numVnis", num_vnis); + json_object_int_add(json, "numL2Vnis", num_l2vnis); + json_object_int_add(json, "numL3Vnis", num_l3vnis); } else { + vty_out(vty, "L2 VNIs: %u\n", num_l2vnis); + vty_out(vty, "L3 VNIs: %u\n", num_l3vnis); vty_out(vty, "Advertise gateway mac-ip: %s\n", zvrf->advertise_gw_macip ? "Yes" : "No"); - vty_out(vty, "Number of VNIs: %u\n", num_vnis); - vty_out(vty, "%-10s %-21s %-15s %-8s %-8s %-15s %-37s\n", "VNI", - "VxLAN IF", "VTEP IP", "# MACs", "# ARPs", - "# Remote VTEPs", "VRF"); } + + if (uj) { + vty_out(vty, "%s\n", json_object_to_json_string_ext( + json, JSON_C_TO_STRING_PRETTY)); + json_object_free(json); + } +} + +/* + * Display VNI hash table (VTY command handler). + */ +void zebra_vxlan_print_vnis(struct vty *vty, struct zebra_vrf *zvrf, + u_char use_json) +{ + json_object *json = NULL; + struct zebra_ns *zns = NULL; + void *args[2]; + + if (!is_evpn_enabled()) + return; + + zns = zebra_ns_lookup(NS_DEFAULT); + if (!zns) + return; + + + if (use_json) + json = json_object_new_object(); + else + vty_out(vty, + "%-10s %-4s %-21s %-8s %-8s %-15s %-37s\n", + "VNI", "Type", "VxLAN IF", "# MACs", + "# ARPs", "# Remote VTEPs", "Tenant VRF"); + args[0] = vty; args[1] = json; + /* Display all L2-VNIs */ hash_iterate(zvrf->vni_table, (void (*)(struct hash_backet *, void *))zvni_print_hash, args); + /* Display all L3-VNIs */ + hash_iterate(zns->l3vni_table, + (void (*)(struct hash_backet *, void *))zl3vni_print_hash, + args); + if (use_json) { vty_out(vty, "%s\n", json_object_to_json_string_ext( json, JSON_C_TO_STRING_PRETTY)); diff --git a/zebra/zebra_vxlan.h b/zebra/zebra_vxlan.h index 4e1eedd0dc..2a50591100 100644 --- a/zebra/zebra_vxlan.h +++ b/zebra/zebra_vxlan.h @@ -31,6 +31,7 @@ #include "vlan.h" #include "vxlan.h" +#include "lib/json.h" #include "zebra/zebra_vrf.h" /* Is EVPN enabled? */ @@ -55,6 +56,7 @@ extern ifindex_t get_l3vni_svi_ifindex(vrf_id_t vrf_id); extern int zebra_vxlan_vrf_delete(struct zebra_vrf *zvrf); extern void zebra_vxlan_print_specific_nh_l3vni(struct vty *vty, vni_t l3vni, struct ipaddr *ip, u_char uj); +extern void zebra_vxlan_print_evpn(struct vty *vty, u_char uj); extern void zebra_vxlan_print_specific_rmac_l3vni(struct vty *vty, vni_t l3vni, struct ethaddr *rmac, u_char use_json); @@ -99,9 +101,8 @@ extern void zebra_vxlan_print_nh_l3vni(struct vty *vty, vni_t vni, u_char extern void zebra_vxlan_print_nh_all_l3vni(struct vty *vty, u_char use_json); extern void zebra_vxlan_print_l3vni(struct vty *vty, vni_t vni, u_char use_json); -extern void zebra_vxlan_print_l3vnis(struct vty *vty, - u_char use_json); - +extern void zebra_vxlan_print_vrf_vni(struct vty *vty, struct zebra_vrf *zvrf, + json_object *json_vrfs); extern int zebra_vxlan_add_del_gw_macip(struct interface *ifp, struct prefix *p, int add); extern int zebra_vxlan_svi_up(struct interface *ifp, struct interface *link_if); diff --git a/zebra/zebra_vxlan_null.c b/zebra/zebra_vxlan_null.c index db828c337e..fa6ed77e53 100644 --- a/zebra/zebra_vxlan_null.c +++ b/zebra/zebra_vxlan_null.c @@ -83,6 +83,10 @@ void zebra_vxlan_print_vnis(struct vty *vty, struct zebra_vrf *zvrf) { } +void zebra_vxlan_print_evpn(struct vty *vty, u_char uj) +{ +} + void zebra_vxlan_print_rmacs_l3vni(struct vty*, vni_t, u_char) { } @@ -103,10 +107,6 @@ void zebra_vxlan_print_l3vni(struct vty *vty, vni_t vni) { } -void zebra_vxlan_print_l3vnis(struct vty *vty) -{ -} - int zebra_vxlan_svi_up(struct interface *ifp, struct interface *link_if) { return 0; -- 2.39.5