summaryrefslogtreecommitdiffstats
path: root/bgpd/bgp_route.c
diff options
context:
space:
mode:
authorSri Mohana Singamsetty <srimohans@gmail.com>2019-12-16 18:43:01 +0100
committerGitHub <noreply@github.com>2019-12-16 18:43:01 +0100
commit8887295390c5785b82922eeb5caba49da2f373d9 (patch)
treec83b601421823f2fef5a38270c5cf6997090c0be /bgpd/bgp_route.c
parentMerge pull request #5379 from pogojotz/fix-bgp-neighbors-prefix-count-segfault (diff)
parenttests: Test if `ip` and `fqdn` are included in `show [ip] bgp json` (diff)
downloadfrr-8887295390c5785b82922eeb5caba49da2f373d9.tar.xz
frr-8887295390c5785b82922eeb5caba49da2f373d9.zip
Merge pull request #5502 from ton31337/fix/rr_do_not_show_fqdn
bgpd: Show `ip` and `fqdn` in json output for `show [ip] bgp json`
Diffstat (limited to 'bgpd/bgp_route.c')
-rw-r--r--bgpd/bgp_route.c212
1 files changed, 116 insertions, 96 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index d936c4640..11118af40 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -7148,9 +7148,10 @@ static void route_vty_short_status_out(struct vty *vty,
vty_out(vty, " ");
}
-static char *bgp_nexthop_fqdn(struct peer *peer)
+static char *bgp_nexthop_hostname(struct peer *peer, struct attr *attr)
{
- if (peer->hostname && bgp_flag_check(peer->bgp, BGP_FLAG_SHOW_HOSTNAME))
+ if (peer->hostname && bgp_flag_check(peer->bgp, BGP_FLAG_SHOW_HOSTNAME)
+ && !(attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID)))
return peer->hostname;
return NULL;
}
@@ -7160,7 +7161,7 @@ void route_vty_out(struct vty *vty, struct prefix *p,
struct bgp_path_info *path, int display, safi_t safi,
json_object *json_paths)
{
- struct attr *attr;
+ struct attr *attr = path->attr;
json_object *json_path = NULL;
json_object *json_nexthops = NULL;
json_object *json_nexthop_global = NULL;
@@ -7172,7 +7173,7 @@ void route_vty_out(struct vty *vty, struct prefix *p,
bool nexthop_othervrf = false;
vrf_id_t nexthop_vrfid = VRF_DEFAULT;
const char *nexthop_vrfname = VRF_DEFAULT_NAME;
- char *nexthop_fqdn = bgp_nexthop_fqdn(path->peer);
+ char *nexthop_hostname = bgp_nexthop_hostname(path->peer, attr);
if (json_paths)
json_path = json_object_new_object();
@@ -7190,9 +7191,6 @@ void route_vty_out(struct vty *vty, struct prefix *p,
route_vty_out_route(p, vty, json_path);
}
- /* Print attribute */
- attr = path->attr;
-
/*
* If vrf id of nexthop is different from that of prefix,
* set up printable string to append
@@ -7260,57 +7258,67 @@ void route_vty_out(struct vty *vty, struct prefix *p,
if (json_paths) {
json_nexthop_global = json_object_new_object();
- json_object_string_add(
- json_nexthop_global, "afi",
- nexthop_fqdn ? "fqdn"
- : (af == AF_INET) ? "ip" : "ipv6");
- json_object_string_add(
- json_nexthop_global,
- nexthop_fqdn ? "fqdn"
- : (af == AF_INET) ? "ip" : "ipv6",
- nexthop_fqdn ? nexthop_fqdn : nexthop);
+ json_object_string_add(json_nexthop_global, "ip",
+ nexthop);
+
+ if (nexthop_hostname)
+ json_object_string_add(json_nexthop_global,
+ "hostname",
+ nexthop_hostname);
+
+ json_object_string_add(json_nexthop_global, "afi",
+ (af == AF_INET) ? "ipv4"
+ : "ipv6");
json_object_boolean_true_add(json_nexthop_global,
"used");
} else
vty_out(vty, "%s%s",
- nexthop_fqdn ? nexthop_fqdn : nexthop,
+ nexthop_hostname ? nexthop_hostname : nexthop,
vrf_id_str);
} else if (safi == SAFI_EVPN) {
if (json_paths) {
json_nexthop_global = json_object_new_object();
- json_object_string_add(
- json_nexthop_global,
- nexthop_fqdn ? "fqdn" : "ip",
- nexthop_fqdn ? nexthop_fqdn
- : inet_ntoa(attr->nexthop));
+ json_object_string_add(json_nexthop_global, "ip",
+ inet_ntoa(attr->nexthop));
+
+ if (nexthop_hostname)
+ json_object_string_add(json_nexthop_global,
+ "hostname",
+ nexthop_hostname);
+
json_object_string_add(json_nexthop_global, "afi",
"ipv4");
json_object_boolean_true_add(json_nexthop_global,
"used");
} else
vty_out(vty, "%-16s%s",
- nexthop_fqdn ?: inet_ntoa(attr->nexthop),
+ nexthop_hostname ? nexthop_hostname
+ : inet_ntoa(attr->nexthop),
vrf_id_str);
} else if (safi == SAFI_FLOWSPEC) {
if (attr->nexthop.s_addr != 0) {
if (json_paths) {
json_nexthop_global = json_object_new_object();
- json_object_string_add(
- json_nexthop_global,
- nexthop_fqdn ? "fqdn" : "ip",
- nexthop_fqdn
- ? nexthop_fqdn
- : inet_ntoa(attr->nexthop));
+
json_object_string_add(json_nexthop_global,
"afi", "ipv4");
+ json_object_string_add(
+ json_nexthop_global, "ip",
+ inet_ntoa(attr->nexthop));
+
+ if (nexthop_hostname)
+ json_object_string_add(
+ json_nexthop_global, "hostname",
+ nexthop_hostname);
+
json_object_boolean_true_add(
json_nexthop_global,
"used");
} else {
vty_out(vty, "%-16s",
- nexthop_fqdn
- ? nexthop_fqdn
+ nexthop_hostname
+ ? nexthop_hostname
: inet_ntoa(attr->nexthop));
}
}
@@ -7318,11 +7326,13 @@ void route_vty_out(struct vty *vty, struct prefix *p,
if (json_paths) {
json_nexthop_global = json_object_new_object();
- json_object_string_add(json_nexthop_global,
- nexthop_fqdn ? "fqdn" : "ip",
- nexthop_fqdn
- ? nexthop_fqdn
- : inet_ntoa(attr->nexthop));
+ json_object_string_add(json_nexthop_global, "ip",
+ inet_ntoa(attr->nexthop));
+
+ if (nexthop_hostname)
+ json_object_string_add(json_nexthop_global,
+ "hostname",
+ nexthop_hostname);
json_object_string_add(json_nexthop_global, "afi",
"ipv4");
@@ -7332,8 +7342,8 @@ void route_vty_out(struct vty *vty, struct prefix *p,
char buf[BUFSIZ];
snprintf(buf, sizeof(buf), "%s%s",
- nexthop_fqdn ? nexthop_fqdn
- : inet_ntoa(attr->nexthop),
+ nexthop_hostname ? nexthop_hostname
+ : inet_ntoa(attr->nexthop),
vrf_id_str);
vty_out(vty, "%-16s", buf);
}
@@ -7347,13 +7357,15 @@ void route_vty_out(struct vty *vty, struct prefix *p,
if (json_paths) {
json_nexthop_global = json_object_new_object();
json_object_string_add(
- json_nexthop_global,
- nexthop_fqdn ? "fqdn" : "ip",
- nexthop_fqdn
- ? nexthop_fqdn
- : inet_ntop(AF_INET6,
- &attr->mp_nexthop_global,
- buf, BUFSIZ));
+ json_nexthop_global, "ip",
+ inet_ntop(AF_INET6, &attr->mp_nexthop_global,
+ buf, BUFSIZ));
+
+ if (nexthop_hostname)
+ json_object_string_add(json_nexthop_global,
+ "hostname",
+ nexthop_hostname);
+
json_object_string_add(json_nexthop_global, "afi",
"ipv6");
json_object_string_add(json_nexthop_global, "scope",
@@ -7366,14 +7378,16 @@ void route_vty_out(struct vty *vty, struct prefix *p,
|| (path->peer->conf_if)) {
json_nexthop_ll = json_object_new_object();
json_object_string_add(
- json_nexthop_ll,
- nexthop_fqdn ? "fqdn" : "ip",
- nexthop_fqdn
- ? nexthop_fqdn
- : inet_ntop(
- AF_INET6,
- &attr->mp_nexthop_local,
- buf, BUFSIZ));
+ json_nexthop_ll, "ip",
+ inet_ntop(AF_INET6,
+ &attr->mp_nexthop_local, buf,
+ BUFSIZ));
+
+ if (nexthop_hostname)
+ json_object_string_add(
+ json_nexthop_ll, "hostname",
+ nexthop_hostname);
+
json_object_string_add(json_nexthop_ll, "afi",
"ipv6");
json_object_string_add(json_nexthop_ll, "scope",
@@ -7413,8 +7427,8 @@ void route_vty_out(struct vty *vty, struct prefix *p,
} else {
len = vty_out(
vty, "%s%s",
- nexthop_fqdn
- ? nexthop_fqdn
+ nexthop_hostname
+ ? nexthop_hostname
: inet_ntop(
AF_INET6,
&attr->mp_nexthop_local,
@@ -7430,8 +7444,8 @@ void route_vty_out(struct vty *vty, struct prefix *p,
} else {
len = vty_out(
vty, "%s%s",
- nexthop_fqdn
- ? nexthop_fqdn
+ nexthop_hostname
+ ? nexthop_hostname
: inet_ntop(
AF_INET6,
&attr->mp_nexthop_global,
@@ -8262,7 +8276,7 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
char buf[INET6_ADDRSTRLEN];
char buf1[BUFSIZ];
char buf2[EVPN_ROUTE_STRLEN];
- struct attr *attr;
+ struct attr *attr = path->attr;
int sockunion_vty_out(struct vty *, union sockunion *);
time_t tbuf;
json_object *json_bestpath = NULL;
@@ -8287,7 +8301,7 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
bool nexthop_self =
CHECK_FLAG(path->flags, BGP_PATH_ANNC_NH_SELF) ? true : false;
int i;
- char *nexthop_fqdn = bgp_nexthop_fqdn(path->peer);
+ char *nexthop_hostname = bgp_nexthop_hostname(path->peer, attr);
if (json_paths) {
json_path = json_object_new_object();
@@ -8340,8 +8354,6 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
}
}
- attr = path->attr;
-
/* Line1 display AS-path, Aggregator */
if (attr->aspath) {
if (json_paths) {
@@ -8429,32 +8441,35 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
|| !BGP_ATTR_NEXTHOP_AFI_IP6(attr))) {
if (safi == SAFI_MPLS_VPN || safi == SAFI_ENCAP
|| safi == SAFI_EVPN) {
- if (json_paths)
+ if (json_paths) {
json_object_string_add(
- json_nexthop_global,
- nexthop_fqdn ? "fqdn" : "ip",
- nexthop_fqdn
- ? nexthop_fqdn
- : inet_ntoa(
- attr->mp_nexthop_global_in));
- else
+ json_nexthop_global, "ip",
+ inet_ntoa(attr->mp_nexthop_global_in));
+
+ if (nexthop_hostname)
+ json_object_string_add(
+ json_nexthop_global, "hostname",
+ nexthop_hostname);
+ } else
vty_out(vty, " %s",
- nexthop_fqdn
- ? nexthop_fqdn
+ nexthop_hostname
+ ? nexthop_hostname
: inet_ntoa(
- attr->mp_nexthop_global_in));
+ attr->mp_nexthop_global_in));
} else {
- if (json_paths)
+ if (json_paths) {
json_object_string_add(
- json_nexthop_global,
- nexthop_fqdn ? "fqdn" : "ip",
- nexthop_fqdn
- ? nexthop_fqdn
- : inet_ntoa(attr->nexthop));
- else
+ json_nexthop_global, "ip",
+ inet_ntoa(attr->nexthop));
+
+ if (nexthop_hostname)
+ json_object_string_add(
+ json_nexthop_global, "hostname",
+ nexthop_hostname);
+ } else
vty_out(vty, " %s",
- nexthop_fqdn
- ? nexthop_fqdn
+ nexthop_hostname
+ ? nexthop_hostname
: inet_ntoa(attr->nexthop));
}
@@ -8464,21 +8479,23 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
} else {
if (json_paths) {
json_object_string_add(
- json_nexthop_global,
- nexthop_fqdn ? "fqdn" : "ip",
- nexthop_fqdn
- ? nexthop_fqdn
- : inet_ntop(AF_INET6,
- &attr->mp_nexthop_global,
- buf, INET6_ADDRSTRLEN));
+ json_nexthop_global, "ip",
+ inet_ntop(AF_INET6, &attr->mp_nexthop_global,
+ buf, INET6_ADDRSTRLEN));
+
+ if (nexthop_hostname)
+ json_object_string_add(json_nexthop_global,
+ "hostname",
+ nexthop_hostname);
+
json_object_string_add(json_nexthop_global, "afi",
"ipv6");
json_object_string_add(json_nexthop_global, "scope",
"global");
} else {
vty_out(vty, " %s",
- nexthop_fqdn
- ? nexthop_fqdn
+ nexthop_hostname
+ ? nexthop_hostname
: inet_ntop(AF_INET6,
&attr->mp_nexthop_global,
buf, INET6_ADDRSTRLEN));
@@ -8650,12 +8667,15 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
if (json_paths) {
json_nexthop_ll = json_object_new_object();
json_object_string_add(
- json_nexthop_ll, nexthop_fqdn ? "fqdn" : "ip",
- nexthop_fqdn
- ? nexthop_fqdn
- : inet_ntop(AF_INET6,
- &attr->mp_nexthop_local,
- buf, INET6_ADDRSTRLEN));
+ json_nexthop_ll, "ip",
+ inet_ntop(AF_INET6, &attr->mp_nexthop_local,
+ buf, INET6_ADDRSTRLEN));
+
+ if (nexthop_hostname)
+ json_object_string_add(json_nexthop_ll,
+ "hostname",
+ nexthop_hostname);
+
json_object_string_add(json_nexthop_ll, "afi", "ipv6");
json_object_string_add(json_nexthop_ll, "scope",
"link-local");