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 */