Commit 4d176e14 authored by Ondrej Filip's avatar Ondrej Filip
Browse files

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

parent ef9c9ab9
...@@ -351,7 +351,7 @@ BIRD and <file/birdc/ is stable (see the programmer's documentation). ...@@ -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). ...@@ -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.
......
...@@ -278,7 +278,7 @@ CF_CLI(SHOW INTERFACES,,, [[Show network interfaces]]) ...@@ -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: ...@@ -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;
......
...@@ -211,6 +211,7 @@ struct rt_show_data { ...@@ -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;
......
...@@ -979,11 +979,13 @@ rt_show_net(struct cli *c, net *n, struct rt_show_data *d) ...@@ -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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment