2004-05-01 Paul Jakma <paul@dishone.st>

        * Revert the attempted clean-up of the dummy peer hack, reverts
          patchsets 435 (see 2004-02-17 below) and 456.
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index ae8af9f..e9d81de 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -504,10 +504,11 @@
   return 0;
 }
 
+/* Peer comparison function for sorting.  */
 static int
 peer_cmp (struct peer *p1, struct peer *p2)
 {
-  return sockunion_cmp (&p1->su, &p2->su);  
+  return sockunion_cmp (&p1->su, &p2->su);
 }
 
 int
@@ -683,11 +684,8 @@
   peer = XMALLOC (MTYPE_BGP_PEER, sizeof (struct peer));
   memset (peer, 0, sizeof (struct peer));
 
-  peer->fd = &peer->fd_local;
-
   /* Set default value. */
-  peer->fd_local = -1;
-  peer->fd_accept = -1;
+  peer->fd = -1;
   peer->v_start = BGP_INIT_START_TIMER;
   peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
   peer->v_asorig = BGP_DEFAULT_ASORIGINATE;
@@ -771,6 +769,19 @@
   return peer;
 }
 
+/* Make accept BGP peer.  Called from bgp_accept (). */
+struct peer *
+peer_create_accept (struct bgp *bgp)
+{
+  struct peer *peer;
+
+  peer = peer_new ();
+  peer->bgp = bgp;
+  listnode_add_sort (bgp->peer, peer);
+
+  return peer;
+}
+
 /* Change peer's AS number.  */
 void
 peer_as_change (struct peer *peer, as_t as)
@@ -1799,8 +1810,9 @@
   
   LIST_LOOP (bgp->peer, peer, nn)
     {
-      if (sockunion_same (&peer->su, su))
-        return peer;
+      if (sockunion_same (&peer->su, su)
+	  && ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
+	return peer;
     }
   return NULL;
 }
@@ -1819,25 +1831,27 @@
 
   LIST_LOOP (bgp->peer, peer, nn)
     {
-      if (sockunion_same (&peer->su, su))
-        {
-          if (peer->as == remote_as
-              && peer->remote_id.s_addr == remote_id->s_addr)
-            return peer;
-          if (peer->as == remote_as)
-            *as = 1;
-        }
+      if (sockunion_same (&peer->su, su)
+	  && ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
+	{
+	  if (peer->as == remote_as
+	      && peer->remote_id.s_addr == remote_id->s_addr)
+	    return peer;
+	  if (peer->as == remote_as)
+	    *as = 1;
+	}
     }
   LIST_LOOP (bgp->peer, peer, nn)
     {
-      if (sockunion_same (&peer->su, su))
-        {
-          if (peer->as == remote_as
-              && peer->remote_id.s_addr == 0)
-            return peer;
-          if (peer->as == remote_as)
-            *as = 1;
-        }
+      if (sockunion_same (&peer->su, su)
+	  &&  ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
+	{
+	  if (peer->as == remote_as
+	      && peer->remote_id.s_addr == 0)
+	    return peer;
+	  if (peer->as == remote_as)
+	    *as = 1;
+	}
     }
   return NULL;
 }
@@ -2264,24 +2278,22 @@
 
   if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
     {
-      if (*peer->fd >= 0 && peer_sort (peer) != BGP_PEER_IBGP)
-        sockopt_ttl (peer->su.sa.sa_family, *peer->fd, 
-                     peer->ttl);
+      if (peer->fd >= 0 && peer_sort (peer) != BGP_PEER_IBGP)
+	sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl);
     }
   else
     {
       group = peer->group;
       LIST_LOOP (group->peer, peer, nn)
-        {
-          if (peer_sort (peer) == BGP_PEER_IBGP)
-            continue;
+	{
+	  if (peer_sort (peer) == BGP_PEER_IBGP)
+	    continue;
 
-          peer->ttl = group->conf->ttl;
+	  peer->ttl = group->conf->ttl;
 
-          if (*peer->fd >= 0)
-            sockopt_ttl (peer->su.sa.sa_family,
-                         *peer->fd, peer->ttl);
-        }
+	  if (peer->fd >= 0)
+	    sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl);
+	}
     }
   return 0;
 }
@@ -2302,24 +2314,22 @@
 
   if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
     {
-      if (*peer->fd >= 0 && peer_sort (peer) != BGP_PEER_IBGP)
-        sockopt_ttl (peer->su.sa.sa_family, 
-                     *peer->fd, peer->ttl);
+      if (peer->fd >= 0 && peer_sort (peer) != BGP_PEER_IBGP)
+	sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl);
     }
   else
     {
       group = peer->group;
       LIST_LOOP (group->peer, peer, nn)
-        {
-          if (peer_sort (peer) == BGP_PEER_IBGP)
-            continue;
+	{
+	  if (peer_sort (peer) == BGP_PEER_IBGP)
+	    continue;
 
-          peer->ttl = 1;
-          
-          if (*peer->fd >= 0)
-            sockopt_ttl (peer->su.sa.sa_family,
-                         *peer->fd, peer->ttl);
-        }
+	  peer->ttl = 1;
+	  
+	  if (peer->fd >= 0)
+	    sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl);
+	}
     }
   return 0;
 }