]> git.puffer.fish Git - mirror/frr.git/commitdiff
2004-02-17 Paul Jakma <paul@dishone.st>
authorpaul <paul>
Tue, 17 Feb 2004 19:45:10 +0000 (19:45 +0000)
committerpaul <paul>
Tue, 17 Feb 2004 19:45:10 +0000 (19:45 +0000)
        * bgpd.h: (bgp_peer) add fd_local and fd_accept
          file descriptor's, fd becomes a pointer to one of these.
        * bgpd.c: (global) adjust for fact that fd is now a pointer.
          (peer_create_accept) removed.
        * bgp_route.c: (global) adjust for change of peer fd to pointer
        * bgp_packet.c: (bgp_collision_detect) adjust and remove the
          "replace with other peer" hack.
        * bgp_network.c: (bgp_accept) Remove the dummy peer hack.
          Update peer->fd_accept instead.
          (global) Adjust fd references - now a pointer.
        * bgp_fsm.c: (global) adjust peer fd to pointer.
          (bgp_connection_stop) new function, to stop connection.
          (global) adjust everything which closed peer fd to use
          bgp_connection_stop().

bgpd/ChangeLog
bgpd/bgp_fsm.c
bgpd/bgp_network.c
bgpd/bgp_packet.c
bgpd/bgp_route.c
bgpd/bgpd.c
bgpd/bgpd.h

index 428c2b938adeb0aae87f77b9c897a7c6494a2313..f28e6a0ce79f51c54811253b3f032f4c909c4fff 100644 (file)
@@ -1,8 +1,25 @@
+2004-02-17 Paul Jakma <paul@dishone.st>
+
+       * bgpd.h: (bgp_peer) add fd_local and fd_accept 
+         file descriptor's, fd becomes a pointer to one of these.
+       * bgpd.c: (global) adjust for fact that fd is now a pointer.
+         (peer_create_accept) removed.
+       * bgp_route.c: (global) adjust for change of peer fd to pointer
+       * bgp_packet.c: (bgp_collision_detect) adjust and remove the 
+         "replace with other peer" hack. 
+       * bgp_network.c: (bgp_accept) Remove the dummy peer hack. 
+         Update peer->fd_accept instead. 
+         (global) Adjust fd references - now a pointer.
+       * bgp_fsm.c: (global) adjust peer fd to pointer.
+         (bgp_connection_stop) new function, to stop connection.
+         (global) adjust everything which closed peer fd to use
+         bgp_connection_stop().
+         
 2003-12-23 Krzysztof Oledzki <oleq@ans.pl>
 
        * bgp_network.c: drop privs on error cases
 
-2003-08-11 kunihiro <kunihiro@zebra.org
+2003-08-11 kunihiro <kunihiro@zebra.org>
 
        * bgp_route{,map}.c: Extend 'set ip next-hop' in route-maps with
          ability to specify 'peer-address' rather than IP. 
index 3d8e957675d92c835bf51513b7abb8ead47364ff..ac25f151e4c07277b8db6689e70bc7233c9dec6a 100644 (file)
@@ -292,7 +292,7 @@ bgp_routeadv_timer (struct thread *thread)
 
   peer->synctime = time (NULL);
 
-  BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
+  BGP_WRITE_ON (peer->t_write, bgp_write, *peer->fd);
 
   BGP_TIMER_ON (peer->t_routeadv, bgp_routeadv_timer,
                peer->v_routeadv);
@@ -307,6 +307,21 @@ bgp_uptime_reset (struct peer *peer)
   peer->uptime = time (NULL);
 }
 
+void
+bgp_connection_stop (struct peer *peer)
+{
+  if (peer->fd_local >= 0)
+    {
+      close (peer->fd_local);
+      peer->fd_local = -1;
+    }
+  if (peer->fd_accept >= 0)
+    {
+      close (peer->fd_accept);
+      peer->fd_accept = -1;
+    }
+}
+
 /* Administrative BGP peer stop event. */
 int
 bgp_stop (struct peer *peer)
