summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeonid Rosenboim <Leonid.Rosenboim@windriver.com>2012-12-14 19:12:17 +0000
committerDavid Lamparter <equinox@opensourcerouting.org>2013-01-16 01:45:57 +0100
commit86998bc2bc9506841250c8d49dd2df2464660a18 (patch)
tree1f6796236e69496f3db2bfd32eb2d43c6bfb1a37
parenta6694fe8a89b957216f548938cc31602df04d495 (diff)
bgpd: uncork/nagle socket when sending BGP NOTIFY
This pushes out the NOTIFY message before closing a connection. Previously, the TCP_CORK bandwidth optimization code caused NOTIFY messages to disappear prior to when the connection is closed. * bgpd/bgp_packet.c: unset CORK, set NODELAY, and replace writen() by more correct write() Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
-rw-r--r--bgpd/bgp_packet.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c
index b0918fc5..d115353f 100644
--- a/bgpd/bgp_packet.c
+++ b/bgpd/bgp_packet.c
@@ -723,13 +723,21 @@ bgp_write_notify (struct peer *peer)
val = fcntl (peer->fd, F_GETFL, 0);
fcntl (peer->fd, F_SETFL, val & ~O_NONBLOCK);
- ret = writen (peer->fd, STREAM_DATA (s), stream_get_endp (s));
+ /* Stop collecting data within the socket */
+ sockopt_cork (peer->fd, 0);
+
+ ret = write (peer->fd, STREAM_DATA (s), stream_get_endp (s));
if (ret <= 0)
{
BGP_EVENT_ADD (peer, TCP_fatal_error);
return 0;
}
+ /* Disable Nagle, make NOTIFY packet go out right away */
+ val = 1;
+ (void) setsockopt (peer->fd, IPPROTO_TCP, TCP_NODELAY,
+ (char *) &val, sizeof (val));
+
/* Retrieve BGP packet type. */
stream_set_getp (s, BGP_MARKER_SIZE + 2);
type = stream_getc (s);