diff options
Diffstat (limited to 'nest')
-rw-r--r-- | nest/cli.c | 4 | ||||
-rw-r--r-- | nest/proto.c | 59 | ||||
-rw-r--r-- | nest/protocol.h | 3 |
3 files changed, 42 insertions, 24 deletions
@@ -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 */ |