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/
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)