mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 01:31:55 +00:00
Adds filtering to 'show ospf lsadb' command.
Thanks Alexander V. Chernikov for the original patch.
This commit is contained in:
parent
0888a737b0
commit
20ab192bec
@ -50,6 +50,7 @@ CF_DECLS
|
||||
struct f_path_mask *h;
|
||||
struct password_item *p;
|
||||
struct rt_show_data *ra;
|
||||
struct lsadb_show_data *ld;
|
||||
struct iface *iface;
|
||||
void *g;
|
||||
bird_clock_t time;
|
||||
|
@ -561,6 +561,9 @@ This argument can be omitted if there exists only a single instance.
|
||||
link-state database. It is just a stripped-down version of
|
||||
'show ospf state'.
|
||||
|
||||
<tag>show ospf lsadb [global | area <m/id/ | link] [type <m/num/] [lsid <m/id/] [self | router <m/id/] [<m/name/] </tag>
|
||||
Show contents of an OSPF LSA database. Options could be used to filter entries.
|
||||
|
||||
<tag>show static [<m/name/]</tag>
|
||||
Show detailed information about static routes.
|
||||
|
||||
|
@ -120,8 +120,10 @@ CF_KEYWORDS(NONE, SIMPLE, AUTHENTICATION, STRICT, CRYPTOGRAPHIC)
|
||||
CF_KEYWORDS(ELIGIBLE, POLL, NETWORKS, HIDDEN, VIRTUAL, CHECK, LINK)
|
||||
CF_KEYWORDS(RX, BUFFER, LARGE, NORMAL, STUBNET, HIDDEN, SUMMARY, TAG, EXTERNAL)
|
||||
CF_KEYWORDS(WAIT, DELAY, LSADB, ECMP, LIMIT, WEIGHT, NSSA, TRANSLATOR, STABILITY)
|
||||
CF_KEYWORDS(GLOBAL, LSID, ROUTER, SELF)
|
||||
|
||||
%type <t> opttext
|
||||
%type <ld> lsadb_args
|
||||
|
||||
CF_GRAMMAR
|
||||
|
||||
@ -411,8 +413,22 @@ CF_CLI(SHOW OSPF STATE, optsym opttext, [<name>], [[Show information about reach
|
||||
CF_CLI(SHOW OSPF STATE ALL, optsym opttext, [<name>], [[Show information about all OSPF network state]])
|
||||
{ ospf_sh_state(proto_get_named($5, &proto_ospf), 1, 0); };
|
||||
|
||||
CF_CLI(SHOW OSPF LSADB, optsym opttext, [<name>], [[Show content of OSPF LSA database]])
|
||||
{ ospf_sh_lsadb(proto_get_named($4, &proto_ospf)); };
|
||||
CF_CLI(SHOW OSPF LSADB, lsadb_args, [global | area <id> | link] [type <num>] [lsid <id>] [self | router <id>] [<proto>], [[Show content of OSPF LSA database]])
|
||||
{ ospf_sh_lsadb($4); };
|
||||
|
||||
lsadb_args:
|
||||
/* empty */ {
|
||||
$$ = cfg_allocz(sizeof(struct lsadb_show_data));
|
||||
}
|
||||
| lsadb_args GLOBAL { $$ = $1; $$->scope = LSA_SCOPE_AS; }
|
||||
| lsadb_args AREA idval { $$ = $1; $$->scope = LSA_SCOPE_AREA; $$->area = $3 }
|
||||
| lsadb_args LINK { $$ = $1; $$->scope = 1; /* hack, 0 is no filter */ }
|
||||
| lsadb_args TYPE NUM { $$ = $1; $$->type = $3; }
|
||||
| lsadb_args LSID idval { $$ = $1; $$->lsid = $3; }
|
||||
| lsadb_args SELF { $$ = $1; $$->router = SH_ROUTER_SELF; }
|
||||
| lsadb_args ROUTER idval { $$ = $1; $$->router = $3; }
|
||||
| lsadb_args SYM { $$ = $1; $$->name = $2; }
|
||||
;
|
||||
|
||||
CF_CODE
|
||||
|
||||
|
@ -1471,8 +1471,9 @@ lsa_compare_for_lsadb(const void *p1, const void *p2)
|
||||
}
|
||||
|
||||
void
|
||||
ospf_sh_lsadb(struct proto *p)
|
||||
ospf_sh_lsadb(struct lsadb_show_data *ld)
|
||||
{
|
||||
struct proto *p = proto_get_named(ld->name, &proto_ospf);
|
||||
struct proto_ospf *po = (struct proto_ospf *) p;
|
||||
int num = po->gr->hash_entries;
|
||||
unsigned int i, j;
|
||||
@ -1486,6 +1487,9 @@ ospf_sh_lsadb(struct proto *p)
|
||||
return;
|
||||
}
|
||||
|
||||
if (ld->router == SH_ROUTER_SELF)
|
||||
ld->router = po->router_id;
|
||||
|
||||
struct top_hash_entry *hea[num];
|
||||
struct top_hash_entry *he;
|
||||
|
||||
@ -1502,6 +1506,22 @@ ospf_sh_lsadb(struct proto *p)
|
||||
{
|
||||
struct ospf_lsa_header *lsa = &(hea[i]->lsa);
|
||||
int dscope = LSA_SCOPE(lsa);
|
||||
|
||||
if (ld->scope && (dscope != (ld->scope & 0xf000)))
|
||||
continue;
|
||||
|
||||
if ((ld->scope == LSA_SCOPE_AREA) && (hea[i]->domain != ld->area))
|
||||
continue;
|
||||
|
||||
/* Ignore high nibble */
|
||||
if (ld->type && ((lsa->type & 0x0fff) != (ld->type & 0x0fff)))
|
||||
continue;
|
||||
|
||||
if (ld->lsid && (lsa->id != ld->lsid))
|
||||
continue;
|
||||
|
||||
if (ld->router && (lsa->rt != ld->router))
|
||||
continue;
|
||||
|
||||
if ((dscope != last_dscope) || (hea[i]->domain != last_domain))
|
||||
{
|
||||
|
@ -846,7 +846,19 @@ void ospf_sh_neigh(struct proto *p, char *iff);
|
||||
void ospf_sh(struct proto *p);
|
||||
void ospf_sh_iface(struct proto *p, char *iff);
|
||||
void ospf_sh_state(struct proto *p, int verbose, int reachable);
|
||||
void ospf_sh_lsadb(struct proto *p);
|
||||
|
||||
#define SH_ROUTER_SELF 0xffffffff
|
||||
|
||||
struct lsadb_show_data {
|
||||
struct symbol *name; /* Protocol to request data from */
|
||||
u16 type; /* LSA Type, 0 -> all */
|
||||
u16 scope; /* Scope, 0 -> all, hack to handle link scope as 1 */
|
||||
u32 area; /* Specified for area scope */
|
||||
u32 lsid; /* LSA ID, 0 -> all */
|
||||
u32 router; /* Advertising router, 0 -> all */
|
||||
};
|
||||
|
||||
void ospf_sh_lsadb(struct lsadb_show_data *ld);
|
||||
|
||||
|
||||
#define EA_OSPF_METRIC1 EA_CODE(EAP_OSPF, 0)
|
||||
|
Loading…
Reference in New Issue
Block a user