summaryrefslogtreecommitdiffstats
path: root/bgpd
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@vyatta.com>2010-01-13 00:32:41 +0000
committerDavid Lamparter <equinox@diac24.net>2010-02-03 01:53:43 +0100
commit80c65113c118723a6cc964cc30d2a6111b8b40d0 (patch)
tree1f772ae64553bd2187d13798ab2206821bdafecb /bgpd
parent997f7268f2940e56ed47e353c6872ca53be6efad (diff)
downloadquagga-80c65113c118723a6cc964cc30d2a6111b8b40d0.tar.bz2
quagga-80c65113c118723a6cc964cc30d2a6111b8b40d0.tar.xz
BGP: only use write event for non-blocking connect
According to Steven's and other unix network programming books, only write select is needed when doing non-blocking connect. Doing this simplifies the receive path, it also gets rid of some possible races when when a TCP simultaneous connect happens.
Diffstat (limited to 'bgpd')
-rw-r--r--bgpd/bgp_fsm.c2
-rw-r--r--bgpd/bgp_packet.c21
2 files changed, 7 insertions, 16 deletions
diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c
index 487ebddb..e18fc8cd 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -704,7 +704,7 @@ bgp_start (struct peer *peer)
peer->fd);
return -1;
}
- BGP_READ_ON (peer->t_read, bgp_read, peer->fd);
+
BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
break;
}
diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c
index aa0f9c50..dc23809a 100644
--- a/bgpd/bgp_packet.c
+++ b/bgpd/bgp_packet.c
@@ -107,8 +107,7 @@ bgp_connect_check (struct peer *peer)
socklen_t slen;
int ret;
- /* Anyway I have to reset read and write thread. */
- BGP_READ_OFF (peer->t_read);
+ /* Anyway I have to reset write thread. */
BGP_WRITE_OFF (peer->t_write);
/* Check file descriptor. */
@@ -2312,22 +2311,14 @@ bgp_read (struct thread *thread)
peer = THREAD_ARG (thread);
peer->t_read = NULL;
- /* For non-blocking IO check. */
- if (peer->status == Connect)
+ if (peer->fd < 0)
{
- bgp_connect_check (peer);
- goto done;
- }
- else
- {
- if (peer->fd < 0)
- {
- 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);
+ 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);
+
/* Read packet header to determine type of the packet */
if (peer->packet_size == 0)
peer->packet_size = BGP_HEADER_SIZE;