]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: json support for show evpn rmac specific mac command
authorMitesh Kanjariya <mitesh@marvel-07.cumulusnetworks.com>
Tue, 17 Oct 2017 12:25:47 +0000 (05:25 -0700)
committerMitesh Kanjariya <mitesh@marvel-07.cumulusnetworks.com>
Thu, 14 Dec 2017 18:57:06 +0000 (10:57 -0800)
Signed-off-by: Mitesh Kanjariya <mitesh@cumulusnetworks.com>
zebra/zebra_vty.c
zebra/zebra_vxlan.c
zebra/zebra_vxlan.h

index 63eab847901324f937469e4b5c2395ce932678d7..1ae632e4f476e5048b59ac8eff96a49dcd36ddf9 100644 (file)
@@ -2067,24 +2067,26 @@ DEFUN (show_evpn_l3vni_vni,
 
 DEFUN (show_evpn_rmac_l3vni_mac,
        show_evpn_rmac_l3vni_mac_cmd,
-       "show evpn rmac l3vni " CMD_VNI_RANGE " mac WORD",
+       "show evpn rmac l3vni " CMD_VNI_RANGE " mac WORD [json]",
        SHOW_STR
        "EVPN\n"
        "RMAC\n"
        "L3-VNI\n"
        "VNI number\n"
        "MAC\n"
-       "mac-address (e.g. 0a:0a:0a:0a:0a:0a)\n")
+       "mac-address (e.g. 0a:0a:0a:0a:0a:0a)\n"
+       JSON_STR)
 {
        vni_t l3vni = 0;
        struct ethaddr mac;
+       u_char uj = use_json(argc, argv);
 
        l3vni = strtoul(argv[4]->arg, NULL, 10);
        if (!prefix_str2mac(argv[6]->arg, &mac)) {
                vty_out(vty, "%% Malformed MAC address\n");
                return CMD_WARNING;
        }
-       zebra_vxlan_print_specific_rmac_l3vni(vty, l3vni, &mac);
+       zebra_vxlan_print_specific_rmac_l3vni(vty, l3vni, &mac, uj);
        return CMD_SUCCESS;
 }
 
index 6220345cc91cb43bcaa2a5de5967800eda0b67be..f54fd7471b6006cb224c9986dfcf59917b66a36c 100644 (file)
@@ -65,7 +65,8 @@ static void zvni_print_neigh_hash_all_vni(struct hash_backet *backet,
                                          void **args);
 static void zl3vni_print_nh(zebra_neigh_t *n, struct vty *vty,
                            json_object *json);
-static void zl3vni_print_rmac(zebra_mac_t *zrmac, struct vty *vty);
+static void zl3vni_print_rmac(zebra_mac_t *zrmac, struct vty *vty,
+                             json_object *json);
 static void zvni_print_mac(zebra_mac_t *mac, void *ctxt);
 static void zvni_print_mac_hash(struct hash_backet *backet, void *ctxt);
 static void zvni_print_mac_hash_all_vni(struct hash_backet *backet, void *ctxt);
@@ -466,21 +467,39 @@ static void zl3vni_print_nh(zebra_neigh_t *n,
 
 /* Print a specific RMAC entry */
 static void zl3vni_print_rmac(zebra_mac_t *zrmac,
-                             struct vty *vty)
+                             struct vty *vty,
+                             json_object *json)
 {
        char buf1[ETHER_ADDR_STRLEN];
        char buf2[PREFIX_STRLEN];
        struct listnode *node = NULL;
        struct prefix *p = NULL;
+       json_object *json_hosts = NULL;
 
-       vty_out(vty, "MAC: %s\n",
-               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");
-       for (ALL_LIST_ELEMENTS_RO(zrmac->host_list, node, p))
-               vty_out(vty, "    %s\n",
-                       prefix2str(p, buf2, sizeof(buf2)));
+       if (!json) {
+               vty_out(vty, "MAC: %s\n",
+                       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");
+               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",
+                                      prefix_mac2str(&zrmac->macaddr,
+                                                     buf1,
+                                                     sizeof(buf1)));
+               json_object_string_add(json, "vtep-ip",
+                                      inet_ntoa(zrmac->fwd_info.r_vtep_ip));
+               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);
+       }
 }
 
 /*
@@ -3691,29 +3710,50 @@ void zebra_vxlan_evpn_vrf_route_del(vrf_id_t vrf_id,
 
 void zebra_vxlan_print_specific_rmac_l3vni(struct vty *vty,
                                           vni_t l3vni,
-                                          struct ethaddr *rmac)
+                                          struct ethaddr *rmac,
+                                          u_char use_json)
 {
        zebra_l3vni_t *zl3vni = NULL;
        zebra_mac_t *zrmac = NULL;
+       json_object *json = NULL;
 
-       if (!is_evpn_enabled())
+       if (!is_evpn_enabled()) {
+               if (use_json)
+                       vty_out(vty, "{}\n");
                return;
+       }
+
+       if (use_json)
+               json = json_object_new_object();
 
        zl3vni = zl3vni_lookup(l3vni);
        if (!zl3vni) {
-               vty_out(vty, "%% L3-VNI %u doesnt exist\n",
-                       l3vni);
+               if (use_json)
+                       vty_out(vty, "{}\n");
+               else
+                       vty_out(vty, "%% L3-VNI %u doesnt exist\n",
+                               l3vni);
                return;
        }
 
        zrmac = zl3vni_rmac_lookup(zl3vni, rmac);
        if (!zrmac) {
-               vty_out(vty, "%% Requested RMAC doesnt exist in L3-VNI %u",
-                       l3vni);
+               if (use_json)
+                       vty_out(vty, "{}\n");
+               else
+                       vty_out(vty,
+                               "%% Requested RMAC doesnt exist in L3-VNI %u",
+                               l3vni);
                return;
        }
 
-       zl3vni_print_rmac(zrmac, vty);
+       zl3vni_print_rmac(zrmac, vty, json);
+
+       if (use_json) {
+               vty_out(vty, "%s\n", json_object_to_json_string_ext(
+                                            json, JSON_C_TO_STRING_PRETTY));
+               json_object_free(json);
+       }
 }
 
 void zebra_vxlan_print_rmacs_l3vni(struct vty *vty,
index d83d8e973fa7d32f9e787fea390d4b6f6b64ddcc..cfa6c6ce7107aa2f81be3ae4a5b6d172f99f0b86 100644 (file)
@@ -56,7 +56,8 @@ extern int zebra_vxlan_vrf_delete(struct zebra_vrf *);
 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_specific_rmac_l3vni(struct vty *vty, vni_t l3vni,
-                                                 struct ethaddr *rmac);
+                                                 struct ethaddr *rmac,
+                                                 u_char use_json);
 extern void zebra_vxlan_print_macs_vni(struct vty *vty, struct zebra_vrf *zvrf,
                                       vni_t vni, u_char use_json);
 extern void zebra_vxlan_print_macs_all_vni(struct vty *vty,