summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ospfd/ospfd.c35
-rw-r--r--ospfd/ospfd.h1
2 files changed, 24 insertions, 12 deletions
diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c
index 19bc1e53..a1ad929d 100644
--- a/ospfd/ospfd.c
+++ b/ospfd/ospfd.c
@@ -665,7 +665,25 @@ ospf_network_unset (struct ospf *ospf, struct prefix_ipv4 *p,
return 1;
}
-
+/* Check whether interface matches given network
+ * returns: 1, true. 0, false
+ */
+int
+ospf_network_match_iface(struct connected *co, struct prefix *net)
+{
+ /* Behaviour to match both Cisco where:
+ * iface address lies within network specified -> ospf
+ * and zebra 0.9[2ish-3]:
+ * PtP special case: network specified == iface peer addr -> ospf
+ */
+ return (
+ ((ifc_pointopoint (co) &&
+ IPV4_ADDR_SAME ( &(co->destination->u.prefix4), &(net->u.prefix4)))
+ || prefix_match (net, co->address))
+ ? 1 : 0
+ );
+}
+
void
ospf_network_run (struct ospf *ospf, struct prefix *p, struct ospf_area *area)
{
@@ -704,13 +722,9 @@ ospf_network_run (struct ospf *ospf, struct prefix *p, struct ospf_area *area)
else
addr = co->address;
- if (p->family == co->address->family &&
- ! ospf_if_is_configured (&(addr->u.prefix4)))
- if ((ifc_pointopoint (co) &&
- IPV4_ADDR_SAME (&(addr->u.prefix4), &(p->u.prefix4))) ||
- prefix_match (p, addr))
- {
- struct ospf_interface *oi;
+ if (ospf_network_match_iface(co,p))
+ {
+ struct ospf_interface *oi;
oi = ospf_if_new (ifp, co->address);
oi->connected = co;
@@ -835,10 +849,7 @@ ospf_if_update ()
if (rn->info == NULL)
continue;
- if ((oi->type == OSPF_IFTYPE_POINTOPOINT
- && IPV4_ADDR_SAME (&(co->destination->u.prefix4),
- &(rn->p.u.prefix4)))
- || prefix_match (&(rn->p), co->address))
+ if (ospf_network_match_iface(co,&rn->p))
{
found = 1;
route_unlock_node (rn);
diff --git a/ospfd/ospfd.h b/ospfd/ospfd.h
index a83231b2..a46a7931 100644
--- a/ospfd/ospfd.h
+++ b/ospfd/ospfd.h
@@ -511,6 +511,7 @@ struct ospf *ospf_get ();
void ospf_finish (struct ospf *);
int ospf_router_id_update_timer (struct thread *);
void ospf_router_id_update ();
+int ospf_network_match_iface (struct connected *, struct prefix *);
int ospf_network_set (struct ospf *, struct prefix_ipv4 *, struct in_addr);
int ospf_network_unset (struct ospf *, struct prefix_ipv4 *, struct in_addr);
int ospf_area_stub_set (struct ospf *, struct in_addr);