summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_evpn.c69
-rw-r--r--bgpd/bgp_evpn_vty.c60
-rw-r--r--bgpd/bgp_route.c2
3 files changed, 87 insertions, 44 deletions
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c
index 50fef00a96..f8cd3de68c 100644
--- a/bgpd/bgp_evpn.c
+++ b/bgpd/bgp_evpn.c
@@ -2394,6 +2394,30 @@ static int handle_tunnel_ip_change(struct bgp *bgp, struct bgpevpn *vpn,
return 0;
}
+static void bgp_create_evpn_bgp_path_info(struct bgp_path_info *parent_pi,
+ struct bgp_node *rn)
+{
+ struct attr *attr_new;
+ struct bgp_path_info *pi;
+
+ /* Add (or update) attribute to hash. */
+ attr_new = bgp_attr_intern(parent_pi->attr);
+
+ /* Create new route with its attribute. */
+ pi = info_make(parent_pi->type, BGP_ROUTE_IMPORTED, 0, parent_pi->peer,
+ attr_new, rn);
+ SET_FLAG(pi->flags, BGP_PATH_VALID);
+ bgp_path_info_extra_get(pi);
+ pi->extra->parent = bgp_path_info_lock(parent_pi);
+ bgp_lock_node((struct bgp_node *)parent_pi->net);
+ if (parent_pi->extra) {
+ memcpy(&pi->extra->label, &parent_pi->extra->label,
+ sizeof(pi->extra->label));
+ pi->extra->num_labels = parent_pi->extra->num_labels;
+ }
+ bgp_path_info_add(rn, pi);
+}
+
/* Install EVPN route entry in ES */
static int install_evpn_route_entry_in_es(struct bgp *bgp, struct evpnes *es,
struct prefix_evpn *p,
@@ -2424,7 +2448,8 @@ static int install_evpn_route_entry_in_es(struct bgp *bgp, struct evpnes *es,
parent_pi->peer, attr_new, rn);
SET_FLAG(pi->flags, BGP_PATH_VALID);
bgp_path_info_extra_get(pi);
- pi->extra->parent = parent_pi;
+ pi->extra->parent = bgp_path_info_lock(parent_pi);
+ bgp_lock_node((struct bgp_node *)parent_pi->net);
bgp_path_info_add(rn, pi);
} else {
if (attrhash_cmp(pi->attr, parent_pi->attr)
@@ -2516,24 +2541,9 @@ static int install_evpn_route_entry_in_vrf(struct bgp *bgp_vrf,
&& (struct bgp_path_info *)pi->extra->parent == parent_pi)
break;
- if (!pi) {
- /* Add (or update) attribute to hash. */
- attr_new = bgp_attr_intern(&attr);
-
- /* Create new route with its attribute. */
- pi = info_make(parent_pi->type, BGP_ROUTE_IMPORTED, 0,
- parent_pi->peer, attr_new, rn);
- SET_FLAG(pi->flags, BGP_PATH_VALID);
- bgp_path_info_extra_get(pi);
- pi->extra->parent = bgp_path_info_lock(parent_pi);
- bgp_lock_node((struct bgp_node *)parent_pi->net);
- if (parent_pi->extra) {
- memcpy(&pi->extra->label, &parent_pi->extra->label,
- sizeof(pi->extra->label));
- pi->extra->num_labels = parent_pi->extra->num_labels;
- }
- bgp_path_info_add(rn, pi);
- } else {
+ if (!pi)
+ bgp_create_evpn_bgp_path_info(parent_pi, rn);
+ else {
if (attrhash_cmp(pi->attr, &attr)
&& !CHECK_FLAG(pi->flags, BGP_PATH_REMOVED)) {
bgp_unlock_node(rn);
@@ -2595,24 +2605,9 @@ static int install_evpn_route_entry(struct bgp *bgp, struct bgpevpn *vpn,
&& (struct bgp_path_info *)pi->extra->parent == parent_pi)
break;
- if (!pi) {
- /* Add (or update) attribute to hash. */
- attr_new = bgp_attr_intern(parent_pi->attr);
-
- /* Create new route with its attribute. */
- pi = info_make(parent_pi->type, BGP_ROUTE_IMPORTED, 0,
- parent_pi->peer, attr_new, rn);
- SET_FLAG(pi->flags, BGP_PATH_VALID);
- bgp_path_info_extra_get(pi);
- pi->extra->parent = bgp_path_info_lock(parent_pi);
- bgp_lock_node((struct bgp_node *)parent_pi->net);
- if (parent_pi->extra) {
- memcpy(&pi->extra->label, &parent_pi->extra->label,
- sizeof(pi->extra->label));
- pi->extra->num_labels = parent_pi->extra->num_labels;
- }
- bgp_path_info_add(rn, pi);
- } else {
+ if (!pi)
+ bgp_create_evpn_bgp_path_info(parent_pi, rn);
+ else {
if (attrhash_cmp(pi->attr, parent_pi->attr)
&& !CHECK_FLAG(pi->flags, BGP_PATH_REMOVED)) {
bgp_unlock_node(rn);
diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c
index 2344db2e8d..34308bd0db 100644
--- a/bgpd/bgp_evpn_vty.c
+++ b/bgpd/bgp_evpn_vty.c
@@ -360,6 +360,9 @@ static void display_l3vni(struct vty *vty, struct bgp *bgp_vrf,
json_object_string_add(json, "originatorIp",
inet_ntoa(bgp_vrf->originator_ip));
json_object_string_add(json, "advertiseGatewayMacip", "n/a");
+ json_object_string_add(json, "advertiseSviMacip", "n/a");
+ json_object_to_json_string_ext(json,
+ JSON_C_TO_STRING_NOSLASHESCAPE);
} else {
vty_out(vty, "VNI: %d", bgp_vrf->l3vni);
vty_out(vty, " (known to the kernel)");
@@ -373,6 +376,7 @@ static void display_l3vni(struct vty *vty, struct bgp *bgp_vrf,
vty_out(vty, " Originator IP: %s\n",
inet_ntoa(bgp_vrf->originator_ip));
vty_out(vty, " Advertise-gw-macip : %s\n", "n/a");
+ vty_out(vty, " Advertise-svi-macip : %s\n", "n/a");
}
if (!json)
@@ -462,6 +466,9 @@ static void display_vni(struct vty *vty, struct bgpevpn *vpn, json_object *json)
struct ecommunity *ecom;
json_object *json_import_rtl = NULL;
json_object *json_export_rtl = NULL;
+ struct bgp *bgp_evpn;
+
+ bgp_evpn = bgp_get_evpn();
if (json) {
json_import_rtl = json_object_new_array();
@@ -477,8 +484,30 @@ static void display_vni(struct vty *vty, struct bgpevpn *vpn, json_object *json)
inet_ntoa(vpn->originator_ip));
json_object_string_add(json, "mcastGroup",
inet_ntoa(vpn->mcast_grp));
- json_object_string_add(json, "advertiseGatewayMacip",
- vpn->advertise_gw_macip ? "Yes" : "No");
+ /* per vni knob is enabled -- Enabled
+ * Global knob is enabled -- Active
+ * default -- Disabled
+ */
+ if (!vpn->advertise_gw_macip &&
+ bgp_evpn && bgp_evpn->advertise_gw_macip)
+ json_object_string_add(json, "advertiseGatewayMacip",
+ "Active");
+ else if (vpn->advertise_gw_macip)
+ json_object_string_add(json, "advertiseGatewayMacip",
+ "Enabled");
+ else
+ json_object_string_add(json, "advertiseGatewayMacip",
+ "Disabled");
+ if (!vpn->advertise_svi_macip && bgp_evpn &&
+ bgp_evpn->evpn_info->advertise_svi_macip)
+ json_object_string_add(json, "advertiseSviMacip",
+ "Active");
+ else if (vpn->advertise_svi_macip)
+ json_object_string_add(json, "advertiseSviMacip",
+ "Enabled");
+ else
+ json_object_string_add(json, "advertiseSviMacip",
+ "Disabled");
} else {
vty_out(vty, "VNI: %d", vpn->vni);
if (is_vni_live(vpn))
@@ -494,10 +523,26 @@ static void display_vni(struct vty *vty, struct bgpevpn *vpn, json_object *json)
inet_ntoa(vpn->originator_ip));
vty_out(vty, " Mcast group: %s\n",
inet_ntoa(vpn->mcast_grp));
- vty_out(vty, " Advertise-gw-macip : %s\n",
- vpn->advertise_gw_macip ? "Yes" : "No");
- vty_out(vty, " Advertise-svi-macip : %s\n",
- vpn->advertise_svi_macip ? "Yes" : "No");
+ if (!vpn->advertise_gw_macip &&
+ bgp_evpn && bgp_evpn->advertise_gw_macip)
+ vty_out(vty, " Advertise-gw-macip : %s\n",
+ "Active");
+ else if (vpn->advertise_gw_macip)
+ vty_out(vty, " Advertise-gw-macip : %s\n",
+ "Enabled");
+ else
+ vty_out(vty, " Advertise-gw-macip : %s\n",
+ "Disabled");
+ if (!vpn->advertise_svi_macip && bgp_evpn &&
+ bgp_evpn->evpn_info->advertise_svi_macip)
+ vty_out(vty, " Advertise-svi-macip : %s\n",
+ "Active");
+ else if (vpn->advertise_svi_macip)
+ vty_out(vty, " Advertise-svi-macip : %s\n",
+ "Enabled");
+ else
+ vty_out(vty, " Advertise-svi-macip : %s\n",
+ "Disabled");
}
if (!json)
@@ -3687,6 +3732,9 @@ DEFUN(show_bgp_l2vpn_evpn_vni,
bgp_evpn->advertise_gw_macip
? "Enabled"
: "Disabled");
+ json_object_string_add(json, "advertiseSviMacip",
+ bgp_evpn->evpn_info->advertise_svi_macip
+ ? "Enabled" : "Disabled");
json_object_string_add(json, "advertiseAllVnis",
is_evpn_enabled() ? "Enabled"
: "Disabled");
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index cf3b8e8bde..2f73b001f1 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -8971,7 +8971,7 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
/* Remote Label */
if (path->extra && bgp_is_valid_label(&path->extra->label[0])
- && safi != SAFI_EVPN) {
+ && (safi != SAFI_EVPN && !is_route_parent_evpn(path))) {
mpls_label_t label = label_pton(&path->extra->label[0]);
if (json_paths)