summaryrefslogtreecommitdiffstats
path: root/nest
diff options
context:
space:
mode:
Diffstat (limited to 'nest')
-rw-r--r--nest/cli.c4
-rw-r--r--nest/proto.c59
-rw-r--r--nest/protocol.h3
3 files changed, 42 insertions, 24 deletions
diff --git a/nest/cli.c b/nest/cli.c
index ca4cc82..88fb78d 100644
--- a/nest/cli.c
+++ b/nest/cli.c
@@ -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 */