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;
}
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);
/* 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);
+ }
}
/*
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,