Commit c4f0f014 authored by Ondřej Filip's avatar Ondřej Filip

Added show ospf interface.

show ospf neighbors now knows "<interface>".
parent 58740ed4
......@@ -15,6 +15,8 @@ CF_DECLS
CF_KEYWORDS(OSPF, AREA, OSPF_METRIC1, OSPF_METRIC2, OSPF_TAG)
CF_KEYWORDS(NEIGHBORS)
%type <t> opttext
CF_GRAMMAR
CF_ADDTO(proto, ospf_proto '}')
......@@ -34,7 +36,12 @@ ospf_proto:
ospf_area: AREA idval {
((struct ospf_config *)this_proto)->area = $2;
}
;
;
opttext:
TEXT
| /* empty */ { $$ = NULL; }
;
CF_ADDTO(dynamic_attr, OSPF_METRIC1 { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_OSPF_METRIC1); })
CF_ADDTO(dynamic_attr, OSPF_METRIC2 { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_OSPF_METRIC2); })
......@@ -43,8 +50,11 @@ CF_ADDTO(dynamic_attr, OSPF_TAG { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEM
CF_CLI(SHOW OSPF, optsym, [<name>], [[Show information about ospf protocol]])
{ ospf_sh(proto_get_named($3, &proto_ospf)); } ;
CF_CLI(SHOW OSPF NEIGHBORS, optsym, [<name>], [[Show information about ospf neighbors]])
{ ospf_sh_neigh(proto_get_named($4, &proto_ospf)); } ;
CF_CLI(SHOW OSPF NEIGHBORS, optsym opttext, [<name>] [\"<interface>\"], [[Show information about ospf neighbors]])
{ ospf_sh_neigh(proto_get_named($4, &proto_ospf), $5); } ;
CF_CLI(SHOW OSPF INTERFACE, optsym opttext, [<name>] [\"<interface>\"], [[Show infomation about interface]])
{ ospf_sh_iface(proto_get_named($4, &proto_ospf), $5); };
CF_CODE
......
......@@ -14,6 +14,8 @@ char *ospf_is[]={ "down", "loop", "waiting", "point-to-point", "drother",
char *ospf_ism[]={ "interface up", "wait timer fired", "backup seen",
"neighbor change", "loop indicated", "unloop indicated", "interface down"};
char *ospf_it[]={ "broadcast", "nbma", "point-to-point", "virtual link" };
void
iface_chstate(struct ospf_iface *ifa, u8 state)
{
......@@ -406,3 +408,22 @@ ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface)
}
}
void
ospf_iface_info(struct ospf_iface *ifa)
{
int x;
cli_msg(-1015,"Interface \"%s\":", ifa->iface->name);
cli_msg(-1015,"\tArea: %I (%u)", ifa->oa->areaid, ifa->oa->areaid);
cli_msg(-1015,"\tType: %s", ospf_it[ifa->type]);
cli_msg(-1015,"\tState: %s", ospf_is[ifa->state]);
cli_msg(-1015,"\tPriority: %u", ifa->priority);
cli_msg(-1015,"\tCost: %u", ifa->cost);
cli_msg(-1015,"\tHello timer: %u", ifa->helloint);
cli_msg(-1015,"\tWait timer: %u", ifa->waitint);
cli_msg(-1015,"\tDead timer: %u", ifa->deadc*ifa->helloint);
cli_msg(-1015,"\tRetransmit timer: %u", ifa->rxmtint);
cli_msg(-1015,"\tDesigned router (ID): %I", ifa->drid);
cli_msg(-1015,"\tDesigned router (IP): %I", ifa->drip);
cli_msg(-1015,"\tBackup designed router (ID): %I", ifa->bdrid);
cli_msg(-1015,"\tBackup designed router (IP): %I", ifa->bdrip);
}
......@@ -21,5 +21,6 @@ void ospf_add_timers(struct ospf_iface *ifa, pool *pool);
void ospf_iface_default(struct ospf_iface *ifa);
struct ospf_iface *find_iface(struct proto_ospf *p, struct iface *what);
void ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface);
void ospf_iface_info(struct ospf_iface *ifa);
#endif /* _BIRD_OSPF_IFACE_H_ */
......@@ -318,19 +318,38 @@ struct protocol proto_ospf = {
};
void
ospf_sh_neigh(struct proto *p)
ospf_sh_neigh(struct proto *p, char *iff)
{
struct ospf_iface *ifa;
struct ospf_iface *ifa=NULL,*f;
struct ospf_neighbor *n;
struct proto_ospf *po=(struct proto_ospf *)p;
if(iff!=NULL)
{
WALK_LIST(f, po->iface_list)
{
if(strcmp(iff,f->iface->name)==0) ifa=f;
break;
}
if(ifa==NULL)
{
cli_msg(0,"");
return;
}
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);
WALK_LIST(n, ifa->neigh_list) ospf_sh_neigh_info(n);
cli_msg(0,"");
}
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,"");
}
void
......@@ -371,3 +390,36 @@ ospf_sh(struct proto *p)
cli_msg(0,"");
}
void
ospf_sh_iface(struct proto *p, char *iff)
{
struct ospf_area *oa;
struct proto_ospf *po=(struct proto_ospf *)p;
struct ospf_iface *ifa=NULL,*f;
struct ospf_neighbor *n;
int ifano;
int nno;
int adjno;
if(iff!=NULL)
{
WALK_LIST(f, po->iface_list)
{
if(strcmp(iff,f->iface->name)==0) ifa=f;
break;
}
if(ifa==NULL)
{
cli_msg(0,"");
return;
}
cli_msg(-1015,"%s:", p->name);
ospf_iface_info(ifa);
cli_msg(0,"");
return;
}
cli_msg(-1015,"%s:", p->name);
WALK_LIST(ifa, po->iface_list) ospf_iface_info(ifa);
cli_msg(0,"");
}
......@@ -362,8 +362,9 @@ void ospf_rt_notify(struct proto *p, net *n, rte *new, rte *old,ea_list *attrs);
void area_disp(timer *timer);
void schedule_rt_lsa(struct ospf_area *oa);
void schedule_rtcalc(struct ospf_area *oa);
void ospf_sh_neigh(struct proto *p);
void ospf_sh_neigh(struct proto *p, char *iff);
void ospf_sh(struct proto *p);
void ospf_sh_iface(struct proto *p, char *iff);
#define EA_OSPF_METRIC1 EA_CODE(EAP_OSPF, 0)
#define EA_OSPF_METRIC2 EA_CODE(EAP_OSPF, 1)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment