summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2019-04-19 08:52:01 -0400
committerDonald Sharp <sharpd@cumulusnetworks.com>2020-03-10 09:59:56 -0400
commit2a0e69ae3c803dbc3640e52798779cde60f4def0 (patch)
tree4f50d2c356f85f77cbd1b5d1f05236ffa67b61db
parent2bdced5ab3f1f9726b5bbf7cf45b4b0b86a969c3 (diff)
bgpd: Add 'show bgp listeners' command for diagnostics
Add a command to display listen sockets and the vrf that they are associated with. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
-rw-r--r--bgpd/bgp_network.c21
-rw-r--r--bgpd/bgp_network.h1
-rw-r--r--bgpd/bgp_route.c14
3 files changed, 36 insertions, 0 deletions
diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c
index 8759a88444..037aeec288 100644
--- a/bgpd/bgp_network.c
+++ b/bgpd/bgp_network.c
@@ -57,8 +57,26 @@ struct bgp_listener {
union sockunion su;
struct thread *thread;
struct bgp *bgp;
+ char *name;
};
+void bgp_dump_listener_info(struct vty *vty)
+{
+ struct listnode *node;
+ struct bgp_listener *listener;
+
+ vty_out(vty, "Name fd Address\n");
+ vty_out(vty, "---------------------------\n");
+ for (ALL_LIST_ELEMENTS_RO(bm->listen_sockets, node, listener)) {
+ char buf[SU_ADDRSTRLEN];
+
+ vty_out(vty, "%-16s %d %s\n",
+ listener->name ? listener->name : VRF_DEFAULT_NAME,
+ listener->fd,
+ sockunion2str(&listener->su, buf, sizeof(buf)));
+ }
+}
+
/*
* Set MD5 key for the socket, for the given IPv4 peer address.
* If the password is NULL or zero-length, the option will be disabled.
@@ -762,6 +780,7 @@ static int bgp_listener(int sock, struct sockaddr *sa, socklen_t salen,
listener = XCALLOC(MTYPE_BGP_LISTENER, sizeof(*listener));
listener->fd = sock;
+ listener->name = XSTRDUP(MTYPE_BGP_LISTENER, bgp->name);
/* this socket needs a change of ns. record bgp back pointer */
if (bgp->vrf_id != VRF_DEFAULT && vrf_is_backend_netns())
@@ -871,6 +890,7 @@ void bgp_close_vrf_socket(struct bgp *bgp)
thread_cancel(listener->thread);
close(listener->fd);
listnode_delete(bm->listen_sockets, listener);
+ XFREE(MTYPE_BGP_LISTENER, listener->name);
XFREE(MTYPE_BGP_LISTENER, listener);
}
}
@@ -892,6 +912,7 @@ void bgp_close(void)
thread_cancel(listener->thread);
close(listener->fd);
listnode_delete(bm->listen_sockets, listener);
+ XFREE(MTYPE_BGP_LISTENER, listener->name);
XFREE(MTYPE_BGP_LISTENER, listener);
}
}
diff --git a/bgpd/bgp_network.h b/bgpd/bgp_network.h
index 59b18f9376..018efbc08e 100644
--- a/bgpd/bgp_network.h
+++ b/bgpd/bgp_network.h
@@ -23,6 +23,7 @@
#define BGP_SOCKET_SNDBUF_SIZE 65536
+extern void bgp_dump_listener_info(struct vty *vty);
extern int bgp_socket(struct bgp *bgp, unsigned short port,
const char *address);
extern void bgp_close_vrf_socket(struct bgp *bgp);
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index bcd87eb01b..c2c034d164 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -69,6 +69,7 @@
#include "bgpd/bgp_label.h"
#include "bgpd/bgp_addpath.h"
#include "bgpd/bgp_mac.h"
+#include "bgpd/bgp_network.h"
#if ENABLE_BGP_VNC
#include "bgpd/rfapi/rfapi_backend.h"
@@ -12766,6 +12767,18 @@ static void show_bgp_peerhash_entry(struct hash_bucket *bucket, void *arg)
sockunion2str(&peer->su, buf, sizeof(buf)));
}
+DEFUN (show_bgp_listeners,
+ show_bgp_listeners_cmd,
+ "show bgp listeners",
+ SHOW_STR
+ BGP_STR
+ "Display Listen Sockets and who created them\n")
+{
+ bgp_dump_listener_info(vty);
+
+ return CMD_SUCCESS;
+}
+
DEFUN (show_bgp_peerhash,
show_bgp_peerhash_cmd,
"show bgp peerhash",
@@ -13155,6 +13168,7 @@ void bgp_route_init(void)
/* show bgp ipv4 flowspec detailed */
install_element(VIEW_NODE, &show_ip_bgp_flowspec_routes_detailed_cmd);
+ install_element(VIEW_NODE, &show_bgp_listeners_cmd);
install_element(VIEW_NODE, &show_bgp_peerhash_cmd);
}