2003-09-29 Paul Jakma <paul@dishone.st>

	* zebra/connected.c: revert the 'generic PtP' patch as it causes
	far too many problems. People who use FreeSWAN should investigate
	native linux ipsec.
	* zebra/rt_netlink.c: ditto
	* lib/if.c: ditto
	* ripd/ripd.h: ditto
	* ripd/ripd.c: ditto
	* ripd/rip_interface.c: ditto
	* ospfd/ospfd.c: ditto
	* ospfd/ospf_snmp.c: ditto
	* bgpd/bgp_nexthop.c: ditto
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index a2efa17..02cae6e 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -487,7 +487,6 @@
   void *broad = NULL;
   u_char flags = 0;
   char *label = NULL;
-  int peeronly = 0;
 
   ifa = NLMSG_DATA (h);
 
@@ -539,40 +538,41 @@
       if (tb[IFA_LABEL] && strcmp (ifp->name, RTA_DATA (tb[IFA_LABEL])))
         zlog_info ("  IFA_LABEL     %s", RTA_DATA (tb[IFA_LABEL]));
     }
-
-  /* peer or broadcast network? */
-  if (ifa->ifa_family == AF_INET)
-    peeronly = if_is_pointopoint (ifp) ||
-      ifa->ifa_prefixlen >= IPV4_MAX_PREFIXLEN - 1;
-#ifdef HAVE_IPV6
-  if (ifa->ifa_family == AF_INET6)
+  
+  if (tb[IFA_ADDRESS] == NULL)
+    tb[IFA_ADDRESS] = tb[IFA_LOCAL];
+  
+  if (ifp->flags & IFF_POINTOPOINT)
     {
-      peeronly = if_is_pointopoint (ifp) ||
-        ifa->ifa_prefixlen >= IPV6_MAX_PREFIXLEN - 1;
+      if (tb[IFA_LOCAL])
+        {
+          addr = RTA_DATA (tb[IFA_LOCAL]);
+          if (tb[IFA_ADDRESS])
+            broad = RTA_DATA (tb[IFA_ADDRESS]);
+          else
+            broad = NULL;
+        }
+      else
+        {
+          if (tb[IFA_ADDRESS])
+            addr = RTA_DATA (tb[IFA_ADDRESS]);
+          else
+            addr = NULL;
+        }
     }
-#endif /* HAVE_IPV6 */
-  if (!(tb[IFA_LOCAL] && tb[IFA_ADDRESS]))
+  else
     {
-      /* FIXME: IPv6 Appears to have only IFA_ADDRESS */
-      peeronly = 0;
+      if (tb[IFA_ADDRESS])
+        addr = RTA_DATA (tb[IFA_ADDRESS]);
+      else
+        addr = NULL;
+      
+      if (tb[IFA_BROADCAST])
+        broad = RTA_DATA(tb[IFA_BROADCAST]);
+      else
+        broad = NULL;
     }
 
-  /* network. prefixlen applies to IFA_ADDRESS rather than IFA_LOCAL */
-  if (tb[IFA_ADDRESS] && !peeronly)
-    addr = RTA_DATA (tb[IFA_ADDRESS]);
-  else if (tb[IFA_LOCAL])
-    addr = RTA_DATA (tb[IFA_LOCAL]);
-  else
-    addr = NULL;
-
-  /* broadcast/peer */
-  if (tb[IFA_BROADCAST])
-    broad = RTA_DATA (tb[IFA_BROADCAST]);
-  else if (tb[IFA_ADDRESS] && peeronly)
-    broad = RTA_DATA (tb[IFA_ADDRESS]); /* peer address specified */
-  else
-    broad = NULL;
-
   /* Flags. */
   if (ifa->ifa_flags & IFA_F_SECONDARY)
     SET_FLAG (flags, ZEBRA_IFA_SECONDARY);