Merge pull request #12578 from Pdoijode/evpn-mac-vni-det

zebra: Evpn mac vni detail show command
This commit is contained in:
Donatas Abraitis 2023-01-11 12:06:37 +02:00 committed by GitHub
commit 4b6667ce61
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 64 additions and 15 deletions

View File

@ -502,3 +502,11 @@ the creation of the VLAN subinterfaces and directly enslave "eth0" to "br10".
ip link set eth0 master br10 ip link set eth0 master br10
This completes the necessary configuration for an L2VNI. This completes the necessary configuration for an L2VNI.
Displaying EVPN information
---------------------------
.. clicmd:: show evpn mac vni (1-16777215) detail [json]
Display detailed information about MAC addresses for
a specified VNI.

View File

@ -653,8 +653,13 @@ void zebra_evpn_print_mac(struct zebra_mac *mac, void *ctxt, json_object *json)
json_object_int_add(json_mac, "vlan", vid); json_object_int_add(json_mac, "vlan", vid);
} else if (CHECK_FLAG(mac->flags, ZEBRA_MAC_REMOTE)) { } else if (CHECK_FLAG(mac->flags, ZEBRA_MAC_REMOTE)) {
json_object_string_add(json_mac, "type", "remote"); json_object_string_add(json_mac, "type", "remote");
json_object_string_addf(json_mac, "remoteVtep", "%pI4", if (mac->es)
&mac->fwd_info.r_vtep_ip); json_object_string_add(json_mac, "remoteEs",
mac->es->esi_str);
else
json_object_string_addf(
json_mac, "remoteVtep", "%pI4",
&mac->fwd_info.r_vtep_ip);
} else if (CHECK_FLAG(mac->flags, ZEBRA_MAC_AUTO)) } else if (CHECK_FLAG(mac->flags, ZEBRA_MAC_AUTO))
json_object_string_add(json_mac, "type", "auto"); json_object_string_add(json_mac, "type", "auto");
@ -937,8 +942,13 @@ void zebra_evpn_print_mac_hash(struct hash_bucket *bucket, void *ctxt)
"", mac->loc_seq, mac->rem_seq); "", mac->loc_seq, mac->rem_seq);
} else { } else {
json_object_string_add(json_mac, "type", "remote"); json_object_string_add(json_mac, "type", "remote");
json_object_string_addf(json_mac, "remoteVtep", "%pI4", if (mac->es)
&mac->fwd_info.r_vtep_ip); json_object_string_add(json_mac, "remoteEs",
mac->es->esi_str);
else
json_object_string_addf(
json_mac, "remoteVtep", "%pI4",
&mac->fwd_info.r_vtep_ip);
json_object_object_add(json_mac_hdr, buf1, json_mac); json_object_object_add(json_mac_hdr, buf1, json_mac);
json_object_int_add(json_mac, "localSequence", json_object_int_add(json_mac, "localSequence",
mac->loc_seq); mac->loc_seq);

View File

@ -3511,7 +3511,26 @@ DEFUN (show_evpn_mac_vni,
vni = strtoul(argv[4]->arg, NULL, 10); vni = strtoul(argv[4]->arg, NULL, 10);
zvrf = zebra_vrf_get_evpn(); zvrf = zebra_vrf_get_evpn();
zebra_vxlan_print_macs_vni(vty, zvrf, vni, uj); zebra_vxlan_print_macs_vni(vty, zvrf, vni, uj, false);
return CMD_SUCCESS;
}
DEFPY (show_evpn_mac_vni_detail,
show_evpn_mac_vni_detail_cmd,
"show evpn mac vni " CMD_VNI_RANGE " detail [json]",
SHOW_STR
"EVPN\n"
"MAC addresses\n"
"VXLAN Network Identifier\n"
"VNI number\n"
"Detailed Information On Each VNI MAC\n"
JSON_STR)
{
struct zebra_vrf *zvrf;
bool uj = use_json(argc, argv);
zvrf = zebra_vrf_get_evpn();
zebra_vxlan_print_macs_vni(vty, zvrf, vni, uj, true);
return CMD_SUCCESS; return CMD_SUCCESS;
} }
@ -4819,6 +4838,7 @@ void zebra_vty_init(void)
install_element(VIEW_NODE, &show_evpn_mac_vni_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_cmd);
install_element(VIEW_NODE, &show_evpn_mac_vni_all_detail_cmd); install_element(VIEW_NODE, &show_evpn_mac_vni_all_detail_cmd);
install_element(VIEW_NODE, &show_evpn_mac_vni_detail_cmd);
install_element(VIEW_NODE, &show_evpn_mac_vni_all_vtep_cmd); install_element(VIEW_NODE, &show_evpn_mac_vni_all_vtep_cmd);
install_element(VIEW_NODE, &show_evpn_mac_vni_mac_cmd); install_element(VIEW_NODE, &show_evpn_mac_vni_mac_cmd);
install_element(VIEW_NODE, &show_evpn_mac_vni_vtep_cmd); install_element(VIEW_NODE, &show_evpn_mac_vni_vtep_cmd);

