From ae97b946e99bef043613d210489a926fe4807ec1 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Thu, 25 Nov 1999 15:35:30 +0000 Subject: [PATCH] Added few basic commands: show status, show interfaces [summary], show protocols (incomplete). --- doc/reply_codes | 9 ++++++ nest/config.Y | 25 +++++++++++++++- nest/iface.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++ nest/iface.h | 4 ++- nest/proto.c | 9 ++++++ nest/protocol.h | 2 ++ 6 files changed, 124 insertions(+), 2 deletions(-) diff --git a/doc/reply_codes b/doc/reply_codes index 6f991d9d..9a6cbe3f 100644 --- a/doc/reply_codes +++ b/doc/reply_codes @@ -11,6 +11,15 @@ Reply codes of BIRD command-line interface 0000 OK 0001 Welcome +1002 Protocol list + +2000 BIRD version +2001 Interface list +2002 Protocol list +2003 Interface address +2004 Interface flags +2005 Interface summary + 8000 Reply too long 9000 Command too long diff --git a/nest/config.Y b/nest/config.Y index 4000b6dc..7d3cbd72 100644 --- a/nest/config.Y +++ b/nest/config.Y @@ -27,6 +27,7 @@ CF_ENUM(T_ENUM_RTS, RTS_, DUMMY, STATIC, INHERIT, DEVICE, STATIC_DEVICE, REDIREC %type imexport %type rtable %type

password_list password_begin +%type optsym CF_GRAMMAR @@ -187,9 +188,25 @@ password_list: /* Core commands */ +CF_CLI_HELP(SHOW,,[[Show status information]]) + +CF_CLI(SHOW STATUS,,, [[Show router status]]) { + cli_msg(2000, "BIRD " BIRD_VERSION); + /* FIXME: Should include uptime, shutdown flag et cetera */ +} ; + +CF_CLI(SHOW PROTOCOLS, optsym, [], [[Show routing protocols]]) +{ proto_show($3); } ; + +CF_CLI(SHOW INTERFACES,,, [[Show network interfaces]]) +{ if_show(); } ; + +CF_CLI(SHOW INTERFACES SUMMARY,,, [[Show summary of network interfaces]]) +{ if_show_summary(); } ; + /* FIXME: These are examples. Remove them soon. */ CF_CLI_HELP(TEST, , [[Tests different subsystems]]) -CF_CLI(TEST LEDS, NUM, , [[Flashes each LED times]]) { cli_msg(0, "%d", $3); } ; +CF_CLI(TEST LEDS, NUM, , [[Flash each LED times]]) { cli_msg(0, "%d", $3); } ; CF_CLI(TEST MEMORY,,, [[Replace all useful information by testing patterns]]) { cli_msg(0, "DONE"); } ; CF_CLI(TEST LONG,,, [[Test long replies]]) { static void test_command(struct cli *); @@ -198,8 +215,14 @@ CF_CLI(TEST LONG,,, [[Test long replies]]) { cli_msg(-2, "Start"); } ; +optsym: + SYM + | /* empty */ { $$ = NULL; } + ; + CF_CODE +/* FIXME: Test only, remove */ static void test_command(struct cli *c) { int i = (int) c->rover; diff --git a/nest/iface.c b/nest/iface.c index debec45d..4b024e10 100644 --- a/nest/iface.c +++ b/nest/iface.c @@ -11,6 +11,7 @@ #include "nest/bird.h" #include "nest/iface.h" #include "nest/protocol.h" +#include "nest/cli.h" #include "lib/resource.h" #include "lib/string.h" #include "conf/conf.h" @@ -626,3 +627,79 @@ iface_patts_equal(list *a, list *b, int (*comp)(struct iface_patt *, struct ifac } return (!x->n.next && !y->n.next); } + +/* + * CLI commands. + */ + +static void +if_show_addr(struct ifa *a) +{ + byte broad[STD_ADDRESS_P_LENGTH + 16]; + byte opp[STD_ADDRESS_P_LENGTH + 16]; + + if (ipa_nonzero(a->brd)) + bsprintf(broad, ", broadcast %I", a->brd); + else + broad[0] = 0; + if (ipa_nonzero(a->opposite)) + bsprintf(opp, ", opposite %I", a->opposite); + else + opp[0] = 0; + cli_msg(-2003, "\t%I/%d (%s%s%s, scope %s)", + a->ip, a->pxlen, + (a->flags & IA_PRIMARY) ? "Primary" : (a->flags & IA_SECONDARY) ? "Secondary" : "???", + broad, opp, + ip_scope_text(a->scope)); +} + +void +if_show(void) +{ + struct iface *i; + struct ifa *a; + char *type; + + WALK_LIST(i, iface_list) + { + cli_msg(-2001, "%s %s (index=%d)", i->name, (i->flags & IF_UP) ? "up" : "DOWN", i->index); + if (i->flags & IF_UNNUMBERED) + type = "UnNum-PtP"; + else if (!(i->flags & IF_MULTIACCESS)) + type = "PtP"; + else + type = "MultiAccess"; + cli_msg(-2004, "\t%s%s%s Admin%s Link%s%s%s MTU=%d", + type, + (i->flags & IF_BROADCAST) ? " Broadcast" : "", + (i->flags & IF_MULTICAST) ? " Multicast" : "", + (i->flags & IF_ADMIN_DOWN) ? "Down" : "Up", + (i->flags & IF_LINK_UP) ? "Up" : "Down", + (i->flags & IF_LOOPBACK) ? " Loopback" : "", + (i->flags & IF_IGNORE) ? " Ignored" : "", + i->mtu); + if (i->addr) + if_show_addr(i->addr); + WALK_LIST(a, i->addrs) + if (a != i->addr) + if_show_addr(a); + } + cli_msg(0, ""); +} + +void +if_show_summary(void) +{ + struct iface *i; + byte addr[STD_ADDRESS_P_LENGTH + 16]; + + WALK_LIST(i, iface_list) + { + if (i->addr) + bsprintf(addr, "%I/%d", i->addr->ip, i->addr->pxlen); + else + addr[0] = 0; + cli_msg(-2005, "%s\t%s\t%s", i->name, (i->flags & IF_UP) ? "up" : "DOWN", addr); + } + cli_msg(0, ""); +} diff --git a/nest/iface.h b/nest/iface.h index 9f3a2395..bee9caf6 100644 --- a/nest/iface.h +++ b/nest/iface.h @@ -43,7 +43,7 @@ struct iface { #define IF_UNNUMBERED 4 #define IF_BROADCAST 8 #define IF_MULTICAST 0x10 -#define IF_TUNNEL 0x20 +#define IF_TUNNEL 0x20 /* FIXME: Remove? */ #define IF_ADMIN_DOWN 0x40 #define IF_LOOPBACK 0x80 #define IF_IGNORE 0x100 /* Not to be used by routing protocols (loopbacks etc.) */ @@ -69,6 +69,8 @@ void if_init(void); void if_dump(struct iface *); void if_dump_all(void); void ifa_dump(struct ifa *); +void if_show(void); +void if_show_summary(void); struct iface *if_update(struct iface *); struct ifa *ifa_update(struct ifa *); void ifa_delete(struct ifa *); diff --git a/nest/proto.c b/nest/proto.c index 3430176f..32e0b3be 100644 --- a/nest/proto.c +++ b/nest/proto.c @@ -18,6 +18,7 @@ #include "conf/conf.h" #include "nest/route.h" #include "nest/iface.h" +#include "nest/cli.h" #include "filter/filter.h" static pool *proto_pool; @@ -420,3 +421,11 @@ proto_flush_all(void *unused) } return 0; } + +void +proto_show(struct symbol *s) +{ + cli_msg(-1002, ""); + cli_msg(-2002, ""); + cli_msg(0, ""); +} diff --git a/nest/protocol.h b/nest/protocol.h index a2c0eb93..d9b5b17f 100644 --- a/nest/protocol.h +++ b/nest/protocol.h @@ -23,6 +23,7 @@ struct config; struct proto; struct event; struct ea_list; +struct symbol; /* * Routing Protocol @@ -143,6 +144,7 @@ struct proto { void proto_build(struct proto_config *); void *proto_new(struct proto_config *, unsigned size); void *proto_config_new(struct protocol *, unsigned size); +void proto_show(struct symbol *); extern list proto_list;