@@ -367,12 +382,8 @@ bgp_stop (struct peer *peer)
     stream_reset (peer->work);
   stream_fifo_clean (peer->obuf);
 
-  /* Close of file descriptor. */
-  if (peer->fd >= 0)
-    {
-      close (peer->fd);
-      peer->fd = -1;
-    }
+  /* Close of connections. */
+  bgp_connection_stop (peer);
 
   /* Connection information. */
   if (peer->su_local)
@@ -386,7 +397,7 @@ bgp_stop (struct peer *peer)
       XFREE (MTYPE_SOCKUNION, peer->su_remote);
       peer->su_remote = NULL;
     }
-
+    
   /* Clear remote router-id. */
   peer->remote_id.s_addr = 0;
 
@@ -477,13 +488,13 @@ bgp_stop_with_error (struct peer *peer)
 int
 bgp_connect_success (struct peer *peer)
 {
-  if (peer->fd < 0)
+  if (peer->fd_local < 0)
     {
       zlog_err ("bgp_connect_success peer's fd is negative value %d",
-               peer->fd);
+                peer->fd_local);
       return -1;
     }
-  BGP_READ_ON (peer->t_read, bgp_read, peer->fd);
+  BGP_READ_ON (peer->t_read, bgp_read, peer->fd_local);
 
   /* bgp_getsockname (peer); */
 
@@ -521,29 +532,29 @@ bgp_start (struct peer *peer)
     {
     case connect_error:
       if (BGP_DEBUG (fsm, FSM))
-       plog_info (peer->log, "%s [FSM] Connect error", peer->host);
+        plog_info (peer->log, "%s [FSM] Connect error", peer->host);
       BGP_EVENT_ADD (peer, TCP_connection_open_failed);
       break;
     case connect_success:
       if (BGP_DEBUG (fsm, FSM))
-       plog_info (peer->log, "%s [FSM] Connect immediately success",
-                  peer->host);
+        plog_info (peer->log, "%s [FSM] Connect immediately success",
+                   peer->host);
       BGP_EVENT_ADD (peer, TCP_connection_open);
       break;
     case connect_in_progress:
       /* To check nonblocking connect, we wait until socket is
          readable or writable. */
       if (BGP_DEBUG (fsm, FSM))
-       plog_info (peer->log, "%s [FSM] Non blocking connect waiting result",
-                  peer->host);
-      if (peer->fd < 0)
+        plog_info (peer->log, "%s [FSM] Non blocking connect waiting result",
+                   peer->host);
+      if (*peer->fd < 0)
        {
          zlog_err ("bgp_start peer's fd is negative value %d",
-                   peer->fd);
+                   *peer->fd);
          return -1;
        }
-      BGP_READ_ON (peer->t_read, bgp_read, peer->fd);
-      BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
+      BGP_READ_ON (peer->t_read, bgp_read, *peer->fd);
+      BGP_WRITE_ON (peer->t_write, bgp_write, *peer->fd);
       break;
     }
   return 0;
index aa369bc1639d8525d577ace1e790af92d42d10ee..e03831d0de179e8ac4201cac4019ee156abea667 100644 (file)
@@ -46,7 +46,6 @@ bgp_accept (struct thread *thread)
   int accept_sock;
   union sockunion su;
   struct peer *peer;
-  struct peer *peer1;
   struct bgp *bgp;
   char buf[SU_ADDRSTRLEN];
 
@@ -73,12 +72,12 @@ bgp_accept (struct thread *thread)
     zlog_info ("[Event] BGP connection from host %s", inet_sutop (&su, buf));
   
   /* Check remote IP address */
