diff options
Diffstat (limited to 'bgpd/bgp_route.c')
| -rw-r--r-- | bgpd/bgp_route.c | 174 |
1 files changed, 79 insertions, 95 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 107aa1eb12..66ff16d53a 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -3663,7 +3663,7 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id, if (aspath_loop_check(attr->aspath, peer->change_local_as) > aspath_loop_count) { peer->stat_pfx_aspath_loop++; - reason = "as-path contains our own AS A;"; + reason = "as-path contains our own AS;"; goto filtered; } } @@ -4103,7 +4103,8 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id, nh_afi = BGP_ATTR_NH_AFI(afi, pi->attr); if (bgp_find_or_add_nexthop(bgp, bgp_nexthop, nh_afi, - safi, pi, NULL, connected) + safi, pi, NULL, connected, + p) || CHECK_FLAG(peer->flags, PEER_FLAG_IS_RFAPI_HD)) bgp_path_info_set_flag(dest, pi, BGP_PATH_VALID); @@ -4244,7 +4245,7 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id, nh_afi = BGP_ATTR_NH_AFI(afi, new->attr); if (bgp_find_or_add_nexthop(bgp, bgp, nh_afi, safi, new, NULL, - connected) + connected, p) || CHECK_FLAG(peer->flags, PEER_FLAG_IS_RFAPI_HD)) bgp_path_info_set_flag(dest, new, BGP_PATH_VALID); else { @@ -5683,7 +5684,7 @@ void bgp_static_update(struct bgp *bgp, const struct prefix *p, if (bgp_find_or_add_nexthop(bgp, bgp_nexthop, afi, safi, pi, NULL, - 0)) + 0, p)) bgp_path_info_set_flag(dest, pi, BGP_PATH_VALID); else { @@ -5735,7 +5736,8 @@ void bgp_static_update(struct bgp *bgp, const struct prefix *p, /* Nexthop reachability check. */ if (CHECK_FLAG(bgp->flags, BGP_FLAG_IMPORT_CHECK) && (safi == SAFI_UNICAST || safi == SAFI_LABELED_UNICAST)) { - if (bgp_find_or_add_nexthop(bgp, bgp, afi, safi, new, NULL, 0)) + if (bgp_find_or_add_nexthop(bgp, bgp, afi, safi, new, NULL, 0, + p)) bgp_path_info_set_flag(dest, new, BGP_PATH_VALID); else { if (BGP_DEBUG(nht, NHT)) { @@ -6052,6 +6054,7 @@ int bgp_static_set(struct bgp *bgp, const char *negate, struct prefix *pfx, && (label_index != bgp_static->label_index)) { snprintf(errmsg, errmsg_len, "label-index doesn't match static route\n"); + bgp_dest_unlock_node(dest); return -1; } @@ -6059,6 +6062,7 @@ int bgp_static_set(struct bgp *bgp, const char *negate, struct prefix *pfx, && strcmp(rmap, bgp_static->rmap.name)) { snprintf(errmsg, errmsg_len, "route-map name doesn't match static route\n"); + bgp_dest_unlock_node(dest); return -1; } @@ -9517,14 +9521,18 @@ void route_vty_out_overlay(struct vty *vty, const struct prefix *p, static void damp_route_vty_out(struct vty *vty, const struct prefix *p, struct bgp_path_info *path, int display, afi_t afi, safi_t safi, bool use_json, - json_object *json) + json_object *json_paths) { - struct attr *attr; + struct attr *attr = path->attr; int len; char timebuf[BGP_UPTIME_LEN]; + json_object *json_path = NULL; + + if (use_json) + json_path = json_object_new_object(); /* short status lead text */ - route_vty_short_status_out(vty, path, p, json); + route_vty_short_status_out(vty, path, p, json_path); /* print prefix and mask */ if (!use_json) { @@ -9532,147 +9540,125 @@ static void damp_route_vty_out(struct vty *vty, const struct prefix *p, route_vty_out_route(path->net, p, vty, NULL, false); else vty_out(vty, "%*s", 17, " "); - } - len = vty_out(vty, "%s", path->peer->host); - len = 17 - len; - if (len < 1) { - if (!use_json) + len = vty_out(vty, "%s", path->peer->host); + len = 17 - len; + + if (len < 1) vty_out(vty, "\n%*s", 34, " "); - } else { - if (use_json) - json_object_int_add(json, "peerHost", len); else vty_out(vty, "%*s", len, " "); - } - if (use_json) - bgp_damp_reuse_time_vty(vty, path, timebuf, BGP_UPTIME_LEN, afi, - safi, use_json, json); - else vty_out(vty, "%s ", bgp_damp_reuse_time_vty(vty, path, timebuf, BGP_UPTIME_LEN, afi, safi, - use_json, json)); + use_json, NULL)); - /* Print attribute */ - attr = path->attr; - - /* Print aspath */ - if (attr->aspath) { - if (use_json) - json_object_string_add(json, "asPath", - attr->aspath->str); - else + if (attr->aspath) aspath_print_vty(vty, "%s", attr->aspath, " "); - } - /* Print origin */ - if (use_json) - json_object_string_add(json, "origin", - bgp_origin_str[attr->origin]); - else vty_out(vty, "%s", bgp_origin_str[attr->origin]); - if (!use_json) vty_out(vty, "\n"); + } else { + bgp_damp_reuse_time_vty(vty, path, timebuf, BGP_UPTIME_LEN, afi, + safi, use_json, json_path); + + if (attr->aspath) + json_object_string_add(json_path, "asPath", + attr->aspath->str); + + json_object_string_add(json_path, "origin", + bgp_origin_str[attr->origin]); + json_object_string_add(json_path, "peerHost", path->peer->host); + + json_object_array_add(json_paths, json_path); + } } /* flap route */ static void flap_route_vty_out(struct vty *vty, const struct prefix *p, struct bgp_path_info *path, int display, afi_t afi, safi_t safi, bool use_json, - json_object *json) + json_object *json_paths) { - struct attr *attr; + struct attr *attr = path->attr; struct bgp_damp_info *bdi; char timebuf[BGP_UPTIME_LEN]; int len; + json_object *json_path = NULL; if (!path->extra) return; + if (use_json) + json_path = json_object_new_object(); + bdi = path->extra->damp_info; /* short status lead text */ - route_vty_short_status_out(vty, path, p, json); + route_vty_short_status_out(vty, path, p, json_path); - /* print prefix and mask */ if (!use_json) { if (!display) route_vty_out_route(path->net, p, vty, NULL, false); else vty_out(vty, "%*s", 17, " "); - } - len = vty_out(vty, "%s", path->peer->host); - len = 16 - len; - if (len < 1) { - if (!use_json) + len = vty_out(vty, "%s", path->peer->host); + len = 16 - len; + if (len < 1) vty_out(vty, "\n%*s", 33, " "); - } else { - if (use_json) - json_object_int_add(json, "peerHost", len); else vty_out(vty, "%*s", len, " "); - } - len = vty_out(vty, "%d", bdi->flap); - len = 5 - len; - if (len < 1) { - if (!use_json) + len = vty_out(vty, "%d", bdi->flap); + len = 5 - len; + if (len < 1) vty_out(vty, " "); - } else { - if (use_json) - json_object_int_add(json, "bdiFlap", len); else vty_out(vty, "%*s", len, " "); - } - if (use_json) - peer_uptime(bdi->start_time, timebuf, BGP_UPTIME_LEN, use_json, - json); - else vty_out(vty, "%s ", peer_uptime(bdi->start_time, timebuf, BGP_UPTIME_LEN, 0, NULL)); - if (CHECK_FLAG(path->flags, BGP_PATH_DAMPED) - && !CHECK_FLAG(path->flags, BGP_PATH_HISTORY)) { - if (use_json) - bgp_damp_reuse_time_vty(vty, path, timebuf, - BGP_UPTIME_LEN, afi, safi, - use_json, json); - else + if (CHECK_FLAG(path->flags, BGP_PATH_DAMPED) + && !CHECK_FLAG(path->flags, BGP_PATH_HISTORY)) vty_out(vty, "%s ", bgp_damp_reuse_time_vty(vty, path, timebuf, BGP_UPTIME_LEN, afi, - safi, use_json, json)); - } else { - if (!use_json) + safi, use_json, NULL)); + else vty_out(vty, "%*s ", 8, " "); - } - - /* Print attribute */ - attr = path->attr; - /* Print aspath */ - if (attr->aspath) { - if (use_json) - json_object_string_add(json, "asPath", - attr->aspath->str); - else + if (attr->aspath) aspath_print_vty(vty, "%s", attr->aspath, " "); - } - /* Print origin */ - if (use_json) - json_object_string_add(json, "origin", - bgp_origin_str[attr->origin]); - else vty_out(vty, "%s", bgp_origin_str[attr->origin]); - if (!use_json) vty_out(vty, "\n"); + } else { + json_object_string_add(json_path, "peerHost", path->peer->host); + json_object_int_add(json_path, "bdiFlap", bdi->flap); + + peer_uptime(bdi->start_time, timebuf, BGP_UPTIME_LEN, use_json, + json_path); + + if (CHECK_FLAG(path->flags, BGP_PATH_DAMPED) + && !CHECK_FLAG(path->flags, BGP_PATH_HISTORY)) + bgp_damp_reuse_time_vty(vty, path, timebuf, + BGP_UPTIME_LEN, afi, safi, + use_json, json_path); + + if (attr->aspath) + json_object_string_add(json_path, "asPath", + attr->aspath->str); + + json_object_string_add(json_path, "origin", + bgp_origin_str[attr->origin]); + + json_object_array_add(json_paths, json_path); + } } static void route_vty_out_advertised_to(struct vty *vty, struct peer *peer, @@ -10876,8 +10862,7 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi, const char *com2alias = bgp_community2alias( communities[i]); - if (strncmp(alias, com2alias, - strlen(com2alias)) + if (strcmp(alias, com2alias) == 0) { found = true; break; @@ -10892,8 +10877,7 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi, const char *com2alias = bgp_community2alias( communities[i]); - if (strncmp(alias, com2alias, - strlen(com2alias)) + if (strcmp(alias, com2alias) == 0) { found = true; break; @@ -12194,7 +12178,7 @@ DEFPY(show_ip_bgp_json, show_ip_bgp_json_cmd, |route-filter-translated-v4] [exact-match]\ |rpki <invalid|valid|notfound>\ |version (1-4294967295)\ - |alias WORD\ + |alias ALIAS_NAME\ ] [json$uj [detail$detail] | wide$wide]", SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR BGP_SAFI_WITH_LABEL_HELP_STR |
