summaryrefslogtreecommitdiff
path: root/ospfd
diff options
context:
space:
mode:
Diffstat (limited to 'ospfd')
-rw-r--r--ospfd/ChangeLog9
-rw-r--r--ospfd/ospfd.c32
2 files changed, 35 insertions, 6 deletions
diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog
index 27454aa2..d294a220 100644
--- a/ospfd/ChangeLog
+++ b/ospfd/ChangeLog
@@ -1,3 +1,12 @@
+2003-12-05 Greg Troxel <gdt@poblano.ir.bbn.com>
+
+ * ospfd.c (ospf_network_match_iface): Rewrite code for clarity
+ while trying not to change semantics. Add ifdefed-out code to
+ avoid matching ppp interfaces whose destination address does not
+ also match the prefix under consideration, to help out people with
+ problems due to as-yet-unfixed bugs with p2p interfaces coming and
+ going.
+
2003-07-25 kamatchi soundaram <kamatchi@tdd.sj.nec.com>
* ospf_packet.c (ospf_ls_upd_send_queue_event): get next route
diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c
index 50cb49b7..89ef21b1 100644
--- a/ospfd/ospfd.c
+++ b/ospfd/ospfd.c
@@ -713,12 +713,32 @@ ospf_network_match_iface(struct connected *co, struct prefix *net)
* and zebra 0.9[2ish-3]:
* PtP special case: network specified == iface peer addr -> ospf
*/
- return (
- ((if_is_pointopoint (co->ifp) &&
- IPV4_ADDR_SAME ( &(co->destination->u.prefix4), &(net->u.prefix4)))
- || prefix_match (net, co->address))
- ? 1 : 0
- );
+
+ /* For PtP, match if peer address matches network address exactly.
+ * This can be addr/32 or addr/p for p < 32, but the addr must match
+ * exactly; this is not a test for falling within the prefix. This
+ * test is solely for compatibility with zebra.
+ */
+ if (if_is_pointopoint (co->ifp) &&
+ IPV4_ADDR_SAME ( &(co->destination->u.prefix4), &(net->u.prefix4)))
+ return 1;
+
+#if 0
+ /* Decline to accept PtP if dst address does not match the
+ * prefix. (ifdefed out because this is a workaround, not the
+ * desired behavior.) */
+ if (if_is_pointopoint (co->ifp) &&
+ ! prefix_match (net, co->destination))
+ return 0;
+#endif
+
+ /* If the address is within the prefix, accept. Note that this
+ * applies to PtP as well as other types.
+ */
+ if (prefix_match (net, co->address))
+ return 1;
+
+ return 0; /* no match */
}
void