-  peer1 = peer_lookup (bgp, &su);
-  if (! peer1 || peer1->status == Idle)
+  peer = peer_lookup (bgp, &su);
+  if (! peer || peer->status == Idle)
     {
       if (BGP_DEBUG (events, EVENTS))
        {
-         if (! peer1)
+         if (! peer)
            zlog_info ("[Event] BGP connection IP address %s is not configured",
                       inet_sutop (&su, buf));
          else
@@ -90,30 +89,13 @@ bgp_accept (struct thread *thread)
     }
 
   /* In case of peer is EBGP, we should set TTL for this connection.  */
-  if (peer_sort (peer1) == BGP_PEER_EBGP)
-    sockopt_ttl (peer1->su.sa.sa_family, bgp_sock, peer1->ttl);
+  if (peer_sort (peer) == BGP_PEER_EBGP)
+    sockopt_ttl (peer->su.sa.sa_family, bgp_sock, peer->ttl);
 
   if (! bgp)
-    bgp = peer1->bgp;
-
-  /* Make dummy peer until read Open packet. */
-  if (BGP_DEBUG (events, EVENTS))
-    zlog_info ("[Event] Make dummy peer structure until read Open packet");
-
-  {
-    char buf[SU_ADDRSTRLEN + 1];
-
-    peer = peer_create_accept (bgp);
-    SET_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER);
-    peer->su = su;
-    peer->fd = bgp_sock;
-    peer->status = Active;
-    peer->local_id = peer1->local_id;
+    bgp = peer->bgp;
 
-    /* Make peer's address string. */
-    sockunion2str (&su, buf, SU_ADDRSTRLEN);
-    peer->host = strdup (buf);
-  }
+  peer->fd_accept = bgp_sock;
 
   BGP_EVENT_ADD (peer, TCP_connection_open);
 
@@ -133,7 +115,7 @@ bgp_bind (struct peer *peer)
 
   strncpy ((char *)&ifreq.ifr_name, peer->ifname, sizeof (ifreq.ifr_name));
 
-  ret = setsockopt (peer->fd, SOL_SOCKET, SO_BINDTODEVICE, 
+  ret = setsockopt (*peer->fd, SOL_SOCKET, SO_BINDTODEVICE, 
                    &ifreq, sizeof (ifreq));
   if (ret < 0)
     {
@@ -207,12 +189,12 @@ bgp_update_source (struct peer *peer)
       if (! addr)
        return;
 
-      bgp_bind_address (peer->fd, addr);
+      bgp_bind_address (*peer->fd, addr);
     }
 
   /* Source is specified with IP address.  */
   if (peer->update_source)
-    sockunion_bind (peer->fd, peer->update_source, 0, peer->update_source);
+    sockunion_bind (*peer->fd, peer->update_source, 0, peer->update_source);
 }
 
 /* BGP try to connect to the peer.  */
@@ -222,16 +204,16 @@ bgp_connect (struct peer *peer)
   unsigned int ifindex = 0;
 
   /* Make socket for the peer. */
-  peer->fd = sockunion_socket (&peer->su);
-  if (peer->fd < 0)
+  *peer->fd = sockunion_socket (&peer->su);
+  if (*peer->fd < 0)
     return -1;
 
   /* If we can get socket for the peer, adjest TTL and make connection. */
   if (peer_sort (peer) == BGP_PEER_EBGP)
-    sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl);
+    sockopt_ttl (peer->su.sa.sa_family, *peer->fd, peer->ttl);
 
-  sockopt_reuseaddr (peer->fd);
-  sockopt_reuseport (peer->fd);
+  sockopt_reuseaddr (*peer->fd);
+  sockopt_reuseport (*peer->fd);
 
   /* Bind socket. */
   bgp_bind (peer);
@@ -246,10 +228,10 @@ bgp_connect (struct peer *peer)
 
   if (BGP_DEBUG (events, EVENTS))
     plog_info (peer->log, "%s [Event] Connect start to %s fd %d",
-              peer->host, peer->host, peer->fd);
+              peer->host, peer->host, *peer->fd);
 
   /* Connect to the remote peer. */
