summaryrefslogtreecommitdiffstats
path: root/proto/static
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1999-12-03 12:41:23 +0100
committerMartin Mares <mj@ucw.cz>1999-12-03 12:41:23 +0100
commitfeed82267663c6826da896309de180417bd0b39f (patch)
treea67184df9223e16bd0b59b69f5af0c45290deae6 /proto/static
parent02c1fbddd462fecc6887a44ef67202870bcae7be (diff)
downloadbird-feed82267663c6826da896309de180417bd0b39f.tar
bird-feed82267663c6826da896309de180417bd0b39f.zip
Implemented `show static'. It's a relatively good example of how to write
show commands for other protocols.
Diffstat (limited to 'proto/static')
-rw-r--r--proto/static/config.Y3
-rw-r--r--proto/static/static.c34
-rw-r--r--proto/static/static.h3
3 files changed, 40 insertions, 0 deletions
diff --git a/proto/static/config.Y b/proto/static/config.Y
index df9e55b..1e2d7a8 100644
--- a/proto/static/config.Y
+++ b/proto/static/config.Y
@@ -57,6 +57,9 @@ stat_route:
| stat_route0 PROHIBIT { this_srt->dest = RTD_PROHIBIT; }
;
+CF_CLI(SHOW STATIC, optsym, [<name>], [[Show details of static protocol]])
+{ static_show(proto_get_named($3, &proto_static)); } ;
+
CF_CODE
CF_END
diff --git a/proto/static/static.c b/proto/static/static.c
index d245be2..4217ad0 100644
--- a/proto/static/static.c
+++ b/proto/static/static.c
@@ -14,7 +14,9 @@
#include "nest/iface.h"
#include "nest/protocol.h"
#include "nest/route.h"
+#include "nest/cli.h"
#include "conf/conf.h"
+#include "lib/string.h"
#include "static.h"
@@ -41,6 +43,7 @@ static_install(struct proto *p, struct static_route *r, struct iface *ifa)
e->net = n;
e->pflags = 0;
rte_update(p->table, n, p, e);
+ r->installed = 1;
}
static void
@@ -52,6 +55,7 @@ static_remove(struct proto *p, struct static_route *r)
n = net_find(p->table, r->net, r->masklen);
if (n)
rte_update(p->table, n, p, NULL);
+ r->installed = 0;
}
static int
@@ -177,3 +181,33 @@ struct protocol proto_static = {
dump: static_dump,
start: static_start,
};
+
+static void
+static_show_rt(struct static_route *r)
+{
+ byte via[STD_ADDRESS_P_LENGTH + 16];
+
+ switch (r->dest)
+ {
+ case RTD_ROUTER: bsprintf(via, "via %I", r->via); break;
+ case RTD_DEVICE: bsprintf(via, "to %s", r->if_name); break;
+ case RTD_BLACKHOLE: bsprintf(via, "blackhole"); break;
+ case RTD_UNREACHABLE: bsprintf(via, "unreachable"); break;
+ case RTD_PROHIBIT: bsprintf(via, "prohibited"); break;
+ default: bsprintf(via, "???");
+ }
+ cli_msg(-1009, "%I/%d %s%s", r->net, r->masklen, via, r->installed ? "" : " (dormant)");
+}
+
+void
+static_show(struct proto *P)
+{
+ struct static_config *c = (void *) P->cf;
+ struct static_route *r;
+
+ WALK_LIST(r, c->other_routes)
+ static_show_rt(r);
+ WALK_LIST(r, c->iface_routes)
+ static_show_rt(r);
+ cli_msg(0, "");
+}
diff --git a/proto/static/static.h b/proto/static/static.h
index 5299a9f..6645118 100644
--- a/proto/static/static.h
+++ b/proto/static/static.h
@@ -26,6 +26,9 @@ struct static_route {
ip_addr via; /* Destination router */
struct neighbor *neigh;
byte *if_name; /* Name for RTD_DEVICE routes */
+ int installed; /* Installed in master table */
};
+void static_show(struct proto *);
+
#endif