Commit 4bd28fb6 authored by Ondřej Filip's avatar Ondřej Filip

Better shutdown. (Flush my own router LSA and send 1WAY to every neighbor.)

Ext LSA originating and flushing added.
parent e8085aba
......@@ -434,3 +434,14 @@ ospf_lsupd_rx(struct ospf_lsupd_packet *ps, struct proto *p,
}
}
void
net_flush_lsa(struct top_hash_entry *en, struct proto_ospf *po,
struct ospf_area *oa)
{
struct ospf_lsa_header *lsa=&en->lsa;
lsa->age=LSA_MAXAGE;
debug("Premature aging self originated lsa.\n");
flood_lsa(NULL,NULL,lsa,po,NULL,oa);
}
......@@ -16,5 +16,8 @@ void ospf_lsupd_rx(struct ospf_lsupd_packet *ps, struct proto *p,
int flood_lsa(struct ospf_neighbor *n, struct ospf_lsa_header *hn,
struct ospf_lsa_header *hh, struct proto_ospf *po, struct ospf_iface *iff,
struct ospf_area *oa);
void net_flush_lsa(struct top_hash_entry *en, struct proto_ospf *po,
struct ospf_area *oa);
#endif /* _BIRD_OSPF_LSUPD_H_ */
......@@ -112,12 +112,6 @@ ospf_rte_same(struct rte *new, struct rte *old)
return 1;
}
static void
ospf_postconfig(struct proto_config *c)
{
DBG( " OSPF: postconfig\n" );
}
int
ospf_import_control(struct proto *p, rte **new, ea_list **attrs, struct linpool *pool)
{
......@@ -129,6 +123,32 @@ ospf_import_control(struct proto *p, rte **new, ea_list **attrs, struct linpool
return 0;
}
static int
ospf_shutdown(struct proto *p)
{
struct proto_ospf *po=(struct proto_ospf *)p;
struct ospf_iface *ifa;
struct ospf_neighbor *n;
struct ospf_area *oa;
debug("%s: Shutdown requested\n", p->name);
/* first of all flush my rt LSA */
WALK_LIST(oa,po->area_list)
{
net_flush_lsa(oa->rt,po,oa);
}
/* And send to all my neighbors 1WAY */
WALK_LIST(ifa, po->iface_list)
{
WALK_LIST(n, ifa->neigh_list) neigh_chstate(n,NEIGHBOR_DOWN);
hello_timer_hook(ifa->hello_timer);
}
return PS_DOWN;
}
void
ospf_rt_notify(struct proto *p, net *n, rte *new, rte *old, ea_list *attrs)
{
......@@ -139,13 +159,20 @@ ospf_rt_notify(struct proto *p, net *n, rte *new, rte *old, ea_list *attrs)
if(new) /* Got some new route */
{
int i;
/* Originate new external LSA */
originate_ext_lsa(n, old, po);
}
else
{
int i;
/* Flush some old external LSA */
u32 rtid=po->proto.cf->global->router_id;
struct ospf_area *oa;
struct top_hash_entry *en;
/* Flush old external LSA */
WALK_LIST(oa, po->area_list)
{
if(en=ospf_hash_find(oa->gr, ipa_to_u32(n->n.prefix), rtid, LSA_T_EXT))
net_flush_lsa(en,po,oa);
}
}
}
......@@ -155,5 +182,5 @@ struct protocol proto_ospf = {
init: ospf_init,
dump: ospf_dump,
start: ospf_start,
postconfig: ospf_postconfig,
shutdown: ospf_shutdown
};
......@@ -350,7 +350,7 @@ originate_ext_lsa_body(net *n, rte *e, struct proto_ospf *po)
}
void
originate_ext_lsa(net *n, rte *e, u16 *len, struct proto_ospf *po)
originate_ext_lsa(net *n, rte *e, struct proto_ospf *po)
{
struct ospf_lsa_header lsa;
u32 rtid=po->proto.cf->global->router_id;
......
......@@ -49,5 +49,6 @@ void addifa_rtlsa(struct ospf_iface *ifa);
void originate_rt_lsa(struct ospf_area *oa,struct proto_ospf *po);
void originate_net_lsa(struct ospf_iface *ifa,struct proto_ospf *po);
int can_flush_lsa(struct ospf_area *oa);
void originate_ext_lsa(net *n, rte *e, struct proto_ospf *po);
#endif /* _BIRD_OSPF_TOPOLOGY_H_ */
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