diff options
| -rw-r--r-- | bgpd/bgp_evpn.c | 69 | ||||
| -rw-r--r-- | bgpd/bgp_evpn_vty.c | 60 | ||||
| -rw-r--r-- | bgpd/bgp_route.c | 2 |
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) |
