Merge pull request #14134 from lucize/frrup

frr: update to 7.5
This commit is contained in:
Rosen Penev 2020-12-04 17:15:58 -08:00 committed by GitHub
commit 72a1ff001a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 12 additions and 1537 deletions

View File

@ -7,16 +7,20 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=frr
PKG_VERSION:=7.4
PKG_RELEASE:=2
PKG_VERSION:=7.5
PKG_RELEASE:=1
PKG_SOURCE_DATE:=2020-12-02
PKG_SOURCE_URL:=https://github.com/FRRouting/frr/archive/
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_HASH:=3c8204fda1c9b178d8446562579bbbc49d134b98f3ad02aa56f68724a2f9e40a
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_DATE).tar.gz
PKG_SOURCE_VERSION:=b1e06590a7b4d4b8f7309f432ababebb1b3fa754
PKG_SOURCE_URL:=https://codeload.github.com/FRRouting/frr/tar.gz/$(PKG_SOURCE_VERSION)?
PKG_HASH:=901763a6deff56c7e1738c4fadbfbb9846548d3d2a2572d4d1a75109805bd055
PKG_MAINTAINER:=Lucian Cristian <lucian.cristian@gmail.com>
HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)-$(PKG_NAME)-$(PKG_VERSION)
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_NAME)-$(PKG_VERSION)
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_SOURCE_VERSION)
HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)-$(PKG_SOURCE_VERSION)
PKG_LICENSE:=GPL-2.0-only LGPL-2.1-only
@ -38,7 +42,6 @@ PKG_DAEMON_AVAILABLE:= \
staticd \
vrrpd
PKG_CONFIG_DEPENDS:= \
CONFIG_IPV6 \
CONFIG_FRR_OPENSSL \

View File

@ -1,4 +1,4 @@
# The watchfrr and zebra daemons are always started.
# The staticd,watchfrr and zebra daemons are always started.
#
bgpd=no
ospfd=no

View File