View File

@ -2869,7 +2869,7 @@ void zebra_vxlan_print_neigh_vni_dad(struct vty *vty,
* Display MACs for a VNI (VTY command handler). * Display MACs for a VNI (VTY command handler).
*/ */
void zebra_vxlan_print_macs_vni(struct vty *vty, struct zebra_vrf *zvrf, void zebra_vxlan_print_macs_vni(struct vty *vty, struct zebra_vrf *zvrf,
vni_t vni, bool use_json) vni_t vni, bool use_json, bool detail)
{ {
struct zebra_evpn *zevpn; struct zebra_evpn *zevpn;
uint32_t num_macs; uint32_t num_macs;
@ -2902,17 +2902,28 @@ void zebra_vxlan_print_macs_vni(struct vty *vty, struct zebra_vrf *zvrf,
wctx.json = json_mac; wctx.json = json_mac;
if (!use_json) { if (!use_json) {
vty_out(vty, if (detail) {
"Number of MACs (local and remote) known for this VNI: %u\n", vty_out(vty, "\nVNI %u #MACs (local and remote) %u\n\n",
num_macs); zevpn->vni, num_macs);
vty_out(vty, } else {
"Flags: N=sync-neighs, I=local-inactive, P=peer-active, X=peer-proxy\n"); vty_out(vty,
vty_out(vty, "%-17s %-6s %-5s %-30s %-5s %s\n", "MAC", "Type", "Number of MACs (local and remote) known for this VNI: %u\n",
"Flags", "Intf/Remote ES/VTEP", "VLAN", "Seq #'s"); num_macs);
vty_out(vty,
"Flags: N=sync-neighs, I=local-inactive, P=peer-active, X=peer-proxy\n");
vty_out(vty, "%-17s %-6s %-5s %-30s %-5s %s\n", "MAC",
"Type", "Flags", "Intf/Remote ES/VTEP", "VLAN",
"Seq #'s");
}
} else } else
json_object_int_add(json, "numMacs", num_macs); json_object_int_add(json, "numMacs", num_macs);
hash_iterate(zevpn->mac_table, zebra_evpn_print_mac_hash, &wctx); if (detail)
hash_iterate(zevpn->mac_table, zebra_evpn_print_mac_hash_detail,
&wctx);
else
hash_iterate(zevpn->mac_table, zebra_evpn_print_mac_hash,
&wctx);
if (use_json) { if (use_json) {
json_object_object_add(json, "macs", json_mac); json_object_object_add(json, "macs", json_mac);

View File

@ -95,7 +95,7 @@ extern void zebra_vxlan_print_specific_rmac_l3vni(struct vty *vty, vni_t l3vni,
struct ethaddr *rmac, struct ethaddr *rmac,
bool use_json); bool use_json);
extern void zebra_vxlan_print_macs_vni(struct vty *vty, struct zebra_vrf *zvrf, extern void zebra_vxlan_print_macs_vni(struct vty *vty, struct zebra_vrf *zvrf,
vni_t vni, bool use_json); vni_t vni, bool use_json, bool detail);
extern void zebra_vxlan_print_macs_all_vni(struct vty *vty, extern void zebra_vxlan_print_macs_all_vni(struct vty *vty,
struct zebra_vrf *zvrf, struct zebra_vrf *zvrf,
bool print_dup, bool print_dup,