[zebra 14631] Generic PtP and RFC3021 interface addressing support
diff --git a/lib/if.c b/lib/if.c
index ce3595d..e1a1839 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -189,11 +189,13 @@
   listnode node;
   struct prefix addr;
   struct prefix best;
+  struct prefix peer;
   listnode cnode;
   struct interface *ifp;
   struct prefix *p;
   struct connected *c;
   struct interface *match;
+  int prefixlen;
 
   /* Zero structures - get rid of rubbish from stack */
   memset(&addr, 0, sizeof(addr));
@@ -212,34 +214,24 @@
       for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
 	{
 	  c = getdata (cnode);
+	  p = c->address;
 
-	  if (if_is_pointopoint (ifp))
+	  if (p->family == AF_INET)
 	    {
-	      p = c->address;
+	      prefixlen = p->prefixlen;
 
-	      if (p && p->family == AF_INET)
+	      if (if_is_pointopoint (ifp) ||
+		  prefixlen >= IPV4_MAX_PREFIXLEN - 1)
 		{
-#ifdef OLD_RIB	 /* PTP  links are conventionally identified 
-		     by the address of the far end - MAG */
-		  if (IPV4_ADDR_SAME (&p->u.prefix4, &src))
-		    return ifp;
-#endif
-		  p = c->destination;
-		  if (p && IPV4_ADDR_SAME (&p->u.prefix4, &src))
-		    return ifp;
+		  peer = *c->destination;
+		  peer.prefixlen = prefixlen;
+		  p = &peer;
 		}
-	    }
-	  else
-	    {
-	      p = c->address;
 
-	      if (p->family == AF_INET)
+	      if (prefix_match (p, &addr) && prefixlen > best.prefixlen)
 		{
-		  if (prefix_match (p, &addr) && p->prefixlen > best.prefixlen)
-		    {
-		      best = *p;
-		      match = ifp;
-		    }
+		  best = *p;
+		  match = ifp;
 		}
 	    }
 	}