-  return sockunion_connect (peer->fd, &peer->su, htons (peer->port), ifindex);
+  return sockunion_connect (*peer->fd, &peer->su, htons (peer->port), ifindex);
 }
 
 /* After TCP connection is established.  Get local address and port. */
@@ -268,8 +250,8 @@ bgp_getsockname (struct peer *peer)
       peer->su_remote = NULL;
     }
 
-  peer->su_local = sockunion_getsockname (peer->fd);
-  peer->su_remote = sockunion_getpeername (peer->fd);
+  peer->su_local = sockunion_getsockname (*peer->fd);
+  peer->su_remote = sockunion_getpeername (*peer->fd);
 
   bgp_nexthop_set (peer->su_local, peer->su_remote, &peer->nexthop, peer);
 }
index 48879f35a523156a829845db5f63e890c9dc9ff9..7d921bed80a6d8ad1c839ea298ca626baa28ff70 100644 (file)
@@ -133,7 +133,7 @@ bgp_connect_check (struct peer *peer)
 
   /* Check file descriptor. */
   slen = sizeof (status);
-  ret = getsockopt(peer->fd, SOL_SOCKET, SO_ERROR, (void *) &status, &slen);
+  ret = getsockopt(*peer->fd, SOL_SOCKET, SO_ERROR, (void *) &status, &slen);
 
   /* If getsockopt is fail, this is fatal error. */
   if (ret < 0)
@@ -238,7 +238,6 @@ bgp_update_packet (struct peer *peer, afi_t afi, safi_t safi)
       bgp_packet_set_size (s);
       packet = bgp_packet_dup (s);
       bgp_packet_add (peer, packet);
-      BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
       stream_reset (s);
       return packet;
     }
@@ -395,7 +394,7 @@ bgp_default_update_send (struct peer *peer, struct attr *attr,
   /* Add packet to the peer. */
   bgp_packet_add (peer, packet);
 
-  BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
+  BGP_WRITE_ON (peer->t_write, bgp_write, *peer->fd);
 }
 
 void
@@ -469,7 +468,7 @@ bgp_default_withdraw_send (struct peer *peer, afi_t afi, safi_t safi)
   /* Add packet to the peer. */
   bgp_packet_add (peer, packet);
 
-  BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
+  BGP_WRITE_ON (peer->t_write, bgp_write, *peer->fd);
 }
 
 /* Get next packet to be written.  */
@@ -575,7 +574,7 @@ bgp_write (struct thread *thread)
       writenum = stream_get_endp (s) - stream_get_getp (s);
 
       /* Call write() system call.  */
-      num = write (peer->fd, STREAM_PNT (s), writenum);
+      num = write (*peer->fd, STREAM_PNT (s), writenum);
       write_errno = errno;
       if (num <= 0)
        {
@@ -645,7 +644,7 @@ bgp_write (struct thread *thread)
     }
   
   if (bgp_write_proceed (peer))
-    BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
+    BGP_WRITE_ON (peer->t_write, bgp_write, *peer->fd);
   
   return 0;
 }
@@ -665,7 +664,7 @@ bgp_write_notify (struct peer *peer)
   assert (stream_get_endp (s) >= BGP_HEADER_SIZE);
 
   /* I'm not sure fd is writable. */
-  ret = writen (peer->fd, STREAM_DATA (s), stream_get_endp (s));
+  ret = writen (*peer->fd, STREAM_DATA (s), stream_get_endp (s));
   if (ret <= 0)
     {
       bgp_stop (peer);
@@ -725,7 +724,7 @@ bgp_keepalive_send (struct peer *peer)
   /* Add packet to the peer. */
   bgp_packet_add (peer, s);
 
-  BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
+  BGP_WRITE_ON (peer->t_write, bgp_write, *peer->fd);
 }
 
 /* Make open packet and send it to the peer. */
@@ -780,7 +779,7 @@ bgp_open_send (struct peer *peer)
   /* Add packet to the peer. */
   bgp_packet_add (peer, s);
 
