summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_network.c30
-rw-r--r--bgpd/bgp_network.h2
2 files changed, 31 insertions, 1 deletions
diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c
index bcaaba75..d86db3c8 100644
--- a/bgpd/bgp_network.c
+++ b/bgpd/bgp_network.c
@@ -122,7 +122,29 @@ bgp_md5_set (struct peer *peer)
return ret;
}
-
+
+/* Update BGP socket send buffer size */
+static void
+bgp_update_sock_send_buffer_size (int fd)
+{
+ int size = BGP_SOCKET_SNDBUF_SIZE;
+ int optval;
+ socklen_t optlen = sizeof(optval);
+
+ if (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &optval, &optlen) < 0)
+ {
+ zlog_err("getsockopt of SO_SNDBUF failed %s\n", safe_strerror(errno));
+ return;
+ }
+ if (optval < size)
+ {
+ if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size)) < 0)
+ {
+ zlog_err("Couldn't increase send buffer: %s\n", safe_strerror(errno));
+ }
+ }
+}
+
/* Accept bgp connection. */
static int
bgp_accept (struct thread *thread)
@@ -153,6 +175,9 @@ bgp_accept (struct thread *thread)
}
set_nonblocking (bgp_sock);
+ /* Set socket send buffer size */
+ bgp_update_sock_send_buffer_size(bgp_sock);
+
if (BGP_DEBUG (events, EVENTS))
zlog_debug ("[Event] BGP connection from host %s", inet_sutop (&su, buf));
@@ -308,6 +333,9 @@ bgp_connect (struct peer *peer)
set_nonblocking (peer->fd);
+ /* Set socket send buffer size */
+ bgp_update_sock_send_buffer_size(peer->fd);
+
/* If we can get socket for the peer, adjest TTL and make connection. */
if (peer->sort == BGP_PEER_EBGP) {
sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl);
diff --git a/bgpd/bgp_network.h b/bgpd/bgp_network.h
index 5bf2e5ff..12768430 100644
--- a/bgpd/bgp_network.h
+++ b/bgpd/bgp_network.h
@@ -21,6 +21,8 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
#ifndef _QUAGGA_BGP_NETWORK_H
#define _QUAGGA_BGP_NETWORK_H
+#define BGP_SOCKET_SNDBUF_SIZE 65536
+
extern int bgp_socket (unsigned short, const char *);
extern void bgp_close (void);
extern int bgp_connect (struct peer *);