diff --git a/nest/config.Y b/nest/config.Y
index 39110760..9fce23a4 100644
--- a/nest/config.Y
+++ b/nest/config.Y
@@ -18,8 +18,8 @@ static struct iface_patt *this_ipatt;
CF_DECLS
CF_KEYWORDS(ROUTER, ID, PROTOCOL, PREFERENCE, DISABLED, DEBUG, ALL, OFF, DIRECT)
-CF_KEYWORDS(INTERFACE, IMPORT, EXPORT, FILTER, NONE, TABLE)
-CF_KEYWORDS(PASSWORD, FROM, PASSIVE, TO, ID)
+CF_KEYWORDS(INTERFACE, IMPORT, EXPORT, FILTER, NONE, TABLE, STATES, ROUTES, FILTERS)
+CF_KEYWORDS(PASSWORD, FROM, PASSIVE, TO, ID, EVENTS, PACKETS)
CF_ENUM(T_ENUM_RTS, RTS_, DUMMY, STATIC, INHERIT, DEVICE, STATIC_DEVICE, REDIRECT,
RIP, RIP_EXT, OSPF, OSPF_EXT, OSPF_IA, OSPF_BOUNDARY, BGP, PIPE)
@@ -30,7 +30,7 @@ CF_ENUM(T_ENUM_RTS, RTS_, DUMMY, STATIC, INHERIT, DEVICE, STATIC_DEVICE, REDIREC
%type
password_list password_begin
%type optsym
%type r_args
-%type echo_mask echo_size
+%type echo_mask echo_size debug_mask debug_list debug_flag
%type proto_patt
CF_GRAMMAR
@@ -91,9 +91,7 @@ proto_item:
this_proto->preference = $2;
}
| DISABLED { this_proto->disabled = 1; }
- | DEBUG expr { this_proto->debug = $2; }
- | DEBUG ALL { this_proto->debug = ~0; }
- | DEBUG OFF { this_proto->debug = 0; }
+ | DEBUG debug_mask { this_proto->debug = $2; }
| IMPORT imexport { this_proto->in_filter = $2; }
| EXPORT imexport { this_proto->out_filter = $2; }
| TABLE rtable { this_proto->table = $2; }
@@ -156,6 +154,27 @@ dev_iface_list:
| dev_iface_list ',' dev_iface_entry
;
+/* Debug flags */
+
+debug_mask:
+ ALL { $$ = ~0; }
+ | OFF { $$ = 0; }
+ | '{' debug_list '}' { $$ = $2; }
+ ;
+
+debug_list:
+ debug_flag
+ | debug_list ',' debug_flag { $$ = $1 | $3; }
+ ;
+
+debug_flag:
+ STATES { $$ = D_STATES; }
+ | ROUTES { $$ = D_ROUTES; }
+ | FILTERS { $$ = D_FILTERS; }
+ | EVENTS { $$ = D_EVENTS; }
+ | PACKETS { $$ = D_PACKETS; }
+ ;
+
/* Password lists */
password_begin:
@@ -251,20 +270,20 @@ r_args:
CF_CLI(SHOW SYMBOLS, optsym, [], [[Show all known symbolic names]])
{ cmd_show_symbols($3); } ;
-CF_CLI_HELP(DEBUG, ..., [[Show debugging information]])
-CF_CLI(DEBUG RESOURCES,,, [[Show all allocated resource]])
+CF_CLI_HELP(DUMP, ..., [[Dump debugging information]])
+CF_CLI(DUMP RESOURCES,,, [[Dump all allocated resource]])
{ rdump(&root_pool); cli_msg(0, ""); } ;
-CF_CLI(DEBUG SOCKETS,,, [[Show open sockets]])
+CF_CLI(DUMP SOCKETS,,, [[Dump open sockets]])
{ sk_dump_all(); cli_msg(0, ""); } ;
-CF_CLI(DEBUG INTERFACES,,, [[Show interface information]])
+CF_CLI(DUMP INTERFACES,,, [[Dump interface information]])
{ if_dump_all(); cli_msg(0, ""); } ;
-CF_CLI(DEBUG NEIGHBORS,,, [[Show neighbor cache]])
+CF_CLI(DUMP NEIGHBORS,,, [[Dump neighbor cache]])
{ neigh_dump_all(); cli_msg(0, ""); } ;
-CF_CLI(DEBUG ATTRIBUTES,,, [[Show attribute cache]])
+CF_CLI(DUMP ATTRIBUTES,,, [[Dump attribute cache]])
{ rta_dump_all(); cli_msg(0, ""); } ;
-CF_CLI(DEBUG ROUTES,,, [[Show routing table]])
+CF_CLI(DUMP ROUTES,,, [[Dump routing table]])
{ rt_dump_all(); cli_msg(0, ""); } ;
-CF_CLI(DEBUG PROTOCOLS,,, [[Show protocol information]])
+CF_CLI(DUMP PROTOCOLS,,, [[Dump protocol information]])
{ protos_dump_all(); cli_msg(0, ""); } ;
CF_CLI(ECHO, echo_mask echo_size, [all | off | ] [], [[Configure echoing of log messages]]) {
@@ -293,6 +312,10 @@ CF_CLI(ENABLE, proto_patt, | | all, [[Enable protocol]])
CF_CLI(RESTART, proto_patt, | | all, [[Restart protocol]])
{ proto_xxable($2, 2); } ;
+CF_CLI_HELP(DEBUG, ..., [[Control protocol debugging]])
+CF_CLI(DEBUG, proto_patt debug_mask, ( | | all) (all | off | { states | routes | filters | events | packets }), [[Control protocol debugging]])
+{ proto_debug($2, $3); }
+
proto_patt:
SYM { $$ = $1->name; }
| ALL { $$ = "*"; }
diff --git a/nest/proto.c b/nest/proto.c
index 68975add..b2f296b6 100644
--- a/nest/proto.c
+++ b/nest/proto.c
@@ -139,7 +139,6 @@ proto_config_new(struct protocol *pr, unsigned size)
add_tail(&new_config->protos, &c->n);
c->global = new_config;
c->protocol = pr;
- c->debug = pr->debug;
c->name = pr->name;
c->out_filter = FILTER_REJECT;
c->table = c->global->master_rtc;
@@ -603,3 +602,20 @@ proto_xxable(char *pattern, int xx)
else
cli_msg(0, "");
}
+
+void
+proto_debug(char *pattern, unsigned int mask)
+{
+ int cnt = 0;
+ WALK_PROTO_LIST(p)
+ if (patmatch(pattern, p->name))
+ {
+ cnt++;
+ p->debug = mask;
+ }
+ WALK_PROTO_LIST_END;
+ if (!cnt)
+ cli_msg(8003, "No protocols match");
+ else
+ cli_msg(0, "");
+}
diff --git a/nest/protocol.h b/nest/protocol.h
index 0dacccbd..f4ce3843 100644
--- a/nest/protocol.h
+++ b/nest/protocol.h
@@ -34,7 +34,6 @@ struct protocol {
node n;
char *name;
char *template; /* Template for automatic generation of names */
- unsigned debug; /* Default debugging flags */
int name_counter; /* Counter for automatic name generation */
void (*preconfig)(struct protocol *, struct config *); /* Just before configuring */
@@ -156,6 +155,7 @@ void *proto_config_new(struct protocol *, unsigned size);
void proto_show(struct symbol *, int);
struct proto *proto_get_named(struct symbol *, struct protocol *);
void proto_xxable(char *, int);
+void proto_debug(char *, unsigned int);
extern list active_proto_list;
@@ -234,6 +234,16 @@ void proto_notify_state(struct proto *p, unsigned state);
#define FS_HAPPY 2
#define FS_FLUSHING 3
+/*
+ * Debugging flags
+ */
+
+#define D_STATES 1 /* [core] State transitions */
+#define D_ROUTES 2 /* [core] Routes passed by the filters */
+#define D_FILTERS 4 /* [core] Filtering of routes */
+#define D_EVENTS 8 /* Protocol events */
+#define D_PACKETS 16 /* Packets sent/received */
+
/*
* Known unique protocol instances as referenced by config routines
*/