bgpd: add mac-vrf soo to show bgp l2vpn evpn vni

Adds the current MAC-VRF SoO value to the output of "show bgp l2vpn evpn
vni [vni]". Also fixes a missing space in front of the Tenant VRF string.

New output:
```
ub20-2(config-router-af)# do show bgp l2vpn evpn vni
Advertise Gateway Macip: Disabled
Advertise SVI Macip: Disabled
Advertise All VNI flag: Enabled
BUM flooding: Head-end replication
VXLAN flooding: Enabled
Number of L2 VNIs: 2
Number of L3 VNIs: 1
Flags: * - Kernel
  VNI        Type RD                    Import RT                 Export RT                 MAC-VRF Site-of-Origin    Tenant VRF
* 20         L2   100.64.0.33:3         1:20                      1:20                      3.3.3.3:20                stuff
* 30         L2   100.64.0.33:4         1:30                      1:30                      3.3.3.3:20                stuff
* 10         L3   30.0.0.3:2            1:10                      1:10                      3.3.3.3:20                stuff

ub20-2(config-router-af)# do show bgp l2vpn evpn vni 10
VNI: 10 (known to the kernel)
  Type: L3
  Tenant VRF: stuff
  RD: 30.0.0.3:2
  Originator IP: 3.3.3.3
  MAC-VRF Site-of-Origin: 3.3.3.3:20     <<<<<
  Advertise-gw-macip : n/a
  Advertise-svi-macip : n/a
  Advertise-pip: Yes
  System-IP: 100.64.0.33
  System-MAC: aa:bb:cc:00:33:33
  Router-MAC: aa:bb:cc:00:33:33
  Import Route Target:
    1:10
  Export Route Target:
    1:10

ub20-2(config-router-af)# do show bgp l2vpn evpn vni 20
VNI: 20 (known to the kernel)
  Type: L2
  Tenant-Vrf: stuff
  RD: 100.64.0.33:3
  Originator IP: 3.3.3.3
  MAC-VRF Site-of-Origin: 3.3.3.3:20     <<<<<
  Mcast group: 0.0.0.0
  Advertise-gw-macip : Disabled
  Advertise-svi-macip : Disabled
  SVI interface : br20
  Import Route Target:
    1:20
  Export Route Target:
    1:20
```

Signed-off-by: Trey Aspelund <taspelund@nvidia.com>
This commit is contained in:
Trey Aspelund 2023-05-08 03:11:01 +00:00
parent 65cdb9ce9b
commit c4b59c9ab1

View File

