Paul Jakma:
[zebra 17352] ospf network matching (aka need for peer /32 for PtP)
change behaviour of network <prefix> area N statement wrt to PtP.
diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c
index 19bc1e5..a1ad929 100644
--- a/ospfd/ospfd.c
+++ b/ospfd/ospfd.c
@@ -665,7 +665,25 @@
   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 @@
 	  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 @@
 	      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 a83231b..a46a793 100644
--- a/ospfd/ospfd.h
+++ b/ospfd/ospfd.h
@@ -511,6 +511,7 @@
 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);