-  BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
+  BGP_WRITE_ON (peer->t_write, bgp_write, *peer->fd);
 }
 
 /* Send BGP notify packet with data potion. */
@@ -981,7 +980,7 @@ bgp_route_refresh_send (struct peer *peer, afi_t afi, safi_t safi,
   /* Add packet to the peer. */
   bgp_packet_add (peer, packet);
 
-  BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
+  BGP_WRITE_ON (peer->t_write, bgp_write, *peer->fd);
 }
 
 /* Send capability message to the peer. */
@@ -1048,14 +1047,13 @@ bgp_capability_send (struct peer *peer, afi_t afi, safi_t safi,
     zlog_info ("%s send message type %d, length (incl. header) %d",
               peer->host, BGP_MSG_CAPABILITY, length);
 
-  BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
+  BGP_WRITE_ON (peer->t_write, bgp_write, *peer->fd);
 }
 \f
 /* RFC1771 6.8 Connection collision detection. */
 int
-bgp_collision_detect (struct peer *new, struct in_addr remote_id)
+bgp_collision_detect (struct peer *peer, struct in_addr remote_id)
 {
-  struct peer *peer;
   struct listnode *nn;
   struct bgp *bgp;
 
@@ -1076,11 +1074,10 @@ bgp_collision_detect (struct peer *new, struct in_addr remote_id)
     {
       /* Under OpenConfirm status, local peer structure already hold
          remote router ID. */
-
-      if (peer != new
-         && (peer->status == OpenConfirm || peer->status == OpenSent)
-         && sockunion_same (&peer->su, &new->su))
-       {
+      if ((peer->status == OpenConfirm)
+          && ( ntohl(peer->remote_id.s_addr) == ntohl(remote_id.s_addr) )
+         )
+        {
          /* 1. The BGP Identifier of the local system is compared to
             the BGP Identifier of the remote system (as specified in
             the OPEN message). */
@@ -1093,8 +1090,16 @@ bgp_collision_detect (struct peer *new, struct in_addr remote_id)
                 already in the OpenConfirm state), and accepts BGP
                 connection initiated by the remote system. */
 
-             if (peer->fd >= 0)
-               bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
+             if (peer->fd_local >= 0)
+               {
+                 BGP_WRITE_OFF (peer->t_write);
+                 BGP_READ_OFF (peer->t_read);
+                 close (peer->fd_local);
+               }
+             peer->fd_local = -1;
+             peer->fd = &peer->fd_accept;
+
+             BGP_READ_ON (peer->t_read, bgp_read, *peer->fd);
              return 1;
            }
          else
@@ -1105,12 +1110,15 @@ bgp_collision_detect (struct peer *new, struct in_addr remote_id)
                 existing one (the one that is already in the
                 OpenConfirm state). */
 
-             if (new->fd >= 0)
-               bgp_notify_send (new, BGP_NOTIFY_CEASE, 0);
+             if (peer->fd_accept >= 0)
+               {
+                 close (peer->fd_accept);
+                 peer->fd_accept = -1;
+               }    
              return -1;
            }
-       }
-    }
+         }
+    }    
   return 0;
 }
 
@@ -1187,51 +1195,6 @@ bgp_open_receive (struct peer *peer, bgp_size_t size)
   if (ret < 0)
     return ret;
 