@ -362,10 +362,11 @@ static void display_l3vni(struct vty *vty, struct bgp *bgp_vrf,
char *ecom_str; char *ecom_str;
struct listnode *node, *nnode; struct listnode *node, *nnode;
struct vrf_route_target *l3rt; struct vrf_route_target *l3rt;
struct bgp *bgp_evpn = NULL;
json_object *json_import_rtl = NULL; json_object *json_import_rtl = NULL;
json_object *json_export_rtl = NULL; json_object *json_export_rtl = NULL;
char buf2[ETHER_ADDR_STRLEN];
bgp_evpn = bgp_get_evpn();
json_import_rtl = json_export_rtl = 0; json_import_rtl = json_export_rtl = 0;
if (json) { if (json) {
@ -379,19 +380,26 @@ static void display_l3vni(struct vty *vty, struct bgp *bgp_vrf,
&bgp_vrf->vrf_prd); &bgp_vrf->vrf_prd);
json_object_string_addf(json, "originatorIp", "%pI4", json_object_string_addf(json, "originatorIp", "%pI4",
&bgp_vrf->originator_ip); &bgp_vrf->originator_ip);
if (bgp_evpn && bgp_evpn->evpn_info) {
ecom_str = ecommunity_ecom2str(
bgp_evpn->evpn_info->soo,
ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
json_object_string_add(json, "siteOfOrigin", ecom_str);
ecommunity_strfree(&ecom_str);
}
json_object_string_add(json, "advertiseGatewayMacip", "n/a"); json_object_string_add(json, "advertiseGatewayMacip", "n/a");
json_object_string_add(json, "advertiseSviMacIp", "n/a"); json_object_string_add(json, "advertiseSviMacIp", "n/a");
json_object_string_add(json, "advertisePip", if (bgp_vrf && bgp_vrf->evpn_info) {
bgp_vrf->evpn_info->advertise_pip ? json_object_string_add(json, "advertisePip",
"Enabled" : "Disabled"); bgp_vrf->evpn_info->advertise_pip
json_object_string_addf(json, "sysIP", "%pI4", ? "Enabled"
&bgp_vrf->evpn_info->pip_ip); : "Disabled");
json_object_string_add(json, "sysMac", json_object_string_addf(json, "sysIP", "%pI4",
prefix_mac2str(&bgp_vrf->evpn_info->pip_rmac, &bgp_vrf->evpn_info->pip_ip);
buf2, sizeof(buf2))); json_object_string_addf(json, "sysMac", "%pEA",
json_object_string_add(json, "rmac", &bgp_vrf->evpn_info->pip_rmac);
prefix_mac2str(&bgp_vrf->rmac, }
buf2, sizeof(buf2))); json_object_string_addf(json, "rmac", "%pEA", &bgp_vrf->rmac);
} else { } else {
vty_out(vty, "VNI: %d", bgp_vrf->l3vni); vty_out(vty, "VNI: %d", bgp_vrf->l3vni);
vty_out(vty, " (known to the kernel)"); vty_out(vty, " (known to the kernel)");
@ -406,18 +414,26 @@ static void display_l3vni(struct vty *vty, struct bgp *bgp_vrf,
vty_out(vty, "\n"); vty_out(vty, "\n");
vty_out(vty, " Originator IP: %pI4\n", vty_out(vty, " Originator IP: %pI4\n",
&bgp_vrf->originator_ip); &bgp_vrf->originator_ip);
if (bgp_evpn && bgp_evpn->evpn_info) {
ecom_str = ecommunity_ecom2str(
bgp_evpn->evpn_info->soo,
ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
vty_out(vty, " MAC-VRF Site-of-Origin: %s\n",
ecom_str);
ecommunity_strfree(&ecom_str);
}
vty_out(vty, " Advertise-gw-macip : %s\n", "n/a"); vty_out(vty, " Advertise-gw-macip : %s\n", "n/a");
vty_out(vty, " Advertise-svi-macip : %s\n", "n/a"); vty_out(vty, " Advertise-svi-macip : %s\n", "n/a");
vty_out(vty, " Advertise-pip: %s\n", if (bgp_vrf && bgp_vrf->evpn_info) {
bgp_vrf->evpn_info->advertise_pip ? "Yes" : "No"); vty_out(vty, " Advertise-pip: %s\n",
vty_out(vty, " System-IP: %pI4\n", bgp_vrf->evpn_info->advertise_pip ? "Yes"
&bgp_vrf->evpn_info->pip_ip); : "No");
vty_out(vty, " System-MAC: %s\n", vty_out(vty, " System-IP: %pI4\n",
prefix_mac2str(&bgp_vrf->evpn_info->pip_rmac, &bgp_vrf->evpn_info->pip_ip);
buf2, sizeof(buf2))); vty_out(vty, " System-MAC: %pEA\n",
vty_out(vty, " Router-MAC: %s\n", &bgp_vrf->evpn_info->pip_rmac);
prefix_mac2str(&bgp_vrf->rmac, }
buf2, sizeof(buf2))); vty_out(vty, " Router-MAC: %pEA\n", &bgp_vrf->rmac);
} }
if (!json) if (!json)
@ -433,7 +449,7 @@ static void display_l3vni(struct vty *vty, struct bgp *bgp_vrf,
else else
vty_out(vty, " %s\n", ecom_str); vty_out(vty, " %s\n", ecom_str);
XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); ecommunity_strfree(&ecom_str);
} }
if (json) if (json)
@ -451,7 +467,7 @@ static void display_l3vni(struct vty *vty, struct bgp *bgp_vrf,
else else
vty_out(vty, " %s\n", ecom_str); vty_out(vty, " %s\n", ecom_str);
XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); ecommunity_strfree(&ecom_str);
} }
if (json) if (json)
@ -484,6 +500,13 @@ static void display_vni(struct vty *vty, struct bgpevpn *vpn, json_object *json)
&vpn->originator_ip); &vpn->originator_ip);
json_object_string_addf(json, "mcastGroup", "%pI4", json_object_string_addf(json, "mcastGroup", "%pI4",
&vpn->mcast_grp); &vpn->mcast_grp);
if (bgp_evpn && bgp_evpn->evpn_info) {
ecom_str = ecommunity_ecom2str(
bgp_evpn->evpn_info->soo,
ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
json_object_string_add(json, "siteOfOrigin", ecom_str);
ecommunity_strfree(&ecom_str);
}
/* per vni knob is enabled -- Enabled /* per vni knob is enabled -- Enabled
* Global knob is enabled -- Active * Global knob is enabled -- Active
* default -- Disabled * default -- Disabled
@ -525,6 +548,14 @@ static void display_vni(struct vty *vty, struct bgpevpn *vpn, json_object *json)
vty_out(vty, "\n"); vty_out(vty, "\n");
vty_out(vty, " Originator IP: %pI4\n", &vpn->originator_ip); vty_out(vty, " Originator IP: %pI4\n", &vpn->originator_ip);
vty_out(vty, " Mcast group: %pI4\n", &vpn->mcast_grp); vty_out(vty, " Mcast group: %pI4\n", &vpn->mcast_grp);
if (bgp_evpn && bgp_evpn->evpn_info) {
ecom_str = ecommunity_ecom2str(
bgp_evpn->evpn_info->soo,
ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
vty_out(vty, " MAC-VRF Site-of-Origin: %s\n",
ecom_str);
ecommunity_strfree(&ecom_str);
}
if (!vpn->advertise_gw_macip && if (!vpn->advertise_gw_macip &&
bgp_evpn && bgp_evpn->advertise_gw_macip) bgp_evpn && bgp_evpn->advertise_gw_macip)
vty_out(vty, " Advertise-gw-macip : %s\n", vty_out(vty, " Advertise-gw-macip : %s\n",
@ -562,7 +593,7 @@ static void display_vni(struct vty *vty, struct bgpevpn *vpn, json_object *json)
else else
vty_out(vty, " %s\n", ecom_str); vty_out(vty, " %s\n", ecom_str);
XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); ecommunity_strfree(&ecom_str);
} }
if (json) if (json)
@ -580,7 +611,7 @@ static void display_vni(struct vty *vty, struct bgpevpn *vpn, json_object *json)
else else
vty_out(vty, " %s\n", ecom_str); vty_out(vty, " %s\n", ecom_str);
XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); ecommunity_strfree(&ecom_str);
} }
if (json) if (json)
@ -981,10 +1012,13 @@ static void show_l3vni_entry(struct vty *vty, struct bgp *bgp,
char *ecom_str; char *ecom_str;
struct listnode *node, *nnode; struct listnode *node, *nnode;
struct vrf_route_target *l3rt; struct vrf_route_target *l3rt;
struct bgp *bgp_evpn;
if (!bgp->l3vni) if (!bgp->l3vni)
return; return;
bgp_evpn = bgp_get_evpn();
if (json) { if (json) {
json_vni = json_object_new_object(); json_vni = json_object_new_object();
json_import_rtl = json_object_new_array(); json_import_rtl = json_object_new_array();
@ -1041,7 +1075,7 @@ static void show_l3vni_entry(struct vty *vty, struct bgp *bgp,
vty_out(vty, " %-25s", rt_buf); vty_out(vty, " %-25s", rt_buf);
} }
XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); ecommunity_strfree(&ecom_str);
/* If there are multiple import RTs we break here and show only /* If there are multiple import RTs we break here and show only
* one */ * one */
@ -1069,12 +1103,19 @@ static void show_l3vni_entry(struct vty *vty, struct bgp *bgp,
vty_out(vty, " %-25s", rt_buf); vty_out(vty, " %-25s", rt_buf);
} }
XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); ecommunity_strfree(&ecom_str);
/* If there are multiple export RTs we break here and show only /* If there are multiple export RTs we break here and show only
* one */ * one */
if (!json) { if (!json) {
vty_out(vty, "%-37s", vrf_id_to_name(bgp->vrf_id)); if (bgp_evpn && bgp_evpn->evpn_info) {
ecom_str = ecommunity_ecom2str(
bgp_evpn->evpn_info->soo,
ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
vty_out(vty, " %-25s", ecom_str);
ecommunity_strfree(&ecom_str);
}
vty_out(vty, " %-37s", vrf_id_to_name(bgp->vrf_id));
break; break;
} }
} }
@ -1083,11 +1124,18 @@ static void show_l3vni_entry(struct vty *vty, struct bgp *bgp,
char vni_str[VNI_STR_LEN]; char vni_str[VNI_STR_LEN];
json_object_object_add(json_vni, "exportRTs", json_export_rtl); json_object_object_add(json_vni, "exportRTs", json_export_rtl);
if (bgp_evpn && bgp_evpn->evpn_info) {
ecom_str = ecommunity_ecom2str(
bgp_evpn->evpn_info->soo,
ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
json_object_string_add(json_vni, "siteOfOrigin",
ecom_str);
ecommunity_strfree(&ecom_str);
}
snprintf(vni_str, sizeof(vni_str), "%u", bgp->l3vni); snprintf(vni_str, sizeof(vni_str), "%u", bgp->l3vni);
json_object_object_add(json, vni_str, json_vni); json_object_object_add(json, vni_str, json_vni);
} else { } else
vty_out(vty, "\n"); vty_out(vty, "\n");
}
} }
static void show_vni_entry(struct hash_bucket *bucket, void *args[]) static void show_vni_entry(struct hash_bucket *bucket, void *args[])
@ -1213,7 +1261,14 @@ static void show_vni_entry(struct hash_bucket *bucket, void *args[])
/* If there are multiple export RTs we break here and show only /* If there are multiple export RTs we break here and show only
* one */ * one */
if (!json) { if (!json) {
vty_out(vty, "%-37s", if (bgp_evpn && bgp_evpn->evpn_info) {
ecom_str = ecommunity_ecom2str(
bgp_evpn->evpn_info->soo,
ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
vty_out(vty, " %-25s", ecom_str);
ecommunity_strfree(&ecom_str);
}
vty_out(vty, " %-37s",
vrf_id_to_name(vpn->tenant_vrf_id)); vrf_id_to_name(vpn->tenant_vrf_id));
break; break;
} }
@ -1223,11 +1278,18 @@ static void show_vni_entry(struct hash_bucket *bucket, void *args[])
char vni_str[VNI_STR_LEN]; char vni_str[VNI_STR_LEN];
json_object_object_add(json_vni, "exportRTs", json_export_rtl); json_object_object_add(json_vni, "exportRTs", json_export_rtl);
if (bgp_evpn && bgp_evpn->evpn_info) {
ecom_str = ecommunity_ecom2str(
bgp_evpn->evpn_info->soo,
ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
json_object_string_add(json_vni, "siteOfOrigin",
ecom_str);
ecommunity_strfree(&ecom_str);
}
snprintf(vni_str, sizeof(vni_str), "%u", vpn->vni); snprintf(vni_str, sizeof(vni_str), "%u", vpn->vni);
json_object_object_add(json, vni_str, json_vni); json_object_object_add(json, vni_str, json_vni);
} else { } else
vty_out(vty, "\n"); vty_out(vty, "\n");
}
} }
static int bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd, static int bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd,
@ -3276,8 +3338,9 @@ static void evpn_show_all_vnis(struct vty *vty, struct bgp *bgp,
if (!json) { if (!json) {
vty_out(vty, "Flags: * - Kernel\n"); vty_out(vty, "Flags: * - Kernel\n");
vty_out(vty, " %-10s %-4s %-21s %-25s %-25s %-37s\n", "VNI", vty_out(vty, " %-10s %-4s %-21s %-25s %-25s %-25s %-37s\n",
"Type", "RD", "Import RT", "Export RT", "Tenant VRF"); "VNI", "Type", "RD", "Import RT", "Export RT",
"MAC-VRF Site-of-Origin", "Tenant VRF");
} }
/* print all L2 VNIS */ /* print all L2 VNIS */