Implemented `show route <...> stats'.

This commit is contained in:
Martin Mares 2000-05-07 11:28:59 +00:00
parent 6998bb9ee3
commit 23693958aa
5 changed files with 19 additions and 5 deletions

5
TODO
View file

@ -9,11 +9,12 @@ Core
- Makefile: install target? - Makefile: install target?
- forgetting device routes???
- filter-defined internal attributes
- netlink: realms - netlink: realms
- filters: deletion of mandatory attributes? - filters: deletion of mandatory attributes?
- filters: user defined attributes?
- cli: show tables?
Documentation Documentation
~~~~~~~~~~~~~ ~~~~~~~~~~~~~

View file

@ -22,6 +22,7 @@ Reply codes of BIRD command-line interface
0011 Enabled 0011 Enabled
0012 Restarted 0012 Restarted
0013 Status report 0013 Status report
0014 Route count
1000 BIRD version 1000 BIRD version
1001 Interface list 1001 Interface list

View file

@ -22,7 +22,7 @@ CF_DECLS
CF_KEYWORDS(ROUTER, ID, PROTOCOL, PREFERENCE, DISABLED, DEBUG, ALL, OFF, DIRECT) CF_KEYWORDS(ROUTER, ID, PROTOCOL, PREFERENCE, DISABLED, DEBUG, ALL, OFF, DIRECT)
CF_KEYWORDS(INTERFACE, IMPORT, EXPORT, FILTER, NONE, TABLE, STATES, ROUTES, FILTERS) CF_KEYWORDS(INTERFACE, IMPORT, EXPORT, FILTER, NONE, TABLE, STATES, ROUTES, FILTERS)
CF_KEYWORDS(PASSWORD, FROM, PASSIVE, TO, ID, EVENTS, PACKETS, PROTOCOLS, INTERFACES) CF_KEYWORDS(PASSWORD, FROM, PASSIVE, TO, ID, EVENTS, PACKETS, PROTOCOLS, INTERFACES)
CF_KEYWORDS(PRIMARY) CF_KEYWORDS(PRIMARY, STATS)
CF_ENUM(T_ENUM_RTS, RTS_, DUMMY, STATIC, INHERIT, DEVICE, STATIC_DEVICE, REDIRECT, CF_ENUM(T_ENUM_RTS, RTS_, DUMMY, STATIC, INHERIT, DEVICE, STATIC_DEVICE, REDIRECT,
RIP, OSPF, OSPF_EXT, OSPF_IA, OSPF_BOUNDARY, BGP, PIPE) RIP, OSPF, OSPF_EXT, OSPF_IA, OSPF_BOUNDARY, BGP, PIPE)
@ -240,7 +240,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>] [table <t>] [filter <f>] [all] [primary] [(import|protocol) <p>], [[Show routing table]]) CF_CLI(SHOW ROUTE, r_args, [<prefix>] [table <t>] [filter <f>] [all] [primary] [(import|protocol) <p>] [stats], [[Show routing table]])
{ rt_show($3); } ; { rt_show($3); } ;
r_args: r_args:
@ -290,6 +290,10 @@ 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 STATS {
$$ = $1;
$$->stats = 1;
}
; ;
import_or_proto: import_or_proto:

View file

@ -209,6 +209,8 @@ struct rt_show_data {
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;
int net_counter, rt_counter, show_counter;
int stats;
}; };
void rt_show(struct rt_show_data *); void rt_show(struct rt_show_data *);

View file

@ -720,11 +720,13 @@ rt_show_net(struct cli *c, net *n, struct rt_show_data *d)
int ok; int ok;
bsprintf(ia, "%I/%d", n->n.prefix, n->n.pxlen); bsprintf(ia, "%I/%d", n->n.prefix, n->n.pxlen);
d->net_counter++;
for(e=n->routes; e; e=e->next) for(e=n->routes; e; e=e->next)
{ {
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;
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;
@ -743,6 +745,7 @@ rt_show_net(struct cli *c, net *n, struct rt_show_data *d)
} }
if (ok) if (ok)
{ {
d->show_counter++;
rt_show_rte(c, ia, e, d, tmpa); rt_show_rte(c, ia, e, d, tmpa);
ia[0] = 0; ia[0] = 0;
} }
@ -789,6 +792,9 @@ rt_show_cont(struct cli *c)
rt_show_net(c, n, d); rt_show_net(c, n, d);
} }
FIB_ITERATE_END(f); FIB_ITERATE_END(f);
if (d->stats)
cli_printf(c, 14, "%d of %d routes for %d networks", d->show_counter, d->rt_counter, d->net_counter);
else
cli_printf(c, 0, ""); cli_printf(c, 0, "");
done: done:
c->cont = c->cleanup = NULL; c->cont = c->cleanup = NULL;