Hello,

I provide a patch for bird version 2, which is based on the patch for version 1 and displays imported, exported, preferred and filtered prefixes (also for "show protocols"). I use this output also for parsing. The output formatting can be adjusted individually. I'm not a programmer, so maybe it could be done better.

Nice holidays, Milan


Dne 25. 02. 21 v 9:09 Cybertinus napsal(a):
Hello Roman,

1. Bird 1.3.x is very old. Bird 1.6.8 and 2.0.7 are the current versions. If you still run on Bird 1.3 I highly recommend that you upgrade to at least 1.6.x

2. There is such a command already: `show protocols`. It doesn't show you how many prefixes you received from it, but is you ask for more detail it will: `show protocols all`. If you have a lot of peers, this will show you way to much information, so you can also request this info for 1 specific peer: `show protocols all <name_of_the_peer_in_the_bird_config>`. I don't know if these commands work on 1.3 though, but I think they would. I never used 1.3, I started using Bird when 1.6.4 was the latest and greatest and Bird 2 didn't exist yet.

Or is there some more you want to see from the `sh bgp sum` command that isn't shown by `show protocols`, even with more details?

Kind regards,
Cybertinus

On 2021-02-25 07:37, Roman Bulakh wrote:
Hi,

we use BIRD in our environment, and it would be very nice to have some
command like `show bgp summary` in juniper. This command show
information about peer IP, peer AS, last update, prefixes
received/best/exported and last state.


Example:
bird> show bgp summary
Peer                    AS Last state change   Prfx rcvd/best/export
State
X.X.X.X           asXXXX 2021-01-27          6786/6785/109000
Established
Y.Y.Y.Y        asYYYY 2020-12-16          0/0/0
Passive BGP Error: Hold timer expired

The are patch created for BIRD 1.3.4 and 1.3.6, but it would be good to
have this in upstream software, without rebuilding and patching.

as I understand it, no functionality should be affected by these
changes, this is only a visual update for cli.

