summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ospfd/ChangeLog6
-rw-r--r--ospfd/ospf_packet.c36
2 files changed, 41 insertions, 1 deletions
diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog
index bc17a605..9dafb96c 100644
--- a/ospfd/ChangeLog
+++ b/ospfd/ChangeLog
@@ -1,4 +1,8 @@
-2003-12-08 Mattias Amnefelt <mattiasa@kth.se?
+2004-02-11 Vadim Suraev <vadim.suraev@terayon.com>
+ * ospf_packet.c (ospf_ls_upd): Router should flush received network
+ LSA if it was originated with older router-id ([zebra 14710] #6).
+
+2003-12-08 Mattias Amnefelt <mattiasa@kth.se>
* ospf_packet.c: (ospf_recv_packet) OpenBSD now leaves iph.ip_len
network byte order.
diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c
index 86ed3878..528e8d38 100644
--- a/ospfd/ospf_packet.c
+++ b/ospfd/ospf_packet.c
@@ -1699,6 +1699,42 @@ ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh,
}
}
#endif /* HAVE_OPAQUE_LSA */
+ /* It might be happen that received LSA is self-originated network LSA, but
+ * router ID is cahnged. So, we should check if LSA is a network-LSA whose
+ * Link State ID is one of the router's own IP interface addresses but whose
+ * Advertising Router is not equal to the router's own Router ID
+ * According to RFC 2328 12.4.2 and 13.4 this LSA should be flushed.
+ */
+
+ if(lsa->data->type == OSPF_NETWORK_LSA)
+ {
+ listnode oi_node;
+ int Flag = 0;
+
+ for(oi_node = listhead(oi->ospf->oiflist); oi_node; oi_node = nextnode(oi_node))
+ {
+ struct ospf_interface *out_if = getdata(oi_node);
+ if(out_if == NULL)
+ break;
+
+ if((IPV4_ADDR_SAME(&out_if->address->u.prefix4, &lsa->data->id)) &&
+ (!(IPV4_ADDR_SAME(&oi->ospf->router_id, &lsa->data->adv_router))))
+ {
+ if(out_if->network_lsa_self)
+ {
+ ospf_lsa_flush_area(lsa,out_if->area);
+ if(IS_DEBUG_OSPF_EVENT)
+ zlog_info ("ospf_lsa_discard() in ospf_ls_upd() point 9: lsa %p Type-%d",
+ lsa, (int) lsa->data->type);
+ ospf_lsa_discard (lsa);
+ Flag = 1;
+ }
+ break;
+ }
+ }
+ if(Flag)
+ continue;
+ }
/* (5) Find the instance of this LSA that is currently contained
in the router's link state database. If there is no