diff options
author | Ondrej Zajicek (work) <santiago@crfreenet.org> | 2016-03-22 12:51:31 +0100 |
---|---|---|
committer | Ondrej Zajicek (work) <santiago@crfreenet.org> | 2016-03-23 02:21:42 +0100 |
commit | 39a6b19d6d7e420805bd75783b77bf442745bccb (patch) | |
tree | 9c0803604b119974822cb066b6d7c7f838ebef40 /proto/ospf | |
parent | 0a505706bc909b2625d308ffb2eaed3dc8398538 (diff) |
OSPF: Fix bogus LSA ID collisions between received and originated LSAs
After restart, LSAs locally originated by the previous instance are
received from neighbors. They are installed to LSA db and flushed. If
export of a route triggers origination of a new external LSA before flush
of the received one is complete, the check in ospf_originate_lsa() causes
origination to fail (because en->nf is NULL for the old LSA and non-NULL
for the new LSA). The patch fixes this by updating the en->nf for LSAs
being flushed (as is already done for empty ones). Generally, en->nf
field deserves some better description in the code.
Thanks to Jigar Mehta for analyzing the problem.
Diffstat (limited to 'proto/ospf')
-rw-r--r-- | proto/ospf/topology.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/proto/ospf/topology.c b/proto/ospf/topology.c index 8119cfa6..7558d4a0 100644 --- a/proto/ospf/topology.c +++ b/proto/ospf/topology.c @@ -278,7 +278,7 @@ ospf_originate_lsa(struct ospf_proto *p, struct ospf_new_lsa *lsa) if (!SNODE_VALID(en)) s_add_tail(&p->lsal, SNODE en); - if (en->lsa_body == NULL) + if (!en->nf || !en->lsa_body) en->nf = lsa->nf; if (en->nf != lsa->nf) |