@ -1,69 +0,0 @@
From 34f6d0c67a48e2117c061f6ccdcf1f512982fe8f Mon Sep 17 00:00:00 2001
From: Donald Sharp <sharpd@cumulusnetworks.com>
Date: Tue, 2 Jun 2020 16:10:48 -0400
Subject: [PATCH] bgpd: Actually find the sequence number for `bgp
extcommunity-list...`
The code in the bgp extcommunity-list function was using
argv_find to get the correct idx. The problem was that
we had already done argv_finds before and idx was non-zero
thus having us always set the seq pointer to what was last
looked up. This causes us to pass in a value to the
underlying function and it would just wisely ignore it
causing a seq number of 0.
We would then write this seq number of 0 and then immediately
reject it on read in again. BOO!
Actually handle argv_find the way it was meant to be.
Ticket:CM-29926
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
---
bgpd/bgp_vty.c | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 3669205ee3..9c8f1e1def 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -17617,8 +17617,7 @@ DEFUN (extcommunity_list_standard,
argv_find(argv, argc, "WORD", &idx);
cl_number_or_name = argv[idx]->arg;
- argv_find(argv, argc, "(1-4294967295)", &idx);
- if (idx)
+ if (argv_find(argv, argc, "(1-4294967295)", &idx))
seq = argv[idx]->arg;
direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
@@ -17663,8 +17662,7 @@ DEFUN (extcommunity_list_name_expanded,
argv_find(argv, argc, "WORD", &idx);
cl_number_or_name = argv[idx]->arg;
- argv_find(argv, argc, "(1-4294967295)", &idx);
- if (idx)
+ if (argv_find(argv, argc, "(1-4294967295)", &idx))
seq = argv[idx]->arg;
direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
@@ -17707,8 +17705,7 @@ DEFUN (no_extcommunity_list_standard_all,
char *seq = NULL;
int idx = 0;
- argv_find(argv, argc, "(1-4294967295)", &idx);
- if (idx)
+ if (argv_find(argv, argc, "(1-4294967295)", &idx))
seq = argv[idx]->arg;
idx = 0;
@@ -17772,8 +17769,7 @@ DEFUN (no_extcommunity_list_expanded_all,
char *seq = NULL;
int idx = 0;
- argv_find(argv, argc, "(1-4294967295)", &idx);
- if (idx)
+ if (argv_find(argv, argc, "(1-4294967295)", &idx))
seq = argv[idx]->arg;
idx = 0;

View File

@ -1,83 +0,0 @@
From acf6f22d150b0050afbdaf5887b8e25d1614db4c Mon Sep 17 00:00:00 2001
From: Donatas Abraitis <donatas.abraitis@gmail.com>
Date: Thu, 2 Jul 2020 11:08:29 +0300
Subject: [PATCH 1/2] bgpd: Return bool type for ecommunity_add_val and
subgroup_announce_check
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
---
bgpd/bgp_ecommunity.c | 6 +++---
bgpd/bgp_route.c | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/bgpd/bgp_ecommunity.c b/bgpd/bgp_ecommunity.c
index d13da74b04..7d5cac4d62 100644
--- a/bgpd/bgp_ecommunity.c
+++ b/bgpd/bgp_ecommunity.c
@@ -107,14 +107,14 @@ bool ecommunity_add_val(struct ecommunity *ecom, struct ecommunity_val *eval,
p[1] == eval->val[1]) {
if (overwrite) {
memcpy(p, eval->val, ECOMMUNITY_SIZE);
- return 1;
+ return true;
}
- return 0;
+ return false;
}
}
int ret = memcmp(p, eval->val, ECOMMUNITY_SIZE);
if (ret == 0)
- return 0;
+ return false;
if (ret > 0) {
if (!unique)
break;
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 6ae7a59a14..7bfefde482 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -1941,7 +1941,7 @@ bool subgroup_announce_check(struct bgp_node *rn, struct bgp_path_info *pi,
/* Codification of AS 0 Processing */
if (aspath_check_as_zero(attr->aspath))
- return 0;
+ return false;
if (CHECK_FLAG(bgp->flags, BGP_FLAG_GRACEFUL_SHUTDOWN)) {
if (peer->sort == BGP_PEER_IBGP
From d5a157b7c377081d23b136b5ba4849abdcbecd97 Mon Sep 17 00:00:00 2001
From: Donatas Abraitis <donatas.abraitis@gmail.com>
Date: Thu, 2 Jul 2020 11:39:40 +0300
Subject: [PATCH 2/2] bgpd: Actually find the sequence number for
large-community-list
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
---
bgpd/bgp_vty.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 9c8f1e1def..67ff31df8f 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -17235,8 +17235,7 @@ static int lcommunity_list_set_vty(struct vty *vty, int argc,
char *cl_name;
char *seq = NULL;
- argv_find(argv, argc, "(1-4294967295)", &idx);
- if (idx)
+ if (argv_find(argv, argc, "(1-4294967295)", &idx))
seq = argv[idx]->arg;
idx = 0;
@@ -17285,8 +17284,7 @@ static int lcommunity_list_unset_vty(struct vty *vty, int argc,
int idx = 0;
char *seq = NULL;
- argv_find(argv, argc, "(1-4294967295)", &idx);
- if (idx)
+ if (argv_find(argv, argc, "(1-4294967295)", &idx))
seq = argv[idx]->arg;
idx = 0;

View File

@ -1,29 +0,0 @@
From cc45875e0d2af0b53100ec78364dc51b39a12ac9 Mon Sep 17 00:00:00 2001
From: Rafael Zalamena <rzalamena@opensourcerouting.org>
Date: Mon, 6 Jul 2020 11:39:27 -0300
Subject: [PATCH] lib: fix route map description memory leak
Route map entries are not getting a chance to call `description` string
deallocation on shutdown or when the parent entry is destroyed, so lets
add a code to handle this in the `route_map_index_delete` function.
Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
(cherry picked from commit f0951335830203426074ddca4317f84b477e4afb)
---
lib/routemap.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/lib/routemap.c b/lib/routemap.c
index 3d69a3495a..3b45133450 100644
--- a/lib/routemap.c
+++ b/lib/routemap.c
@@ -971,6 +971,9 @@ void route_map_index_delete(struct route_map_index *index, int notify)
zlog_debug("Deleting route-map %s sequence %d",
index->map->name, index->pref);
+ /* Free route map entry description. */
+ XFREE(MTYPE_TMP, index->description);
+
/* Free route map northbound hook contexts. */
while ((rhc = TAILQ_FIRST(&index->rhclist)) != NULL)
routemap_hook_context_free(rhc);

View File

@ -1,288 +0,0 @@
From 2939f712d152f7e3ae438cc0f1d96dd9485e7487 Mon Sep 17 00:00:00 2001
From: Donatas Abraitis <donatas.abraitis@gmail.com>
Date: Thu, 9 Jul 2020 16:00:27 +0300
Subject: [PATCH 1/2] bgpd: Add command to show only established sessions
```
exit1-debian-9# show bgp summary
IPv4 Unicast Summary:
BGP router identifier 192.168.0.1, local AS number 100 vrf-id 0
BGP table version 8
RIB entries 15, using 2880 bytes of memory
Peers 2, using 43 KiB of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt
192.168.0.2 4 200 10 6 0 0 0 00:00:35 8 8
2a02:4780::2 4 0 0 1 0 0 0 never Active 0
Total number of neighbors 2
exit1-debian-9# show bgp summary established
IPv4 Unicast Summary:
BGP router identifier 192.168.0.1, local AS number 100 vrf-id 0
BGP table version 8
RIB entries 15, using 2880 bytes of memory
Peers 2, using 43 KiB of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt
192.168.0.2 4 200 10 6 0 0 0 00:00:39 8 8
Total number of neighbors 2
exit1-debian-9# show bgp summary failed
IPv4 Unicast Summary:
BGP router identifier 192.168.0.1, local AS number 100 vrf-id 0
BGP table version 8
RIB entries 15, using 2880 bytes of memory
Peers 2, using 43 KiB of memory
Neighbor EstdCnt DropCnt ResetTime Reason
2a02:4780::2 0 0 never Waiting for peer OPEN
Total number of neighbors 2
exit1-debian-9#
```
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
---
bgpd/bgp_evpn_vty.c | 11 ++++++++---
bgpd/bgp_vty.c | 43 +++++++++++++++++++++++++++++++------------
bgpd/bgp_vty.h | 3 ++-
3 files changed, 41 insertions(+), 16 deletions(-)
diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c
index 85604d856d..42987117d4 100644
--- a/bgpd/bgp_evpn_vty.c
+++ b/bgpd/bgp_evpn_vty.c
@@ -4077,7 +4077,7 @@ DEFUN(show_bgp_l2vpn_evpn_es,
*/
DEFUN(show_bgp_l2vpn_evpn_summary,
show_bgp_l2vpn_evpn_summary_cmd,
- "show bgp [vrf VRFNAME] l2vpn evpn summary [failed] [json]",
+ "show bgp [vrf VRFNAME] l2vpn evpn summary [established|failed] [json]",
SHOW_STR
BGP_STR
"bgp vrf\n"
@@ -4085,6 +4085,7 @@ DEFUN(show_bgp_l2vpn_evpn_summary,
L2VPN_HELP_STR
EVPN_HELP_STR
"Summary of BGP neighbor status\n"
+ "Show only sessions in Established state\n"
"Show only sessions not in Established state\n"
JSON_STR)
{
@@ -4092,13 +4093,17 @@ DEFUN(show_bgp_l2vpn_evpn_summary,
bool uj = use_json(argc, argv);
char *vrf = NULL;
bool show_failed = false;
+ bool show_established = false;
if (argv_find(argv, argc, "vrf", &idx_vrf))
vrf = argv[++idx_vrf]->arg;
if (argv_find(argv, argc, "failed", &idx_vrf))
show_failed = true;
- return bgp_show_summary_vty(vty, vrf, AFI_L2VPN, SAFI_EVPN,
- show_failed, uj);
+ if (argv_find(argv, argc, "established", &idx_vrf))
+ show_established = true;
+
+ return bgp_show_summary_vty(vty, vrf, AFI_L2VPN, SAFI_EVPN, show_failed,
+ show_established, uj);
}
/*
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 67ff31df8f..78521457fd 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -8772,7 +8772,8 @@ static void bgp_show_failed_summary(struct vty *vty, struct bgp *bgp,
/* Show BGP peer's summary information. */
static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
- bool show_failed, bool use_json)
+ bool show_failed, bool show_established,
+ bool use_json)
{
struct peer *peer;
struct listnode *node, *nnode;
@@ -9104,6 +9105,10 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
bgp_show_failed_summary(vty, bgp, peer,
json_peer, 0, use_json);
} else if (!show_failed) {
+ if (show_established
+ && bgp_has_peer_failed(peer, afi, safi))
+ continue;
+
json_peer = json_object_new_object();
if (peer_dynamic_neighbor(peer)) {
json_object_boolean_true_add(json_peer,
@@ -9193,6 +9198,10 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
max_neighbor_width,
use_json);
} else if (!show_failed) {
+ if (show_established
+ && bgp_has_peer_failed(peer, afi, safi))
+ continue;
+
memset(dn_flag, '\0', sizeof(dn_flag));
if (peer_dynamic_neighbor(peer)) {
dn_flag[0] = '*';
@@ -9315,7 +9324,8 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
}
static void bgp_show_summary_afi_safi(struct vty *vty, struct bgp *bgp, int afi,
- int safi, bool show_failed, bool use_json)
+ int safi, bool show_failed,
+ bool show_established, bool use_json)
{
int is_first = 1;
int afi_wildcard = (afi == AFI_MAX);
@@ -9358,7 +9368,8 @@ static void bgp_show_summary_afi_safi(struct vty *vty, struct bgp *bgp, int afi,
false));
}
}
- bgp_show_summary(vty, bgp, afi, safi, show_failed,
+ bgp_show_summary(vty, bgp, afi, safi,
+ show_failed, show_established,
use_json);
}
safi++;
@@ -9382,6 +9393,7 @@ static void bgp_show_summary_afi_safi(struct vty *vty, struct bgp *bgp, int afi,
static void bgp_show_all_instances_summary_vty(struct vty *vty, afi_t afi,
safi_t safi, bool show_failed,
+ bool show_established,
bool use_json)
{
struct listnode *node, *nnode;
@@ -9411,7 +9423,7 @@ static void bgp_show_all_instances_summary_vty(struct vty *vty, afi_t afi,
: bgp->name);
}
bgp_show_summary_afi_safi(vty, bgp, afi, safi, show_failed,
- use_json);
+ show_established, use_json);
}
if (use_json)
@@ -9421,15 +9433,16 @@ static void bgp_show_all_instances_summary_vty(struct vty *vty, afi_t afi,
}
int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
- safi_t safi, bool show_failed, bool use_json)
+ safi_t safi, bool show_failed, bool show_established,
+ bool use_json)
{
struct bgp *bgp;
if (name) {
if (strmatch(name, "all")) {
- bgp_show_all_instances_summary_vty(vty, afi, safi,
- show_failed,
- use_json);
+ bgp_show_all_instances_summary_vty(
+ vty, afi, safi, show_failed, show_established,
+ use_json);
return CMD_SUCCESS;
} else {
bgp = bgp_lookup_by_name(name);
@@ -9444,7 +9457,8 @@ int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
}
bgp_show_summary_afi_safi(vty, bgp, afi, safi,
- show_failed, use_json);
+ show_failed, show_established,
+ use_json);
return CMD_SUCCESS;
}
}
@@ -9453,7 +9467,7 @@ int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
if (bgp)
bgp_show_summary_afi_safi(vty, bgp, afi, safi, show_failed,
- use_json);
+ show_established, use_json);
else {
if (use_json)
vty_out(vty, "{}\n");
@@ -9468,7 +9482,7 @@ int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
/* `show [ip] bgp summary' commands. */
DEFUN (show_ip_bgp_summary,
show_ip_bgp_summary_cmd,
- "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]] summary [failed] [json]",
+ "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]] summary [established|failed] [json]",
SHOW_STR
IP_STR
BGP_STR
@@ -9476,6 +9490,7 @@ DEFUN (show_ip_bgp_summary,
BGP_AFI_HELP_STR
BGP_SAFI_WITH_LABEL_HELP_STR
"Summary of BGP neighbor status\n"
+ "Show only sessions in Established state\n"
"Show only sessions not in Established state\n"
JSON_STR)
{
@@ -9483,6 +9498,7 @@ DEFUN (show_ip_bgp_summary,
afi_t afi = AFI_MAX;
safi_t safi = SAFI_MAX;
bool show_failed = false;
+ bool show_established = false;
int idx = 0;
@@ -9504,10 +9520,13 @@ DEFUN (show_ip_bgp_summary,
if (argv_find(argv, argc, "failed", &idx))
show_failed = true;
+ if (argv_find(argv, argc, "established", &idx))
+ show_established = true;
bool uj = use_json(argc, argv);
- return bgp_show_summary_vty(vty, vrf, afi, safi, show_failed, uj);
+ return bgp_show_summary_vty(vty, vrf, afi, safi, show_failed,
+ show_established, uj);
}
const char *get_afi_safi_str(afi_t afi, safi_t safi, bool for_json)
diff --git a/bgpd/bgp_vty.h b/bgpd/bgp_vty.h
index d6ca198d09..95eefbc36f 100644
--- a/bgpd/bgp_vty.h
+++ b/bgpd/bgp_vty.h
@@ -178,6 +178,7 @@ extern int bgp_vty_find_and_parse_afi_safi_bgp(struct vty *vty,
int bgp_vty_find_and_parse_bgp(struct vty *vty, struct cmd_token **argv,
int argc, struct bgp **bgp, bool use_json);
extern int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
- safi_t safi, bool show_failed, bool use_json);
+ safi_t safi, bool show_failed,
+ bool show_established, bool use_json);
#endif /* _QUAGGA_BGP_VTY_H */
From 2600443342d8e21d30df2b6ca095a5f2d0d4de2d Mon Sep 17 00:00:00 2001
From: Donatas Abraitis <donatas.abraitis@gmail.com>
Date: Thu, 9 Jul 2020 16:05:08 +0300
Subject: [PATCH 2/2] doc: Add 'show bgp summary established' command
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
---
doc/user/bgp.rst | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/doc/user/bgp.rst b/doc/user/bgp.rst
index cb343e8dad..36227db604 100644
--- a/doc/user/bgp.rst
+++ b/doc/user/bgp.rst
@@ -2710,6 +2710,12 @@ structure is extended with :clicmd:`show bgp [afi] [safi]`.
Show a bgp peer summary for peers that are not succesfully exchanging routes
for the specified address family, and subsequent address-family.
+.. index:: show bgp [afi] [safi] summary established [json]
+.. clicmd:: show bgp [afi] [safi] summary established [json]
+
+ Show a bgp peer summary for peers that are succesfully exchanging routes
+ for the specified address family, and subsequent address-family.
+
.. index:: show bgp [afi] [safi] neighbor [PEER]
.. clicmd:: show bgp [afi] [safi] neighbor [PEER]

View File

@ -1,57 +0,0 @@
From 692ce87393de9497a7821e9e0856ff70a7973ff6 Mon Sep 17 00:00:00 2001
From: Paul Manley <paul.manley@wholefoods.com>
Date: Thu, 9 Jul 2020 11:21:16 -0500
Subject: [PATCH 1/2] tools: create sub-context for bfd peers
add lines starting with 'peer' to the list of sub-contexts that are handled by frr-reload.py.
https://github.com/FRRouting/frr/issues/6511#issuecomment-655163833
Signed-off-by: Paul Manley <paul.manley@wholefoods.com>
(cherry picked from commit 1c23a0aaa1c5d20af50af75b070e93e1eff21222)
---
tools/frr-reload.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/tools/frr-reload.py b/tools/frr-reload.py
index d4020cdfc9..e9641b2b13 100755
--- a/tools/frr-reload.py
+++ b/tools/frr-reload.py
@@ -496,6 +496,7 @@ def load_contexts(self):
line.startswith("vnc defaults") or
line.startswith("vnc l2-group") or
line.startswith("vnc nve-group") or
+ line.startswith("peer") or
line.startswith("member pseudowire")):
main_ctx_key = []
From 2604086c3d9face0aca2497a982782c865bb2b59 Mon Sep 17 00:00:00 2001
From: Paul Manley <paul.manley@wholefoods.com>
Date: Thu, 9 Jul 2020 11:25:34 -0500
Subject: [PATCH 2/2] vtysh: properly exit BFD_PEER_NODE when marking file
vtysh needs to be aware of how to properly exit a bfd peer when subsequent commands only succeed in a higher context.
https://github.com/FRRouting/frr/issues/6511#issuecomment-656166206
Signed-off-by: Paul Manley <paul.manley@wholefoods.com>
(cherry picked from commit b727c12aabf1afc2b6e33f8590c9786e349e4fcb)
---
vtysh/vtysh.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c
index 15ec866fc9..4fdf68c0e6 100644
--- a/vtysh/vtysh.c
+++ b/vtysh/vtysh.c
@@ -809,6 +809,9 @@ int vtysh_mark_file(const char *filename)
} else if ((prev_node == KEYCHAIN_KEY_NODE)
&& (tried == 1)) {
vty_out(vty, "exit\n");
+ } else if ((prev_node == BFD_PEER_NODE)
+ && (tried == 1)) {
+ vty_out(vty, "exit\n");
} else if (tried) {
vty_out(vty, "end\n");
}

View File

@ -1,120 +0,0 @@
From cc5934ed5939315ba5d95bfaf052625762107205 Mon Sep 17 00:00:00 2001
From: Donald Sharp <sharpd@cumulusnetworks.com>
Date: Tue, 30 Jun 2020 08:59:46 -0400
Subject: [PATCH 1/2] vtysh: master is a non-sorted list
The commit:
a798241265a5808083a06b14ce1637d1ddf6a45a
attempted to use sorted master lists to do faster lookups
by using a RB Tree. Unfortunately the original code
was creating a list->cmp function *but* never using it.
If you look at the commit, it clearly shows that the
function listnode_add is used to insert but when you
look at that function it is a tail push.
Fixes: #6573
Namely now this ordering is preserved:
bgp as-path access-list originate-only permit ^$
bgp as-path access-list originate-only deny .*
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
---
vtysh/vtysh_config.c | 21 ++++++++++-----------
1 file changed, 10 insertions(+), 11 deletions(-)
diff --git a/vtysh/vtysh_config.c b/vtysh/vtysh_config.c
index abbb111f9d..2ab9dd5a9a 100644
--- a/vtysh/vtysh_config.c
+++ b/vtysh/vtysh_config.c
@@ -34,7 +34,7 @@ DEFINE_MTYPE_STATIC(MVTYSH, VTYSH_CONFIG_LINE, "Vtysh configuration line")
vector configvec;
-PREDECL_RBTREE_UNIQ(config_master);
+PREDECL_LIST(config_master);
struct config {
/* Configuration node name. */
@@ -72,11 +72,6 @@ static struct config *config_new(void)
return config;
}
-static int config_cmp(const struct config *c1, const struct config *c2)
-{
- return strcmp(c1->name, c2->name);
-}
-
static void config_del(struct config *config)
{
list_delete(&config->line);
@@ -84,13 +79,15 @@ static void config_del(struct config *config)
XFREE(MTYPE_VTYSH_CONFIG, config);
}
-DECLARE_RBTREE_UNIQ(config_master, struct config, rbt_item, config_cmp)
+DECLARE_LIST(config_master, struct config, rbt_item)
static struct config *config_get(int index, const char *line)
{
- struct config *config;
+ struct config *config, *config_loop;
struct config_master_head *master;
+ config = config_loop = NULL;
+
master = vector_lookup_ensure(configvec, index);
if (!master) {
@@ -99,8 +96,10 @@ static struct config *config_get(int index, const char *line)
vector_set_index(configvec, index, master);
}
- const struct config config_ref = { .name = (char *)line };
- config = config_master_find(master, &config_ref);
+ frr_each (config_master, master, config_loop) {
+ if (strcmp(config_loop->name, line) == 0)
+ config = config_loop;
+ }
if (!config) {
config = config_new();
@@ -109,7 +108,7 @@ static struct config *config_get(int index, const char *line)
config->line->cmp = (int (*)(void *, void *))line_cmp;
config->name = XSTRDUP(MTYPE_VTYSH_CONFIG_LINE, line);
config->index = index;
- config_master_add(master, config);
+ config_master_add_tail(master, config);
}
return config;
}
From 3e4d90ec556649e11954f2f56b5282f95e7e013b Mon Sep 17 00:00:00 2001
From: Donald Sharp <sharpd@cumulusnetworks.com>
Date: Tue, 30 Jun 2020 09:03:55 -0400
Subject: [PATCH 2/2] vtysh: Improve lookup performance
When we find the line we are interested in, stop looking.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
---
vtysh/vtysh_config.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/vtysh/vtysh_config.c b/vtysh/vtysh_config.c
index 2ab9dd5a9a..61bcf3b658 100644
--- a/vtysh/vtysh_config.c
+++ b/vtysh/vtysh_config.c
@@ -97,8 +97,10 @@ static struct config *config_get(int index, const char *line)
}
frr_each (config_master, master, config_loop) {
- if (strcmp(config_loop->name, line) == 0)
+ if (strcmp(config_loop->name, line) == 0) {
config = config_loop;
+ break;
+ }
}
if (!config) {

View File

@ -1,835 +0,0 @@
From c6a5994609deec62c8aefa1fa15c517e32575ca3 Mon Sep 17 00:00:00 2001
From: Donatas Abraitis <donatas.abraitis@gmail.com>
Date: Wed, 6 May 2020 17:45:31 +0300
Subject: [PATCH 1/4] tests: Remove bgp_show_ip_bgp_fqdn test
Not really relevant for now.
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
---
.../bgp_show_ip_bgp_fqdn/__init__.py | 0
.../bgp_show_ip_bgp_fqdn/r1/bgpd.conf | 5 -
.../bgp_show_ip_bgp_fqdn/r1/zebra.conf | 9 --
.../bgp_show_ip_bgp_fqdn/r2/bgpd.conf | 5 -
.../bgp_show_ip_bgp_fqdn/r2/zebra.conf | 12 --
.../bgp_show_ip_bgp_fqdn/r3/bgpd.conf | 3 -
.../bgp_show_ip_bgp_fqdn/r3/zebra.conf | 6 -
.../test_bgp_show_ip_bgp_fqdn.py | 133 ------------------
8 files changed, 173 deletions(-)
delete mode 100644 tests/topotests/bgp_show_ip_bgp_fqdn/__init__.py
delete mode 100644 tests/topotests/bgp_show_ip_bgp_fqdn/r1/bgpd.conf
delete mode 100644 tests/topotests/bgp_show_ip_bgp_fqdn/r1/zebra.conf
delete mode 100644 tests/topotests/bgp_show_ip_bgp_fqdn/r2/bgpd.conf
delete mode 100644 tests/topotests/bgp_show_ip_bgp_fqdn/r2/zebra.conf
delete mode 100644 tests/topotests/bgp_show_ip_bgp_fqdn/r3/bgpd.conf
delete mode 100644 tests/topotests/bgp_show_ip_bgp_fqdn/r3/zebra.conf
delete mode 100644 tests/topotests/bgp_show_ip_bgp_fqdn/test_bgp_show_ip_bgp_fqdn.py
diff --git a/tests/topotests/bgp_show_ip_bgp_fqdn/__init__.py b/tests/topotests/bgp_show_ip_bgp_fqdn/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/tests/topotests/bgp_show_ip_bgp_fqdn/r1/bgpd.conf b/tests/topotests/bgp_show_ip_bgp_fqdn/r1/bgpd.conf
deleted file mode 100644
index f0df56e947..0000000000
--- a/tests/topotests/bgp_show_ip_bgp_fqdn/r1/bgpd.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-router bgp 65000
- no bgp ebgp-requires-policy
- neighbor 192.168.255.2 remote-as 65001
- address-family ipv4 unicast
- redistribute connected
diff --git a/tests/topotests/bgp_show_ip_bgp_fqdn/r1/zebra.conf b/tests/topotests/bgp_show_ip_bgp_fqdn/r1/zebra.conf
deleted file mode 100644
index 0a283c06d5..0000000000
--- a/tests/topotests/bgp_show_ip_bgp_fqdn/r1/zebra.conf
+++ /dev/null
@@ -1,9 +0,0 @@
-!
-interface lo
- ip address 172.16.255.254/32
-!
-interface r1-eth0
- ip address 192.168.255.1/24
-!
-ip forwarding
-!
diff --git a/tests/topotests/bgp_show_ip_bgp_fqdn/r2/bgpd.conf b/tests/topotests/bgp_show_ip_bgp_fqdn/r2/bgpd.conf
deleted file mode 100644
index 422a7345f9..0000000000
--- a/tests/topotests/bgp_show_ip_bgp_fqdn/r2/bgpd.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-router bgp 65001
- no bgp ebgp-requires-policy
- bgp default show-hostname
- neighbor 192.168.255.1 remote-as 65000
- neighbor 192.168.254.1 remote-as 65001
diff --git a/tests/topotests/bgp_show_ip_bgp_fqdn/r2/zebra.conf b/tests/topotests/bgp_show_ip_bgp_fqdn/r2/zebra.conf
deleted file mode 100644
index e9e2e4391f..0000000000
--- a/tests/topotests/bgp_show_ip_bgp_fqdn/r2/zebra.conf
+++ /dev/null
@@ -1,12 +0,0 @@
-!
-interface lo
- ip address 172.16.255.253/32
-!
-interface r2-eth0
- ip address 192.168.255.2/24
-!
-interface r2-eth1
- ip address 192.168.254.2/24
-!
-ip forwarding
-!
diff --git a/tests/topotests/bgp_show_ip_bgp_fqdn/r3/bgpd.conf b/tests/topotests/bgp_show_ip_bgp_fqdn/r3/bgpd.conf
deleted file mode 100644
index 8fcf6a736d..0000000000
--- a/tests/topotests/bgp_show_ip_bgp_fqdn/r3/bgpd.conf
+++ /dev/null
@@ -1,3 +0,0 @@
-router bgp 65001
- bgp default show-hostname
- neighbor 192.168.254.2 remote-as 65001
diff --git a/tests/topotests/bgp_show_ip_bgp_fqdn/r3/zebra.conf b/tests/topotests/bgp_show_ip_bgp_fqdn/r3/zebra.conf
deleted file mode 100644
index a8b8bc38c5..0000000000
--- a/tests/topotests/bgp_show_ip_bgp_fqdn/r3/zebra.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-!
-interface r3-eth0
- ip address 192.168.254.1/24
-!
-ip forwarding
-!
diff --git a/tests/topotests/bgp_show_ip_bgp_fqdn/test_bgp_show_ip_bgp_fqdn.py b/tests/topotests/bgp_show_ip_bgp_fqdn/test_bgp_show_ip_bgp_fqdn.py
deleted file mode 100644
index e8ad180935..0000000000
--- a/tests/topotests/bgp_show_ip_bgp_fqdn/test_bgp_show_ip_bgp_fqdn.py
+++ /dev/null
@@ -1,133 +0,0 @@
-#!/usr/bin/env python
-
-#
-# test_bgp_show_ip_bgp_fqdn.py
-# Part of NetDEF Topology Tests
-#
-# Copyright (c) 2019 by
-# Donatas Abraitis <donatas.abraitis@gmail.com>
-#
-# Permission to use, copy, modify, and/or distribute this software
-# for any purpose with or without fee is hereby granted, provided
-# that the above copyright notice and this permission notice appear
-# in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
-# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
-# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
-# OF THIS SOFTWARE.
-#
-
-"""
-test_bgp_show_ip_bgp_fqdn.py:
-Test if FQND is visible in `show [ip] bgp` output if
-`bgp default show-hostname` is toggled.
-
-Topology:
-r1 <-- eBGP --> r2 <-- iBGP --> r3
-
-1. Check if both hostname and ip are added to JSON output
-for 172.16.255.254/32 on r2.
-2. Check if only ip is added to JSON output for 172.16.255.254/32 on r3.
-"""
-
-import os
-import sys
-import json
-import time
-import pytest
-import functools
-
-CWD = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(CWD, "../"))
-
-# pylint: disable=C0413
-from lib import topotest
-from lib.topogen import Topogen, TopoRouter, get_topogen
-from lib.topolog import logger
-from mininet.topo import Topo
-
-
-class TemplateTopo(Topo):
- def build(self, *_args, **_opts):
- tgen = get_topogen(self)
-
- for routern in range(1, 4):
- tgen.add_router("r{}".format(routern))
-
- switch = tgen.add_switch("s1")
- switch.add_link(tgen.gears["r1"])
- switch.add_link(tgen.gears["r2"])
-
- switch = tgen.add_switch("s2")
- switch.add_link(tgen.gears["r2"])
- switch.add_link(tgen.gears["r3"])
-
-
-def setup_module(mod):
- tgen = Topogen(TemplateTopo, mod.__name__)
- tgen.start_topology()
-
- router_list = tgen.routers()
-
- for i, (rname, router) in enumerate(router_list.iteritems(), 1):
- router.load_config(
- TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
- )
- router.load_config(
- TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
- )
-
- tgen.start_router()
-
-
-def teardown_module(mod):
- tgen = get_topogen()
- tgen.stop_topology()
-
-
-def test_bgp_show_ip_bgp_hostname():
- tgen = get_topogen()
-
- if tgen.routers_have_failure():
- pytest.skip(tgen.errors)
-
- def _bgp_converge(router):
- output = json.loads(router.vtysh_cmd("show ip bgp 172.16.255.254/32 json"))
- expected = {"prefix": "172.16.255.254/32"}
- return topotest.json_cmp(output, expected)
-
- def _bgp_show_nexthop_hostname_and_ip(router):
- output = json.loads(router.vtysh_cmd("show ip bgp json"))
- for nh in output["routes"]["172.16.255.254/32"][0]["nexthops"]:
- if "hostname" in nh and "ip" in nh:
- return True
- return False
-
- def _bgp_show_nexthop_ip_only(router):
- output = json.loads(router.vtysh_cmd("show ip bgp json"))
- for nh in output["routes"]["172.16.255.254/32"][0]["nexthops"]:
- if "ip" in nh and not "hostname" in nh:
- return True
- return False
-
- test_func = functools.partial(_bgp_converge, tgen.gears["r2"])
- success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
-
- test_func = functools.partial(_bgp_converge, tgen.gears["r3"])
- success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
-
- assert result is None, 'Failed bgp convergence in "{}"'.format(tgen.gears["r2"])
- assert _bgp_show_nexthop_hostname_and_ip(tgen.gears["r2"]) == True
-
- assert result is None, 'Failed bgp convergence in "{}"'.format(tgen.gears["r3"])
- assert _bgp_show_nexthop_ip_only(tgen.gears["r3"]) == True
-
-
-if __name__ == "__main__":
- args = ["-s"] + sys.argv[1:]
- sys.exit(pytest.main(args))
From e7cc3d21452bd771a97bc46ab5a1e4853c46f944 Mon Sep 17 00:00:00 2001
From: Donatas Abraitis <donatas.abraitis@gmail.com>
Date: Wed, 6 May 2020 17:46:10 +0300
Subject: [PATCH 2/4] bgpd: Show the real next-hop address in addition to
hostname in `show bgp`
It's hard to cope with cases when next-hop is changed/unchanged or
peers are non-direct.
It would be better to show the hostname and nexthop IP address (both)
under `show bgp` to quickly identify the source and the real next-hop
of the route.
If `bgp default show-nexthop-hostname` is toggled the output looks like:
```
spine1-debian-9# show bgp
BGP table version is 1, local router ID is 2.2.2.2, vrf id 0
Default local pref 100, local AS 65002
Status codes: s suppressed, d damped, h history, * valid, > best, = multipath,
i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
* 2a02:4780::/64 fe80::a00:27ff:fe09:f8a3(exit1-debian-9)
0 0 65001 ?
spine1-debian-9# show ip bgp
BGP table version is 5, local router ID is 2.2.2.2, vrf id 0
Default local pref 100, local AS 65002
Status codes: s suppressed, d damped, h history, * valid, > best, = multipath,
i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 10.255.255.0/24 192.168.0.1(exit1-debian-9)
0 0 65001 ?
```
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
---
bgpd/bgp_route.c | 161 ++++++++++++++++++++++++++++++-----------------
bgpd/bgp_vty.c | 45 +++++++++++++
bgpd/bgpd.h | 1 +
3 files changed, 149 insertions(+), 58 deletions(-)
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 7bfefde482..f033f525e5 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -7559,8 +7559,7 @@ static char *bgp_nexthop_hostname(struct peer *peer,
struct bgp_nexthop_cache *bnc)
{
if (peer->hostname
- && CHECK_FLAG(peer->bgp->flags, BGP_FLAG_SHOW_HOSTNAME) && bnc
- && CHECK_FLAG(bnc->flags, BGP_NEXTHOP_CONNECTED))
+ && CHECK_FLAG(peer->bgp->flags, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME))
return peer->hostname;
return NULL;
}
@@ -7570,6 +7569,7 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
struct bgp_path_info *path, int display, safi_t safi,
json_object *json_paths)
{
+ int len;
struct attr *attr = path->attr;
json_object *json_path = NULL;
json_object *json_nexthops = NULL;
@@ -7681,10 +7681,19 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
: "ipv6");
json_object_boolean_true_add(json_nexthop_global,
"used");
- } else
- vty_out(vty, "%s%s",
- nexthop_hostname ? nexthop_hostname : nexthop,
- vrf_id_str);
+ } else {
+ if (nexthop_hostname)
+ len = vty_out(vty, "%s(%s)%s", nexthop,
+ nexthop_hostname, vrf_id_str);
+ else
+ len = vty_out(vty, "%s%s", nexthop, vrf_id_str);
+
+ len = 16 - len;
+ if (len < 1)
+ vty_out(vty, "\n%*s", 36, " ");
+ else
+ vty_out(vty, "%*s", len, " ");
+ }
} else if (safi == SAFI_EVPN) {
if (json_paths) {
json_nexthop_global = json_object_new_object();
@@ -7701,11 +7710,20 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
"ipv4");
json_object_boolean_true_add(json_nexthop_global,
"used");
- } else
- vty_out(vty, "%-16s%s",
- nexthop_hostname ? nexthop_hostname
- : inet_ntoa(attr->nexthop),
- vrf_id_str);
+ } else {
+ if (nexthop_hostname)
+ len = vty_out(vty, "%pI4(%s)%s", &attr->nexthop,
+ nexthop_hostname, vrf_id_str);
+ else
+ len = vty_out(vty, "%pI4%s", &attr->nexthop,
+ vrf_id_str);
+
+ len = 16 - len;
+ if (len < 1)
+ vty_out(vty, "\n%*s", 36, " ");
+ else
+ vty_out(vty, "%*s", len, " ");
+ }
} else if (safi == SAFI_FLOWSPEC) {
if (attr->nexthop.s_addr != INADDR_ANY) {
if (json_paths) {
@@ -7726,10 +7744,21 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
json_nexthop_global,
"used");
} else {
- vty_out(vty, "%-16s",
- nexthop_hostname
- ? nexthop_hostname
- : inet_ntoa(attr->nexthop));
+ if (nexthop_hostname)
+ len = vty_out(vty, "%pI4(%s)%s",
+ &attr->nexthop,
+ nexthop_hostname,
+ vrf_id_str);
+ else
+ len = vty_out(vty, "%pI4%s",
+ &attr->nexthop,
+ vrf_id_str);
+
+ len = 16 - len;
+ if (len < 1)
+ vty_out(vty, "\n%*s", 36, " ");
+ else
+ vty_out(vty, "%*s", len, " ");
}
}
} else if (p->family == AF_INET && !BGP_ATTR_NEXTHOP_AFI_IP6(attr)) {
@@ -7749,19 +7778,23 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
json_object_boolean_true_add(json_nexthop_global,
"used");
} else {
- char buf[BUFSIZ];
+ if (nexthop_hostname)
+ len = vty_out(vty, "%pI4(%s)%s", &attr->nexthop,
+ nexthop_hostname, vrf_id_str);
+ else
+ len = vty_out(vty, "%pI4%s", &attr->nexthop,
+ vrf_id_str);
- snprintf(buf, sizeof(buf), "%s%s",
- nexthop_hostname ? nexthop_hostname
- : inet_ntoa(attr->nexthop),
- vrf_id_str);
- vty_out(vty, "%-16s", buf);
+ len = 16 - len;
+ if (len < 1)
+ vty_out(vty, "\n%*s", 36, " ");
+ else
+ vty_out(vty, "%*s", len, " ");
}
}
/* IPv6 Next Hop */
else if (p->family == AF_INET6 || BGP_ATTR_NEXTHOP_AFI_IP6(attr)) {
- int len;
char buf[BUFSIZ];
if (json_paths) {
@@ -7835,15 +7868,18 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
else
vty_out(vty, "%*s", len, " ");
} else {
- len = vty_out(
- vty, "%s%s",
- nexthop_hostname
- ? nexthop_hostname
- : inet_ntop(
- AF_INET6,
- &attr->mp_nexthop_local,
- buf, BUFSIZ),
- vrf_id_str);
+ if (nexthop_hostname)
+ len = vty_out(
+ vty, "%pI6(%s)%s",
+ &attr->mp_nexthop_local,
+ nexthop_hostname,
+ vrf_id_str);
+ else
+ len = vty_out(
+ vty, "%pI6%s",
+ &attr->mp_nexthop_local,
+ vrf_id_str);
+
len = 16 - len;
if (len < 1)
@@ -7852,15 +7888,16 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
vty_out(vty, "%*s", len, " ");
}
} else {
- len = vty_out(
- vty, "%s%s",
- nexthop_hostname
- ? nexthop_hostname
- : inet_ntop(
- AF_INET6,
- &attr->mp_nexthop_global,
- buf, BUFSIZ),
- vrf_id_str);
+ if (nexthop_hostname)
+ len = vty_out(vty, "%pI6(%s)%s",
+ &attr->mp_nexthop_global,
+ nexthop_hostname,
+ vrf_id_str);
+ else
+ len = vty_out(vty, "%pI6%s",
+ &attr->mp_nexthop_global,
+ vrf_id_str);
+
len = 16 - len;
if (len < 1)
@@ -7986,6 +8023,7 @@ void route_vty_out_tmp(struct vty *vty, const struct prefix *p,
{
json_object *json_status = NULL;
json_object *json_net = NULL;
+ int len;
char buff[BUFSIZ];
/* Route status display. */
@@ -8079,7 +8117,6 @@ void route_vty_out_tmp(struct vty *vty, const struct prefix *p,
inet_ntoa(attr->nexthop));
} else if (p->family == AF_INET6
|| BGP_ATTR_NEXTHOP_AFI_IP6(attr)) {
- int len;
char buf[BUFSIZ];
len = vty_out(
@@ -8823,12 +8860,15 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
json_object_string_add(
json_nexthop_global, "hostname",
nexthop_hostname);
- } else
- vty_out(vty, " %s",
- nexthop_hostname
- ? nexthop_hostname
- : inet_ntoa(
- attr->mp_nexthop_global_in));
+ } else {
+ if (nexthop_hostname)
+ vty_out(vty, " %pI4(%s)",
+ &attr->mp_nexthop_global_in,
+ nexthop_hostname);
+ else
+ vty_out(vty, " %pI4",
+ &attr->mp_nexthop_global_in);
+ }
} else {
if (json_paths) {
json_object_string_add(
@@ -8839,11 +8879,15 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
json_object_string_add(
json_nexthop_global, "hostname",
nexthop_hostname);
- } else
- vty_out(vty, " %s",
- nexthop_hostname
- ? nexthop_hostname
- : inet_ntoa(attr->nexthop));
+ } else {
+ if (nexthop_hostname)
+ vty_out(vty, " %pI4(%s)",
+ &attr->nexthop,
+ nexthop_hostname);
+ else
+ vty_out(vty, " %pI4",
+ &attr->nexthop);
+ }
}
if (json_paths)
@@ -8866,12 +8910,13 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
json_object_string_add(json_nexthop_global, "scope",
"global");
} else {
- vty_out(vty, " %s",
- nexthop_hostname
- ? nexthop_hostname
- : inet_ntop(AF_INET6,
- &attr->mp_nexthop_global,
- buf, INET6_ADDRSTRLEN));
+ if (nexthop_hostname)
+ vty_out(vty, " %pI6(%s)",
+ &attr->mp_nexthop_global,
+ nexthop_hostname);
+ else
+ vty_out(vty, " %pI6",
+ &attr->mp_nexthop_global);
}
}
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 78521457fd..7f00ff3fbe 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -84,6 +84,10 @@ FRR_CFG_DEFAULT_BOOL(BGP_SHOW_HOSTNAME,
{ .val_bool = true, .match_profile = "datacenter", },
{ .val_bool = false },
)
+FRR_CFG_DEFAULT_BOOL(BGP_SHOW_NEXTHOP_HOSTNAME,
+ { .val_bool = true, .match_profile = "datacenter", },
+ { .val_bool = false },
+)
FRR_CFG_DEFAULT_BOOL(BGP_LOG_NEIGHBOR_CHANGES,
{ .val_bool = true, .match_profile = "datacenter", },
{ .val_bool = false },
@@ -422,6 +426,8 @@ int bgp_get_vty(struct bgp **bgp, as_t *as, const char *name,
SET_FLAG((*bgp)->flags, BGP_FLAG_IMPORT_CHECK);
if (DFLT_BGP_SHOW_HOSTNAME)
SET_FLAG((*bgp)->flags, BGP_FLAG_SHOW_HOSTNAME);
+ if (DFLT_BGP_SHOW_NEXTHOP_HOSTNAME)
+ SET_FLAG((*bgp)->flags, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME);
if (DFLT_BGP_LOG_NEIGHBOR_CHANGES)
SET_FLAG((*bgp)->flags, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
if (DFLT_BGP_DETERMINISTIC_MED)
@@ -3100,6 +3106,32 @@ DEFUN (no_bgp_default_show_hostname,
return CMD_SUCCESS;
}
+/* Display hostname in certain command outputs */
+DEFUN (bgp_default_show_nexthop_hostname,
+ bgp_default_show_nexthop_hostname_cmd,
+ "bgp default show-nexthop-hostname",
+ "BGP specific commands\n"
+ "Configure BGP defaults\n"
+ "Show hostname for nexthop in certain command outputs\n")
+{
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
+ SET_FLAG(bgp->flags, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME);
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_default_show_nexthop_hostname,
+ no_bgp_default_show_nexthop_hostname_cmd,
+ "no bgp default show-nexthop-hostname",
+ NO_STR
+ "BGP specific commands\n"
+ "Configure BGP defaults\n"
+ "Show hostname for nexthop in certain command outputs\n")
+{
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
+ UNSET_FLAG(bgp->flags, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME);
+ return CMD_SUCCESS;
+}
+
/* "bgp network import-check" configuration. */
DEFUN (bgp_network_import_check,
bgp_network_import_check_cmd,
@@ -15190,6 +15222,15 @@ int bgp_config_write(struct vty *vty)
? ""
: "no ");
+ /* BGP default show-nexthop-hostname */
+ if (!!CHECK_FLAG(bgp->flags, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME)
+ != SAVE_BGP_SHOW_HOSTNAME)
+ vty_out(vty, " %sbgp default show-nexthop-hostname\n",
+ CHECK_FLAG(bgp->flags,
+ BGP_FLAG_SHOW_NEXTHOP_HOSTNAME)
+ ? ""
+ : "no ");
+
/* BGP default subgroup-pkt-queue-max. */
if (bgp->default_subgroup_pkt_queue_max
!= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX)
@@ -15815,6 +15856,10 @@ void bgp_vty_init(void)
install_element(BGP_NODE, &bgp_default_show_hostname_cmd);
install_element(BGP_NODE, &no_bgp_default_show_hostname_cmd);
+ /* bgp default show-nexthop-hostname */
+ install_element(BGP_NODE, &bgp_default_show_nexthop_hostname_cmd);
+ install_element(BGP_NODE, &no_bgp_default_show_nexthop_hostname_cmd);
+
/* "bgp default subgroup-pkt-queue-max" commands. */
install_element(BGP_NODE, &bgp_default_subgroup_pkt_queue_max_cmd);
install_element(BGP_NODE, &no_bgp_default_subgroup_pkt_queue_max_cmd);
diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h
index 4a5772a53b..4efc068dea 100644
--- a/bgpd/bgpd.h
+++ b/bgpd/bgpd.h
@@ -447,6 +447,7 @@ struct bgp {
#define BGP_FLAG_SELECT_DEFER_DISABLE (1 << 23)
#define BGP_FLAG_GR_DISABLE_EOR (1 << 24)
#define BGP_FLAG_EBGP_REQUIRES_POLICY (1 << 25)
+#define BGP_FLAG_SHOW_NEXTHOP_HOSTNAME (1 << 26)
enum global_mode GLOBAL_GR_FSM[BGP_GLOBAL_GR_MODE]
[BGP_GLOBAL_GR_EVENT_CMD];
From 104dfe5258cbeb0443fa4d6577794a1e5a5dafd3 Mon Sep 17 00:00:00 2001
From: Donatas Abraitis <donatas.abraitis@gmail.com>
Date: Wed, 6 May 2020 17:50:04 +0300
Subject: [PATCH 3/4] bgpd: Add "hostname" in JSON output for `show bgp` family
outputs
This adds hostname regardless if `bgp default show-hostname` enabled or not.
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
---
bgpd/bgp_route.c | 40 ++++++++++++++++++++--------------------
1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index f033f525e5..5f645fa871 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -7671,10 +7671,10 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
json_object_string_add(json_nexthop_global, "ip",
nexthop);
- if (nexthop_hostname)
+ if (path->peer->hostname)
json_object_string_add(json_nexthop_global,
"hostname",
- nexthop_hostname);
+ path->peer->hostname);
json_object_string_add(json_nexthop_global, "afi",
(af == AF_INET) ? "ipv4"
@@ -7701,10 +7701,10 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
json_object_string_add(json_nexthop_global, "ip",
inet_ntoa(attr->nexthop));
- if (nexthop_hostname)
+ if (path->peer->hostname)
json_object_string_add(json_nexthop_global,
"hostname",
- nexthop_hostname);
+ path->peer->hostname);
json_object_string_add(json_nexthop_global, "afi",
"ipv4");
@@ -7735,10 +7735,10 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
json_nexthop_global, "ip",
inet_ntoa(attr->nexthop));
- if (nexthop_hostname)
+ if (path->peer->hostname)
json_object_string_add(
json_nexthop_global, "hostname",
- nexthop_hostname);
+ path->peer->hostname);
json_object_boolean_true_add(
json_nexthop_global,
@@ -7768,10 +7768,10 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
json_object_string_add(json_nexthop_global, "ip",
inet_ntoa(attr->nexthop));
- if (nexthop_hostname)
+ if (path->peer->hostname)
json_object_string_add(json_nexthop_global,
"hostname",
- nexthop_hostname);
+ path->peer->hostname);
json_object_string_add(json_nexthop_global, "afi",
"ipv4");
@@ -7804,10 +7804,10 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
inet_ntop(AF_INET6, &attr->mp_nexthop_global,
buf, BUFSIZ));
- if (nexthop_hostname)
+ if (path->peer->hostname)
json_object_string_add(json_nexthop_global,
"hostname",
- nexthop_hostname);
+ path->peer->hostname);
json_object_string_add(json_nexthop_global, "afi",
"ipv6");
@@ -7826,10 +7826,10 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
&attr->mp_nexthop_local, buf,
BUFSIZ));
- if (nexthop_hostname)
+ if (path->peer->hostname)
json_object_string_add(
json_nexthop_ll, "hostname",
- nexthop_hostname);
+ path->peer->hostname);
json_object_string_add(json_nexthop_ll, "afi",
"ipv6");
@@ -8856,10 +8856,10 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
json_nexthop_global, "ip",
inet_ntoa(attr->mp_nexthop_global_in));
- if (nexthop_hostname)
+ if (path->peer->hostname)
json_object_string_add(
json_nexthop_global, "hostname",
- nexthop_hostname);
+ path->peer->hostname);
} else {
if (nexthop_hostname)
vty_out(vty, " %pI4(%s)",
@@ -8875,10 +8875,10 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
json_nexthop_global, "ip",
inet_ntoa(attr->nexthop));
- if (nexthop_hostname)
+ if (path->peer->hostname)
json_object_string_add(
json_nexthop_global, "hostname",
- nexthop_hostname);
+ path->peer->hostname);
} else {
if (nexthop_hostname)
vty_out(vty, " %pI4(%s)",
@@ -8900,10 +8900,10 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
inet_ntop(AF_INET6, &attr->mp_nexthop_global,
buf, INET6_ADDRSTRLEN));
- if (nexthop_hostname)
+ if (path->peer->hostname)
json_object_string_add(json_nexthop_global,
"hostname",
- nexthop_hostname);
+ path->peer->hostname);
json_object_string_add(json_nexthop_global, "afi",
"ipv6");
@@ -9094,10 +9094,10 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
inet_ntop(AF_INET6, &attr->mp_nexthop_local,
buf, INET6_ADDRSTRLEN));
- if (nexthop_hostname)
+ if (path->peer->hostname)
json_object_string_add(json_nexthop_ll,
"hostname",
- nexthop_hostname);
+ path->peer->hostname);
json_object_string_add(json_nexthop_ll, "afi", "ipv6");
json_object_string_add(json_nexthop_ll, "scope",
From 8df39282ea64e2a65a7910012627f78d080833b1 Mon Sep 17 00:00:00 2001
From: Donatas Abraitis <donatas.abraitis@gmail.com>
Date: Wed, 24 Jun 2020 17:26:27 +0300
Subject: [PATCH 4/4] doc: Add some words about `bgp default
show-[nexthop]-hostname`
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
---
doc/user/bgp.rst | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/doc/user/bgp.rst b/doc/user/bgp.rst
index 36227db604..a6c29724b0 100644
--- a/doc/user/bgp.rst
+++ b/doc/user/bgp.rst
@@ -1366,6 +1366,19 @@ Configuring Peers
on by default or not. This command defaults to on and is not displayed.
The `no bgp default ipv4-unicast` form of the command is displayed.
+.. index:: [no] bgp default show-hostname
+.. clicmd:: [no] bgp default show-hostname
+
+ This command shows the hostname of the peer in certain BGP commands
+ outputs. It's easier to troubleshoot if you have a number of BGP peers.
+
+.. index:: [no] bgp default show-nexthop-hostname
+.. clicmd:: [no] bgp default show-nexthop-hostname
+
+ This command shows the hostname of the next-hop in certain BGP commands
+ outputs. It's easier to troubleshoot if you have a number of BGP peers
+ and a number of routes to check.
+
.. index:: [no] neighbor PEER advertisement-interval (0-600)
.. clicmd:: [no] neighbor PEER advertisement-interval (0-600)

View File

@ -1,30 +0,0 @@
From 2bbe7133eb5cb97ba4b745cd251a8615cd2bd008 Mon Sep 17 00:00:00 2001
From: Richard Wu <wutong23@baidu.com>
Date: Fri, 5 Jun 2020 17:54:57 +0800
Subject: [PATCH] bgpd: Fix the bug that BGP MRAI does not work.
Issue: bgp_process_writes will be called when the fd is writable.
And it will bgp_generate_updgrp_packets to generate the
update packets no matter MRAI is set or not.
Fix: bgp_generate_updgrp_packets thread will return without sending
any update when MRAI timer is still running.
Signed-off-by: Richard Wu <wutong23@baidu.com>
---
bgpd/bgp_packet.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c
index 29c03f4014..6f1c033f2a 100644
--- a/bgpd/bgp_packet.c
+++ b/bgpd/bgp_packet.c
@@ -408,6 +408,9 @@ int bgp_generate_updgrp_packets(struct thread *thread)
if (peer->bgp->main_peers_update_hold)
return 0;
+ if (peer->t_routeadv)
+ return 0;
+
do {
s = NULL;
FOREACH_AFI_SAFI (afi, safi) {

View File

@ -1,17 +0,0 @@
--- a/lib/prefix.h 2017-12-03 22:02:41.642317377 +0200
+++ b/lib/prefix.h 2017-12-03 22:03:30.011320262 +0200
@@ -24,12 +24,12 @@
#ifdef SUNOS_5
#include <sys/ethernet.h>
-#else
+/*#else
#ifdef GNU_LINUX
#include <net/ethernet.h>
#else
#include <netinet/if_ether.h>
-#endif
+#endif*/
#endif
#include "sockunion.h"
#include "ipaddr.h"