diff options
author | Stephen Hemminger <shemminger@vyatta.com> | 2010-01-13 00:32:41 +0000 |
---|---|---|
committer | David Lamparter <equinox@diac24.net> | 2010-02-03 01:53:43 +0100 |
commit | 80c65113c118723a6cc964cc30d2a6111b8b40d0 (patch) | |
tree | 1f772ae64553bd2187d13798ab2206821bdafecb /bgpd | |
parent | 997f7268f2940e56ed47e353c6872ca53be6efad (diff) | |
download | quagga-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.c | 2 | ||||
-rw-r--r-- | bgpd/bgp_packet.c | 21 |
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; |