'show route protocol <p>' added to CLI.

This commit is contained in:
Ondrej Filip 2009-05-11 02:01:11 +02:00
parent ef9c9ab9b6
commit 4d176e1450
4 changed files with 16 additions and 2 deletions

View file

@ -351,7 +351,7 @@ BIRD and <file/birdc/ is stable (see the programmer's documentation).
<tag>show symbols</tag> <tag>show symbols</tag>
Show the list of symbols defined in the configuration (names of protocols, routing tables etc.). Show the list of symbols defined in the configuration (names of protocols, routing tables etc.).
<tag>show route [[for] <m/prefix/|<m/IP/] [table <m/sym/] [filter <m/f/|where <m/c/] [(import|preimport) <m/p/] [<m/options/]</tag> <tag>show route [[for] <m/prefix/|<m/IP/] [table <m/sym/] [filter <m/f/|where <m/c/] [(import|preimport) <m/p/] [protocol <m/p/] [<m/options/]</tag>
Show contents of a routing table (by default of the main one), Show contents of a routing table (by default of the main one),
that is routes, their metrics and (in case the <cf/all/ switch is given) that is routes, their metrics and (in case the <cf/all/ switch is given)
all their attributes. all their attributes.
@ -370,6 +370,9 @@ BIRD and <file/birdc/ is stable (see the programmer's documentation).
that are imported to the specified protocol. With <cf/preimport/, the that are imported to the specified protocol. With <cf/preimport/, the
import filter of the protocol is skipped. import filter of the protocol is skipped.
<p>You can also select just routes added by a specific protocol.
<cf>protocol <m/p/</cf>.
<p>The <cf/stats/ switch requests showing of route statistics (the <p>The <cf/stats/ switch requests showing of route statistics (the
number of networks, number of routes before and after filtering). If number of networks, number of routes before and after filtering). If
you use <cf/count/ instead, only the statistics will be printed. you use <cf/count/ instead, only the statistics will be printed.

View file

@ -278,7 +278,7 @@ CF_CLI(SHOW INTERFACES,,, [[Show network interfaces]])
CF_CLI(SHOW INTERFACES SUMMARY,,, [[Show summary of network interfaces]]) CF_CLI(SHOW INTERFACES SUMMARY,,, [[Show summary of network interfaces]])
{ if_show_summary(); } ; { if_show_summary(); } ;
CF_CLI(SHOW ROUTE, r_args, [[[<prefix>|for <prefix>|for <ip>] [table <t>] [filter <f>|where <cond>] [all] [primary] [(import|preimport) <p>] [stats|count]]], [[Show routing table]]) CF_CLI(SHOW ROUTE, r_args, [[[<prefix>|for <prefix>|for <ip>] [table <t>] [filter <f>|where <cond>] [all] [primary] [(import|preimport) <p>] [protocol <p>] [stats|count]]], [[Show routing table]])
{ rt_show($3); } ; { rt_show($3); } ;
r_args: r_args:
@ -334,6 +334,14 @@ r_args:
$$->import_protocol = c->proto; $$->import_protocol = c->proto;
$$->running_on_config = c->proto->cf->global; $$->running_on_config = c->proto->cf->global;
} }
| r_args PROTOCOL SYM {
struct proto_config *c = (struct proto_config *) $3->def;
$$ = $1;
if ($$->show_protocol) cf_error("Protocol specified twice");
if ($3->class != SYM_PROTO || !c->proto) cf_error("%s is not a protocol", $3->name);
$$->show_protocol = c->proto;
$$->running_on_config = c->proto->cf->global;
}
| r_args STATS { | r_args STATS {
$$ = $1; $$ = $1;
$$->stats = 1; $$->stats = 1;

View file

@ -211,6 +211,7 @@ struct rt_show_data {
struct filter *filter; struct filter *filter;
int verbose; int verbose;
struct fib_iterator fit; struct fib_iterator fit;
struct proto *show_protocol;
struct proto *import_protocol; struct proto *import_protocol;
int import_mode, primary_only; int import_mode, primary_only;
struct config *running_on_config; struct config *running_on_config;

View file

@ -979,11 +979,13 @@ rt_show_net(struct cli *c, net *n, struct rt_show_data *d)
struct ea_list *tmpa, *old_tmpa; struct ea_list *tmpa, *old_tmpa;
struct proto *p0 = e->attrs->proto; struct proto *p0 = e->attrs->proto;
struct proto *p1 = d->import_protocol; struct proto *p1 = d->import_protocol;
struct proto *p2 = d->show_protocol;
d->rt_counter++; d->rt_counter++;
ee = e; ee = e;
rte_update_lock(); /* We use the update buffer for filtering */ rte_update_lock(); /* We use the update buffer for filtering */
old_tmpa = tmpa = p0->make_tmp_attrs ? p0->make_tmp_attrs(e, rte_update_pool) : NULL; old_tmpa = tmpa = p0->make_tmp_attrs ? p0->make_tmp_attrs(e, rte_update_pool) : NULL;
ok = (d->filter == FILTER_ACCEPT || f_run(d->filter, &e, &tmpa, rte_update_pool, FF_FORCE_TMPATTR) <= F_ACCEPT); ok = (d->filter == FILTER_ACCEPT || f_run(d->filter, &e, &tmpa, rte_update_pool, FF_FORCE_TMPATTR) <= F_ACCEPT);
if (p2 && p2 != p0) ok = 0;
if (ok && d->import_mode) if (ok && d->import_mode)
{ {
int ic = (p1->import_control ? p1->import_control(p1, &e, &tmpa, rte_update_pool) : 0); int ic = (p1->import_control ? p1->import_control(p1, &e, &tmpa, rte_update_pool) : 0);