diff options
author | Martin Mares <mj@ucw.cz> | 1999-11-30 15:04:09 +0100 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 1999-11-30 15:04:09 +0100 |
commit | 1d2664a4d4455470e0b6c7fc50d232283e39e1e0 (patch) | |
tree | af8631708680683180d89001f64baa0be5929d2c | |
parent | c9aae7f47fd7ad71b80cbc86c01a26c504ba08d0 (diff) | |
download | bird-1d2664a4d4455470e0b6c7fc50d232283e39e1e0.tar bird-1d2664a4d4455470e0b6c7fc50d232283e39e1e0.zip |
Remember protocol instance in proto_config and use that for
`show protocols <name>'.
-rw-r--r-- | TODO | 4 | ||||
-rw-r--r-- | doc/reply_codes | 1 | ||||
-rw-r--r-- | nest/cli.c | 4 | ||||
-rw-r--r-- | nest/proto.c | 59 | ||||
-rw-r--r-- | nest/protocol.h | 3 |
5 files changed, 44 insertions, 27 deletions
@@ -47,14 +47,12 @@ Commands shutdown # order system shutdown configure [<file>] debug <what> # dump debugging information to log -show protocols [<name>] - <name> # show everything you know about symbol <name> +show <name> # show everything you know about symbol <name> route [<route>] [table <name>] [filter (<name> | { <inline> })] [where <condition>] [all] status # router id, version etc. rip ??? [<name>] ospf ??? [<name>] static ??? [<name>] - interfaces [<name>] neighbors # ??? filters [<name>] (disable|enable|restart) <protocol> # or ALL? diff --git a/doc/reply_codes b/doc/reply_codes index 89c8b5a..3bafd74 100644 --- a/doc/reply_codes +++ b/doc/reply_codes @@ -23,3 +23,4 @@ Reply codes of BIRD command-line interface 9000 Command too long 9001 Parse error +9002 Invalid symbol type @@ -6,6 +6,8 @@ * Can be freely distributed and used under the terms of the GNU GPL. */ +#include <string.h> + #include "nest/bird.h" #include "nest/cli.h" #include "conf/conf.h" @@ -119,7 +121,7 @@ cli_command(struct cli *c) struct config f; int res; - f.pool = NULL; + bzero(&f, sizeof(f)); f.mem = c->parser_pool; cf_read_hook = cli_cmd_read_hook; cli_rh_pos = c->rx_buf; diff --git a/nest/proto.c b/nest/proto.c index 29f961d..0766608 100644 --- a/nest/proto.c +++ b/nest/proto.c @@ -78,7 +78,7 @@ proto_relink(struct proto *p) void * proto_new(struct proto_config *c, unsigned size) { - struct protocol *pr = c->proto; + struct protocol *pr = c->protocol; struct proto *p = mb_allocz(proto_pool, size); p->cf = c; @@ -90,6 +90,7 @@ proto_new(struct proto_config *c, unsigned size) p->table = c->table->table; p->in_filter = c->in_filter; p->out_filter = c->out_filter; + c->proto = p; return p; } @@ -136,7 +137,7 @@ proto_config_new(struct protocol *pr, unsigned size) add_tail(&new_config->protos, &c->n); c->global = new_config; - c->proto = pr; + c->protocol = pr; c->debug = pr->debug; c->name = pr->name; c->out_filter = FILTER_REJECT; @@ -174,7 +175,7 @@ protos_postconfig(struct config *c) WALK_LIST(x, c->protos) { debug(" %s", x->name); - p = x->proto; + p = x->protocol; if (p->postconfig) p->postconfig(x); } @@ -192,7 +193,7 @@ protos_commit(struct config *c) WALK_LIST(x, c->protos) { debug(" %s", x->name); - p = x->proto; + p = x->protocol; q = p->init(x); q->proto_state = PS_DOWN; q->core_state = FS_HUNGRY; @@ -458,33 +459,47 @@ proto_goal_name(struct proto *p) } static void -proto_do_show(list *l, int verbose) +proto_do_show(struct proto *p, int verbose) +{ + cli_msg(-1002, "%-8s %-8s %-8s %s%s", + p->name, + p->proto->name, + p->table->name, + proto_state_name(p), + proto_goal_name(p)); + if (verbose) + { + cli_msg(-1006, "\tPreference: %d", p->preference); + cli_msg(-1006, "\tInput filter: %s", filter_name(p->in_filter)); + cli_msg(-1006, "\tOutput filter: %s", filter_name(p->out_filter)); + } +} + +static void +proto_do_show_list(list *l, int verbose) { struct proto *p; WALK_LIST(p, *l) - { - cli_msg(-1002, "%-8s %-8s %-8s %s%s", - p->name, - p->proto->name, - p->table->name, - proto_state_name(p), - proto_goal_name(p)); - if (verbose) - { - cli_msg(-1006, "\tPreference: %d", p->preference); - cli_msg(-1006, "\tInput filter: %s", filter_name(p->in_filter)); - cli_msg(-1006, "\tOutput filter: %s", filter_name(p->out_filter)); - } - } + proto_do_show(p, verbose); } void proto_show(struct symbol *s, int verbose) { + if (s && s->class != SYM_PROTO) + { + cli_msg(9002, "%s is not a protocol", s->name); + return; + } cli_msg(-2002, "name proto table state"); - proto_do_show(&proto_list, verbose); - proto_do_show(&flush_proto_list, verbose); - proto_do_show(&inactive_proto_list, verbose); + if (s) + proto_do_show(((struct proto_config *)s->def)->proto, verbose); + else + { + proto_do_show_list(&proto_list, verbose); + proto_do_show_list(&flush_proto_list, verbose); + proto_do_show_list(&inactive_proto_list, verbose); + } cli_msg(0, ""); } diff --git a/nest/protocol.h b/nest/protocol.h index 2a21c11..8958d07 100644 --- a/nest/protocol.h +++ b/nest/protocol.h @@ -74,7 +74,8 @@ extern struct protocol proto_pipe; struct proto_config { node n; struct config *global; /* Global configuration data */ - struct protocol *proto; /* Protocol */ + struct protocol *protocol; /* Protocol */ + struct proto *proto; /* Instance we've created */ char *name; unsigned debug, preference, disabled; /* Generic parameters */ struct rtable_config *table; /* Table we're attached to */ |