]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
'show route protocol <p>' added to CLI.
authorOndrej Filip <feela@majklik.network.cz>
Mon, 11 May 2009 00:01:11 +0000 (02:01 +0200)
committerOndrej Filip <feela@majklik.network.cz>
Mon, 11 May 2009 00:01:11 +0000 (02:01 +0200)
doc/bird.sgml
nest/config.Y
nest/route.h
nest/rt-table.c

index 70cd523fcc8b0bbe5be0b0196fa467dec8f7405a..f62881c3e29c9eb996e11ca498ad09698b9e75dd 100644 (file)
@@ -351,7 +351,7 @@ BIRD and <file/birdc/ is stable (see the programmer's documentation).
        <tag>show symbols</tag>
        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),
        that is routes, their metrics and (in case the <cf/all/ switch is given)
        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
        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
        number of networks, number of routes before and after filtering). If
        you use <cf/count/ instead, only the statistics will be printed.
index b89e458be6a6899a10efc4331dbe0c1b32cc8f62..d500f458b6ad89c4867a204f96509abf1a2c379d 100644 (file)
@@ -278,7 +278,7 @@ CF_CLI(SHOW INTERFACES,,, [[Show network interfaces]])
 CF_CLI(SHOW INTERFACES SUMMARY,,, [[Show summary of network interfaces]])
 { 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); } ;
 
 r_args:
@@ -334,6 +334,14 @@ r_args:
      $$->import_protocol = c->proto;
      $$->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 {
      $$ = $1;
      $$->stats = 1;
index 0de0e0f7593e913ab8d18c0622312dfb20274201..08df881fe282d2323d415d0475b2f10f8be710c6 100644 (file)
@@ -211,6 +211,7 @@ struct rt_show_data {
   struct filter *filter;
   int verbose;
   struct fib_iterator fit;
+  struct proto *show_protocol;
   struct proto *import_protocol;
   int import_mode, primary_only;
   struct config *running_on_config;
index 3fa5267655d90730b85278ce3aa94487b0937227..4a04a0ae6a0fbea3f0590bd0983181197dcb4182 100644 (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 proto *p0 = e->attrs->proto;
       struct proto *p1 = d->import_protocol;
+      struct proto *p2 = d->show_protocol;
       d->rt_counter++;
       ee = e;
       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;
       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)
        {
          int ic = (p1->import_control ? p1->import_control(p1, &e, &tmpa, rte_update_pool) : 0);