BIRD show bgp summary for cli

Alexander Shikov a.shikov at dtel-ix.net
Wed Jun 14 20:20:33 CEST 2023


Hello!

Please find attached 'show bgp summary' patch for bird 2.13.
Code has been simplified and placed in more correct place.
Route stats are shown for each channel.

Example output:
bird> show bgp summary
Peer                            AS          Last state change    State/Last error
    Channel                                                       Prefixes rcvd/best
193.25.180.4                    43380       20:39:40.244         Established
    ipv4                                                          0/0
    flow4                                                         0/0
193.25.180.255                  31210       20:39:16.686         Established
    ipv4                                                          1/1
193.25.181.0                    31210       20:39:08.221         Active        Socket: Connection closed
193.25.180.17                   25372       20:39:42.584         Established
    ipv4                                                          1/1
    flow4                                                         1/1
193.25.180.194                  48641       20:39:08.221         Passive
2001:7f8:63::1:28               12963       20:39:08.221         Passive
2001:7f8:63::1:2a               12963       20:39:08.221         Passive



On Thu, Dec 22, 2022 at 10:15:47 +0100, Milan Strakoš via Bird-users wrote:
> 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


-- 
Alexander Shikov
Technical Staff, Digital Telecom IX
Tel.: +380 44 201 14 07
Mob.: +380 50 410 30 57
http://dtel-ix.net/
-------------- next part --------------
diff -u --recursive proto/bgp/bgp.c.orig proto/bgp/bgp.c
--- proto/bgp/bgp.c.orig	2023-04-23 17:22:52.000000000 +0300
+++ proto/bgp/bgp.c	2023-06-14 21:09:39.658788000 +0300
@@ -2387,6 +2387,50 @@
   return "?";
 }
 
+void
+bgp_sh_summary(struct symbol *sym)
+{
+  struct proto *P = NULL;
+  struct bgp_proto *bp;
+  byte tbuf[TM_DATETIME_BUFFER_SIZE];
+  char rs[20];
+  char ps[256];
+  struct channel *c;
+
+  /* Check if there is any BGP protocol */
+  if (proto_iterate_named(sym, &proto_bgp, P)) 
+  {
+    cli_msg(1026, "%-30s  %-10s  %-19s  %s\n     %-61s %s", "Peer", "AS", "Last state change", "State/Last error", "Channel", "Prefixes rcvd/best" );
+    PROTO_WALK_CMD(sym, &proto_bgp, p) 
+    {
+      /* Get protocol data */
+      if (p->proto->get_status)
+        p->proto->get_status(p, ps);
+
+      tm_format_time(tbuf, &config->tf_proto, p->last_state_change);
+
+      /* Print information about peer state */
+      bp = (struct bgp_proto *) p;
+      cli_msg(1026, "%-30I  %-10u  %-19s  %s",
+               bp->cf->remote_ip,
+               bp->remote_as,
+               tbuf,
+               ps);
+
+       /* Get information about channels */
+       WALK_LIST(c, p->channels)
+       {
+         if (c->channel_state == CS_UP) 
+         {
+           bsnprintf(rs, sizeof(rs), "%u/%u", c->stats.imp_routes, c->stats.pref_routes);
+           cli_msg(1026, "    %-61s %s", c->name, rs);
+         }
+       }
+    }
+  }
+  cli_msg(0, "");
+}
+
 static void
 bgp_show_capabilities(struct bgp_proto *p UNUSED, struct bgp_caps *caps)
 {
diff -u --recursive proto/bgp/bgp.h.orig proto/bgp/bgp.h
--- proto/bgp/bgp.h.orig	2023-04-23 17:22:52.000000000 +0300
+++ proto/bgp/bgp.h	2023-06-14 21:09:39.658677000 +0300
@@ -549,6 +549,7 @@
 void bgp_store_error(struct bgp_proto *p, struct bgp_conn *c, u8 class, u32 code);
 void bgp_stop(struct bgp_proto *p, int subcode, byte *data, uint len);
 const char *bgp_format_role_name(u8 role);
+void bgp_sh_summary(struct symbol *sym);
 
 void bgp_fix_attr_flags(ea_list *attrs);
 
diff -u --recursive proto/bgp/config.Y.orig proto/bgp/config.Y
--- proto/bgp/config.Y.orig	2023-04-23 17:22:52.000000000 +0300
+++ proto/bgp/config.Y	2023-06-14 21:09:39.658604000 +0300
@@ -365,7 +365,10 @@
 dynamic_attr: BGP_OTC
 	{ $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(PROTOCOL_BGP, BA_ONLY_TO_CUSTOMER)); } ;
 
-
+CF_CLI_HELP(SHOW BGP, ... , [[Show information about BGP protocol]])
+CF_CLI_HELP(SHOW BGP SUMMARY, [<name>], [[Show BGP summary]])
+CF_CLI(SHOW BGP SUMMARY, optproto, [<name>], [[Show BGP summary]])
+{ bgp_sh_summary($4); }; 
 
 CF_ENUM(T_ENUM_BGP_ORIGIN, ORIGIN_, IGP, EGP, INCOMPLETE)
 


More information about the Bird-users mailing list