-  /* Hack part. */
-  if (CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
-    {
-      if (ret == 0 && realpeer->status != Active
-         && realpeer->status != OpenSent
-         && realpeer->status != OpenConfirm)
-       {
-         if (BGP_DEBUG (events, EVENTS))
-           zlog_info ("%s [Event] peer's status is %s close connection",
-                      realpeer->host, LOOKUP (bgp_status_msg, peer->status));
-         return -1;
-       }
-
-      if (BGP_DEBUG (events, EVENTS))
-       zlog_info ("%s [Event] Transfer temporary BGP peer to existing one",
-                  peer->host);
-
-      bgp_stop (realpeer);
-      
-      /* Transfer file descriptor. */
-      realpeer->fd = peer->fd;
-      peer->fd = -1;
-
-      /* Transfer input buffer. */
-      stream_free (realpeer->ibuf);
-      realpeer->ibuf = peer->ibuf;
-      realpeer->packet_size = peer->packet_size;
-      peer->ibuf = NULL;
-
-      /* Transfer status. */
-      realpeer->status = peer->status;
-      bgp_stop (peer);
-
-      /* peer pointer change. Open packet send to neighbor. */
-      peer = realpeer;
-      bgp_open_send (peer);
-      if (peer->fd < 0)
-       {
-         zlog_err ("bgp_open_receive peer's fd is negative value %d",
-                   peer->fd);
-         return -1;
-       }
-      BGP_READ_ON (peer->t_read, bgp_read, peer->fd);
-    }
-
   /* remote router-id check. */
   if (remote_id.s_addr == 0
       || ntohl (remote_id.s_addr) >= 0xe0000000
@@ -2031,7 +1994,7 @@ bgp_read_packet (struct peer *peer)
     return 0;
 
   /* Read packet from fd. */
-  nbytes = stream_read_unblock (peer->ibuf, peer->fd, readsize);
+  nbytes = stream_read_unblock (peer->ibuf, *peer->fd, readsize);
 
   /* If read byte is smaller than zero then error occured. */
   if (nbytes < 0) 
@@ -2050,7 +2013,7 @@ bgp_read_packet (struct peer *peer)
     {
       if (BGP_DEBUG (events, EVENTS))
        plog_info (peer->log, "%s [Event] BGP connection closed fd %d",
-                  peer->host, peer->fd);
+                  peer->host, *peer->fd);
       BGP_EVENT_ADD (peer, TCP_connection_closed);
       return -1;
     }
@@ -2097,12 +2060,12 @@ bgp_read (struct thread *thread)
     }
   else
     {
-      if (peer->fd < 0)
+      if (*peer->fd < 0)
        {
-         zlog_err ("bgp_read peer's fd is negative value %d", peer->fd);
+         zlog_err ("bgp_read peer's fd is negative value %d", *peer->fd);
          return -1;
        }
-      BGP_READ_ON (peer->t_read, bgp_read, peer->fd);
+      BGP_READ_ON (peer->t_read, bgp_read, *peer->fd);
     }
 
   /* Read packet header to determine type of the packet */
index f6f0879a8fb69c07d49e2b974b286da944339bff..1d7a05241c438f27747b7a2bd6c82918d891afe0 100644 (file)
@@ -4202,7 +4202,8 @@ route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p,
            vty_out (vty, " (inaccessible)"); 
          else if (binfo->igpmetric)
            vty_out (vty, " (metric %d)", binfo->igpmetric);
-         vty_out (vty, " from %s", sockunion2str (&binfo->peer->su, buf, SU_ADDRSTRLEN));
+         vty_out (vty, " from %s", 
+                  sockunion2str (&binfo->peer->su, buf, SU_ADDRSTRLEN));
          if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
            vty_out (vty, " (%s)", inet_ntoa (attr->originator_id));
          else
index 3a12a27c62dd305a04abada6d97a7a272f95707b..f4c8f762fb43f5a82dd9be5da0b835c4f8f0185c 100644 (file)
@@ -504,11 +504,10 @@ bgp_default_local_preference_unset (struct bgp *bgp)
   return 0;
 }
 \f
-/* 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
@@ -684,8 +683,11 @@ peer_new ()
   peer = XMALLOC (MTYPE_BGP_PEER, sizeof (struct peer));
   memset (peer, 0, sizeof (struct peer));
 
+  peer->fd = &peer->fd_local;
+
   /* Set default value. */
-  peer->fd = -1;
+  peer->fd_local = -1;
+  peer->fd_accept = -1;
   peer->v_start = BGP_INIT_START_TIMER;
   peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
   peer->v_asorig = BGP_DEFAULT_ASORIGINATE;
