Cisco-like "show ospf neighbors" implemented.
This commit is contained in:
parent
b594ad2386
commit
a783e259d8
6 changed files with 60 additions and 2 deletions
|
@ -37,6 +37,7 @@ Reply codes of BIRD command-line interface
|
||||||
1010 Symbol list
|
1010 Symbol list
|
||||||
1011 Uptime
|
1011 Uptime
|
||||||
1012 Route extended attribute list
|
1012 Route extended attribute list
|
||||||
|
1013 Show ospf neighbors
|
||||||
|
|
||||||
8000 Reply too long
|
8000 Reply too long
|
||||||
8001 Route not found
|
8001 Route not found
|
||||||
|
|
|
@ -13,6 +13,7 @@ CF_HDR
|
||||||
CF_DECLS
|
CF_DECLS
|
||||||
|
|
||||||
CF_KEYWORDS(OSPF, AREA, OSPF_METRIC1, OSPF_METRIC2, OSPF_TAG)
|
CF_KEYWORDS(OSPF, AREA, OSPF_METRIC1, OSPF_METRIC2, OSPF_TAG)
|
||||||
|
CF_KEYWORDS(NEIGHBORS)
|
||||||
|
|
||||||
CF_GRAMMAR
|
CF_GRAMMAR
|
||||||
|
|
||||||
|
@ -39,6 +40,9 @@ CF_ADDTO(dynamic_attr, OSPF_METRIC1 { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF
|
||||||
CF_ADDTO(dynamic_attr, OSPF_METRIC2 { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_OSPF_METRIC2); })
|
CF_ADDTO(dynamic_attr, OSPF_METRIC2 { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_OSPF_METRIC2); })
|
||||||
CF_ADDTO(dynamic_attr, OSPF_TAG { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_OSPF_TAG); })
|
CF_ADDTO(dynamic_attr, OSPF_TAG { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_OSPF_TAG); })
|
||||||
|
|
||||||
|
CF_CLI(SHOW OSPF NEIGHBORS, optsym, [<name>], [[Show information about ospf neighbors]])
|
||||||
|
{ ospf_sh_neigh(proto_get_named($4, &proto_ospf)); } ;
|
||||||
|
|
||||||
CF_CODE
|
CF_CODE
|
||||||
|
|
||||||
CF_END
|
CF_END
|
||||||
|
|
|
@ -8,8 +8,14 @@
|
||||||
|
|
||||||
#include "ospf.h"
|
#include "ospf.h"
|
||||||
|
|
||||||
char *ospf_ns[]={"down", "attempt", "init", "2way", "exstart", "exchange",
|
char *ospf_ns[]={" down",
|
||||||
"loading", "full"};
|
" attempt",
|
||||||
|
" init",
|
||||||
|
" 2way",
|
||||||
|
" exstart",
|
||||||
|
"exchange",
|
||||||
|
" loading",
|
||||||
|
" full"};
|
||||||
|
|
||||||
const char *ospf_inm[]={ "hello received", "neighbor start", "2-way received",
|
const char *ospf_inm[]={ "hello received", "neighbor start", "2-way received",
|
||||||
"negotiation done", "exstart done", "bad ls request", "load done",
|
"negotiation done", "exstart done", "bad ls request", "load done",
|
||||||
|
@ -480,3 +486,31 @@ ospf_neigh_remove(struct ospf_neighbor *n)
|
||||||
mb_free(n);
|
mb_free(n);
|
||||||
debug("%s: Deleting neigbor.\n", p->name);
|
debug("%s: Deleting neigbor.\n", p->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ospf_sh_neigh_info(struct ospf_neighbor *n)
|
||||||
|
{
|
||||||
|
struct ospf_iface *ifa=n->ifa;
|
||||||
|
char *pos="other";
|
||||||
|
char etime[6];
|
||||||
|
int exp,sec,min;
|
||||||
|
|
||||||
|
exp=n->inactim->expires-now;
|
||||||
|
sec=exp-(exp/60);
|
||||||
|
min=(exp-sec)/60;
|
||||||
|
if(min>59)
|
||||||
|
{
|
||||||
|
sprintf(etime,"-Inf-");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sprintf(etime,"%02u:%02u", min, sec);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(n->rid==ifa->drid) pos="dr ";
|
||||||
|
if(n->rid==ifa->bdrid) pos="bdr ";
|
||||||
|
|
||||||
|
|
||||||
|
cli_msg(-1013,"%-18I\t%3u\t%s/%s\t%-5s\t%-18I\t%-10s",n->rid, n->priority,
|
||||||
|
ospf_ns[n->state], pos, etime, n->ip,ifa->iface->name);
|
||||||
|
}
|
||||||
|
|
|
@ -22,5 +22,6 @@ struct ospf_neighbor *find_neigh_noifa(struct proto_ospf *po, u32 rid);
|
||||||
struct ospf_area *ospf_find_area(struct proto_ospf *po, u32 aid);
|
struct ospf_area *ospf_find_area(struct proto_ospf *po, u32 aid);
|
||||||
void neighbor_timer_hook(timer *timer);
|
void neighbor_timer_hook(timer *timer);
|
||||||
void ospf_neigh_remove(struct ospf_neighbor *n);
|
void ospf_neigh_remove(struct ospf_neighbor *n);
|
||||||
|
void ospf_sh_neigh_info(struct ospf_neighbor *n);
|
||||||
|
|
||||||
#endif /* _BIRD_OSPF_NEIGHBOR_H_ */
|
#endif /* _BIRD_OSPF_NEIGHBOR_H_ */
|
||||||
|
|
|
@ -316,3 +316,19 @@ struct protocol proto_ospf = {
|
||||||
get_attr: ospf_get_attr,
|
get_attr: ospf_get_attr,
|
||||||
get_status: ospf_get_status
|
get_status: ospf_get_status
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
ospf_sh_neigh(struct proto *p)
|
||||||
|
{
|
||||||
|
struct ospf_iface *ifa;
|
||||||
|
struct ospf_neighbor *n;
|
||||||
|
struct proto_ospf *po=(struct proto_ospf *)p;
|
||||||
|
|
||||||
|
cli_msg(-1013,"%s:",p->name);
|
||||||
|
cli_msg(-1013,"%-12s\t%3s\t%-15s\t%-5s\t%-12s\t%-10s","Router ID","Pri",
|
||||||
|
" State", "DTime", "Router IP", "Interface");
|
||||||
|
WALK_LIST(ifa,po->iface_list)
|
||||||
|
WALK_LIST(n, ifa->neigh_list)
|
||||||
|
ospf_sh_neigh_info(n);
|
||||||
|
cli_msg(0,"");
|
||||||
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "nest/protocol.h"
|
#include "nest/protocol.h"
|
||||||
#include "nest/iface.h"
|
#include "nest/iface.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 "lib/string.h"
|
||||||
|
|
||||||
|
@ -361,6 +362,7 @@ void ospf_rt_notify(struct proto *p, net *n, rte *new, rte *old,ea_list *attrs);
|
||||||
void area_disp(timer *timer);
|
void area_disp(timer *timer);
|
||||||
void schedule_rt_lsa(struct ospf_area *oa);
|
void schedule_rt_lsa(struct ospf_area *oa);
|
||||||
void schedule_rtcalc(struct ospf_area *oa);
|
void schedule_rtcalc(struct ospf_area *oa);
|
||||||
|
void ospf_sh_neigh(struct proto *p);
|
||||||
|
|
||||||
#define EA_OSPF_METRIC1 EA_CODE(EAP_OSPF, 0)
|
#define EA_OSPF_METRIC1 EA_CODE(EAP_OSPF, 0)
|
||||||
#define EA_OSPF_METRIC2 EA_CODE(EAP_OSPF, 1)
|
#define EA_OSPF_METRIC2 EA_CODE(EAP_OSPF, 1)
|
||||||
|
|
Loading…
Reference in a new issue