Old patches describes at pages:
https://marc.info/?l=bird-users&m=132155489919052&w=2
http://trubka.network.cz/pipermail/bird-users/attachments/20120228/a1499be7/attachment-0001.diff
https://bird-users.network.narkive.com/Px6EH3yl/bird-1-3-6-show-bgp-summary-command
--- bird-2.0.11/nest/proto.c	2022-12-12 00:23:42.000000000 +0100
+++ bird-2.0.11-upraveny/nest/proto.c	2022-12-20 10:23:58.848461673 +0100
@@ -2049,22 +2049,31 @@
 proto_cmd_show(struct proto *p, uintptr_t verbose, int cnt)
 {
   byte buf[256], tbuf[TM_DATETIME_BUFFER_SIZE];
+  char rs[20];
 
   /* First protocol - show header */
   if (!cnt)
-    cli_msg(-2002, "%-10s %-10s %-10s %-6s %-12s  %s",
-	    "Name", "Proto", "Table", "State", "Since", "Info");
+    cli_msg(-2002, "%-30s %-10s %-10s %-6s %-20s %-21s  %s",
+	    "Name", "Proto", "Table", "State", "Since", "Prfx imp/pref/exp/fil", "Info");
 
   buf[0] = 0;
   if (p->proto->get_status)
     p->proto->get_status(p, buf);
   tm_format_time(tbuf, &config->tf_proto, p->last_state_change);
-  cli_msg(-1002, "%-10s %-10s %-10s %-6s %-12s  %s",
+  struct channel *c;
+  bsnprintf(rs, sizeof(rs), "%u/%u/%u/%u", 0, 0, 0, 0);
+  WALK_LIST(c, p->channels) {
+   struct proto_stats *s = &c->stats;
+   if (c->channel_state == CS_UP)
+    bsnprintf(rs, sizeof(rs), "%u/%u/%u/%u", s->imp_routes, s->pref_routes, s->exp_routes, s->filt_routes);
+  }
+  cli_msg(-1002, "%-30s %-10s %-10s %-6s %-20s %-21s  %s",
 	  p->name,
 	  p->proto->name,
 	  p->main_channel ? p->main_channel->table->name : "---",
 	  proto_state_name(p),
 	  tbuf,
+	  rs,
 	  buf);
 
   if (verbose)
--- bird-2.0.11/proto/bfd/bfd.c	2022-09-08 09:20:39.000000000 +0200
+++ bird-2.0.11-upraveny/proto/bfd/bfd.c	2022-12-12 09:11:30.939234856 +0100
@@ -1157,7 +1157,7 @@
   }
 
   cli_msg(-1020, "%s:", p->p.name);
-  cli_msg(-1020, "%-25s %-10s %-10s %-12s  %8s %8s",
+  cli_msg(-1020, "%-25s %-10s %-10s %-19s  %8s %8s",
 	  "IP address", "Interface", "State", "Since", "Interval", "Timeout");
 
 
--- bird-2.0.11/proto/bgp/bgp.c	2022-12-12 00:23:42.000000000 +0100
+++ bird-2.0.11-upraveny/proto/bgp/bgp.c	2022-12-20 10:24:42.038459672 +0100
@@ -136,10 +136,80 @@
 static void bgp_setup_sk(struct bgp_conn *conn, sock *s);
 static void bgp_send_open(struct bgp_conn *conn);
 static void bgp_update_bfd(struct bgp_proto *p, const struct bfd_options *bfd);
+static void bgp_sh_proto_summary(struct proto *p);
 
 static int bgp_incoming_connection(sock *sk, uint dummy UNUSED);
 static void bgp_listen_sock_err(sock *sk UNUSED, int err);
 
+void
+bgp_sh_summary(struct symbol *sym)
+{
+  struct proto_config *q;
+  struct proto *p;
+  if (sym)
+    {
+      cli_msg(-2002, "%-30s  %-22s  %10s  %-19s  %-18s %s", "Proto", "Peer", "AS", "Last state change", "Prfx imp/pref/exp/fil", "State/Last error" );
+      bgp_sh_proto_summary(proto_get_named(sym, &proto_bgp));
+    }
+  else
+    {
+      p = NULL;
+      WALK_LIST(q, config->protos)
+        {
+         if (q->protocol == &proto_bgp && q->proto)
+                   {
+              if (p == NULL)
+                {
+                  cli_msg(-2002, "%-30s  %-22s  %10s  %-19s  %-18s %s", "Proto", "Peer", "AS", "Last state change", "Prfx imp/pref/exp/fil", "State/Last error" );
+                }
+              p = q->proto;
+              bgp_sh_proto_summary(p);
+            }
+        }
+
+      if (p == NULL)
+        cli_msg(-1006, "No protocols match");
+    }
+  cli_msg(0, "");
+}
+
+static void
+bgp_sh_proto_summary(struct proto *p)
+{
+  struct bgp_proto *bp;
+  byte buf[256], tbuf[TM_DATETIME_BUFFER_SIZE];
+  char rs[20];
+  char ps[256];
+
+  /* Get protocol data */
+  buf[0] = 0;
+  if (p->proto->get_status)
+    p->proto->get_status(p, buf);
+  tm_format_time(tbuf, &config->tf_proto, p->last_state_change);
+  struct channel *c;
+  bsnprintf(rs, sizeof(rs), "%u/%u/%u/%u", 0, 0, 0, 0);
+  WALK_LIST(c, p->channels) {
+   struct proto_stats *s = &c->stats;
+   if (c->channel_state == CS_UP)
+    bsnprintf(rs, sizeof(rs), "%u/%u/%u/%u", s->imp_routes, s->pref_routes, s->exp_routes, s->filt_routes);
+  }
+
+  p->proto->get_status(p, ps);
+
+  /* Get BGP protocol from protocol */
+  bp = (struct bgp_proto *) p;
+
+  /* Display summary */
+//  cli_msg(-1006, "%-30s  %I\n%12u  %-19s  %-20s  %s",
+  cli_msg(-1006, "%-30s  %-22I  %10u  %-19s  %-20s  %s",
+               p->name,
+               bp->cf->remote_ip,
+               bp->remote_as,
+               tbuf,
+               rs,
+               ps);
+}
+
 /**
  * bgp_open - open a BGP instance
  * @p: BGP instance
--- bird-2.0.11/proto/bgp/bgp.h	2022-12-12 00:23:42.000000000 +0100
+++ bird-2.0.11-upraveny/proto/bgp/bgp.h	2022-12-15 14:41:14.377759705 +0100
@@ -54,6 +54,7 @@
 #define BGP_AF_FLOW4		BGP_AF( BGP_AFI_IPV4, BGP_SAFI_FLOW )
 #define BGP_AF_FLOW6		BGP_AF( BGP_AFI_IPV6, BGP_SAFI_FLOW )
 
+void bgp_sh_summary(struct symbol *sym);
 
 struct bgp_write_state;
 struct bgp_parse_state;
--- bird-2.0.11/proto/bgp/config.Y	2022-12-12 00:23:42.000000000 +0100
+++ bird-2.0.11-upraveny/proto/bgp/config.Y	2022-12-15 14:22:06.967812861 +0100
@@ -365,6 +365,11 @@
 
 CF_ENUM(T_ENUM_BGP_ORIGIN, ORIGIN_, IGP, EGP, INCOMPLETE)
 
+CF_CLI_HELP(SHOW BGP, , [[Show BGP protocol information]])
+
+CF_CLI(SHOW BGP SUMMARY, optproto, [<name>], [[Show BGP peers summary]])
+        { bgp_sh_summary($4); };
+
 CF_CODE
 
 CF_END

Reply via email to