@@ -769,19 +771,6 @@ peer_create (union sockunion *su, struct bgp *bgp, as_t local_as,
   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)
@@ -1810,9 +1799,8 @@ peer_lookup (struct bgp *bgp, union sockunion *su)
   
   LIST_LOOP (bgp->peer, peer, nn)
     {
-      if (sockunion_same (&peer->su, su)
-         && ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
-       return peer;
+      if (sockunion_same (&peer->su, su))
+        return peer;
     }
   return NULL;
 }
@@ -1831,27 +1819,25 @@ peer_lookup_with_open (union sockunion *su, as_t remote_as,
 
   LIST_LOOP (bgp->peer, peer, nn)
     {
-      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;
-       }
+      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;
+        }
     }
   LIST_LOOP (bgp->peer, peer, nn)
     {
-      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;
-       }
+      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;
+        }
     }
   return NULL;
 }
@@ -2278,22 +2264,24 @@ peer_ebgp_multihop_set (struct peer *peer, int ttl)
 
   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;
 }
@@ -2314,22 +2302,24 @@ peer_ebgp_multihop_unset (struct peer *peer)
 
   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;
-
-         peer->ttl = 1;
-         
-         if (peer->fd >= 0)
-           sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl);
-       }
+        {
+          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);
+        }
     }
   return 0;
 }
index 498bd07235a935a30a43ccf2731141ab06236b06..a8bfa52f54187a1bc011367b3c99be5e057e3406 100644 (file)
@@ -256,27 +256,29 @@ struct peer
   int ostatus;
 
   /* Peer information */
-  int fd;                      /* File descriptor */
-  int ttl;                     /* TTL of TCP connection to the peer. */
-  char *desc;                  /* Description of the peer. */
-  unsigned short port;          /* Destination port for peer */
-  char *host;                  /* Printable address of the peer. */
-  union sockunion su;          /* Sockunion address of the peer. */
-  time_t uptime;               /* Last Up/Down time */
-  time_t readtime;             /* Last read time */
-  time_t resettime;            /* Last reset time */
+  int *fd;                        /* connection in use: -> local||accept */
+  int ttl;                        /* TTL of TCP connection to the peer. */
+  int fd_local;                   /* locally initiated connection */
+  int fd_accept;                  /* remote initiated/accepted connection */
+  char *desc;                     /* Description of the peer. */
+  unsigned short port;            /* Destination port for peer */
+  char *host;                     /* Printable address of the peer. */
+  union sockunion su;             /* Sockunion address of the peer. */
+  time_t uptime;                  /* Last Up/Down time */
+  time_t readtime;                /* Last read time */
+  time_t resettime;               /* Last reset time */
   
-  unsigned int ifindex;                /* ifindex of the BGP connection. */
-  char *ifname;                        /* bind interface name. */
-  char *update_if;
-  union sockunion *update_source;
-  struct zlog *log;
-  u_char version;              /* Peer BGP version. */
-
-  union sockunion *su_local;   /* Sockunion of local address.  */
-  union sockunion *su_remote;  /* Sockunion of remote address.  */
-  int shared_network;          /* Is this peer shared same network. */
-  struct bgp_nexthop nexthop;  /* Nexthop */
+  unsigned int ifindex;           /* ifindex of the BGP connection. */
+  char *ifname;                   /* bind interface name. */
+  char *update_if;                /* interface to send from */
+  union sockunion *update_source; /* sockunion to send from */
+  struct zlog *log;               /* log socket */
+  u_char version;                 /* Peer BGP version. */
+
+  union sockunion *su_local;      /* Sockunion of local address.  */
+  union sockunion *su_remote;     /* Sockunion of remote address.  */
+  int shared_network;             /* Is this peer shared same network. */
+  struct bgp_nexthop nexthop;     /* Nexthop */
 
   /* Peer address family configuration. */
   u_char afc[AFI_MAX][SAFI_MAX];