Implemented `show static'. It's a relatively good example of how to write
show commands for other protocols.
This commit is contained in:
parent
02c1fbddd4
commit
feed822676
4 changed files with 41 additions and 0 deletions
|
@ -20,6 +20,7 @@ Reply codes of BIRD command-line interface
|
||||||
1006 Protocol details
|
1006 Protocol details
|
||||||
1007 Route list
|
1007 Route list
|
||||||
1008 Route details
|
1008 Route details
|
||||||
|
1009 Static route list
|
||||||
|
|
||||||
8000 Reply too long
|
8000 Reply too long
|
||||||
8001 Route not found
|
8001 Route not found
|
||||||
|
|
|
@ -57,6 +57,9 @@ stat_route:
|
||||||
| stat_route0 PROHIBIT { this_srt->dest = RTD_PROHIBIT; }
|
| 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_CODE
|
||||||
|
|
||||||
CF_END
|
CF_END
|
||||||
|
|
|
@ -14,7 +14,9 @@
|
||||||
#include "nest/iface.h"
|
#include "nest/iface.h"
|
||||||
#include "nest/protocol.h"
|
#include "nest/protocol.h"
|
||||||
#include "nest/route.h"
|
#include "nest/route.h"
|
||||||
|
#include "nest/cli.h"
|
||||||
#include "conf/conf.h"
|
#include "conf/conf.h"
|
||||||
|
#include "lib/string.h"
|
||||||
|
|
||||||
#include "static.h"
|
#include "static.h"
|
||||||
|
|
||||||
|
@ -41,6 +43,7 @@ static_install(struct proto *p, struct static_route *r, struct iface *ifa)
|
||||||
e->net = n;
|
e->net = n;
|
||||||
e->pflags = 0;
|
e->pflags = 0;
|
||||||
rte_update(p->table, n, p, e);
|
rte_update(p->table, n, p, e);
|
||||||
|
r->installed = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -52,6 +55,7 @@ static_remove(struct proto *p, struct static_route *r)
|
||||||
n = net_find(p->table, r->net, r->masklen);
|
n = net_find(p->table, r->net, r->masklen);
|
||||||
if (n)
|
if (n)
|
||||||
rte_update(p->table, n, p, NULL);
|
rte_update(p->table, n, p, NULL);
|
||||||
|
r->installed = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -177,3 +181,33 @@ struct protocol proto_static = {
|
||||||
dump: static_dump,
|
dump: static_dump,
|
||||||
start: static_start,
|
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, "");
|
||||||
|
}
|
||||||
|
|
|
@ -26,6 +26,9 @@ struct static_route {
|
||||||
ip_addr via; /* Destination router */
|
ip_addr via; /* Destination router */
|
||||||
struct neighbor *neigh;
|
struct neighbor *neigh;
|
||||||
byte *if_name; /* Name for RTD_DEVICE routes */
|
byte *if_name; /* Name for RTD_DEVICE routes */
|
||||||
|
int installed; /* Installed in master table */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void static_show(struct proto *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue