]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Add ability to set tcp socket buffer size
authorDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 4 Oct 2019 18:33:01 +0000 (14:33 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 16 Oct 2019 11:42:05 +0000 (07:42 -0400)
Add -s X or --socket_size X to the bgp cli to allow
the end user to specify the outgoing bgp tcp kernel
socket buffer size.

It is recommended that this option is only used on
large scale operations.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
bgpd/bgp_main.c
bgpd/bgp_network.c
bgpd/bgpd.c
bgpd/bgpd.h
tests/bgpd/test_aspath.c
tests/bgpd/test_capability.c
tests/bgpd/test_mp_attr.c
tests/bgpd/test_mpath.c
tests/bgpd/test_packet.c
tests/bgpd/test_peer_attr.c

index ef73b47ffb9407336403e32722bead0765e9e935..6b91a2cf1f1609cb2bc26178fbceb1dae161d123 100644 (file)
@@ -75,6 +75,7 @@ static const struct option longopts[] = {
        {"ecmp", required_argument, NULL, 'e'},
        {"int_num", required_argument, NULL, 'I'},
        {"no_zebra", no_argument, NULL, 'Z'},
+       {"socket_size", required_argument, NULL, 's'},
        {0}};
 
 /* signal definitions */
@@ -386,17 +387,19 @@ int main(int argc, char **argv)
        int no_zebra_flag = 0;
        int skip_runas = 0;
        int instance = 0;
+       int buffer_size = BGP_SOCKET_SNDBUF_SIZE;
 
        frr_preinit(&bgpd_di, argc, argv);
        frr_opt_add(
-               "p:l:SnZe:I:" DEPRECATED_OPTIONS, longopts,
+               "p:l:SnZe:I:s:" DEPRECATED_OPTIONS, longopts,
                "  -p, --bgp_port     Set BGP listen port number (0 means do not listen).\n"
                "  -l, --listenon     Listen on specified address (implies -n)\n"
                "  -n, --no_kernel    Do not install route to kernel.\n"
                "  -Z, --no_zebra     Do not communicate with Zebra.\n"
                "  -S, --skip_runas   Skip capabilities checks, and changing user and group IDs.\n"
                "  -e, --ecmp         Specify ECMP to use.\n"
-               "  -I, --int_num      Set instance number (label-manager)\n");
+               "  -I, --int_num      Set instance number (label-manager)\n"
+               "  -s, --socket_size  Set BGP peer socket send buffer size\n");
 
        /* Command line argument treatment. */
        while (1) {
@@ -452,6 +455,9 @@ int main(int argc, char **argv)
                                zlog_err("Instance %i out of range (0..%u)",
                                         instance, (unsigned short)-1);
                        break;
+               case 's':
+                       buffer_size = atoi(optarg);
+                       break;
                default:
                        frr_help_exit(1);
                        break;
@@ -461,7 +467,7 @@ int main(int argc, char **argv)
                memset(&bgpd_privs, 0, sizeof(bgpd_privs));
 
        /* BGP master init. */
-       bgp_master_init(frr_init());
+       bgp_master_init(frr_init(), buffer_size);
        bm->port = bgp_port;
        if (bgp_port == 0)
                bgp_option_set(BGP_OPT_NO_LISTEN);
index 1394c60b25391152870bab2febe5f077a450e36c..4031d2dfde40301a67315ce252f310b7f7d63a08 100644 (file)
@@ -320,6 +320,14 @@ static int bgp_get_instance_for_inc_conn(int sock, struct bgp **bgp_inst)
 #endif
 }
 
+static void bgp_socket_set_buffer_size(const int fd)
+{
+       if (getsockopt_so_sendbuf(fd) < (int)bm->socket_buffer)
+               setsockopt_so_sendbuf(fd, bm->socket_buffer);
+       if (getsockopt_so_recvbuf(fd) < (int)bm->socket_buffer)
+               setsockopt_so_recvbuf(fd, bm->socket_buffer);
+}
+
 /* Accept bgp connection. */
 static int bgp_accept(struct thread *thread)
 {
@@ -371,8 +379,7 @@ static int bgp_accept(struct thread *thread)
                return -1;
        }
 
-       /* Set socket send buffer size */
-       setsockopt_so_sendbuf(bgp_sock, BGP_SOCKET_SNDBUF_SIZE);
+       bgp_socket_set_buffer_size(bgp_sock);
 
        /* Check remote IP address */
        peer1 = peer_lookup(bgp, &su);
@@ -621,8 +628,7 @@ int bgp_connect(struct peer *peer)
 
        set_nonblocking(peer->fd);
 
-       /* Set socket send buffer size */
-       setsockopt_so_sendbuf(peer->fd, BGP_SOCKET_SNDBUF_SIZE);
+       bgp_socket_set_buffer_size(peer->fd);
 
        if (bgp_set_socket_ttl(peer, peer->fd) < 0)
                return -1;
index 9c0e25bf25125229f4cab97c1c2975e70804d8d6..49f7337d7653c1d0dd3ba851d728a8f5b65e8fb3 100644 (file)
@@ -7823,7 +7823,7 @@ int bgp_config_write(struct vty *vty)
        return 0;
 }
 
-void bgp_master_init(struct thread_master *master)
+void bgp_master_init(struct thread_master *master, const int buffer_size)
 {
        qobj_init();
 
@@ -7838,6 +7838,7 @@ void bgp_master_init(struct thread_master *master)
        bm->t_rmap_update = NULL;
        bm->rmap_update_timer = RMAP_DEFAULT_UPDATE_TIMER;
        bm->terminating = false;
+       bm->socket_buffer = buffer_size;
 
        bgp_process_queue_init();
 
index 9b0346da12b325a8523977d566df0aaf91d66df2..87d94500f792f10a0e4263c1bbbfd0e8b233670d 100644 (file)
@@ -156,6 +156,9 @@ struct bgp_master {
        /* BGP-EVPN VRF ID. Defaults to default VRF (if any) */
        struct bgp* bgp_evpn;
 
+       /* How big should we set the socket buffer size */
+       uint32_t socket_buffer;
+
        bool terminating;       /* global flag that sigint terminate seen */
        QOBJ_FIELDS
 };
@@ -1575,7 +1578,8 @@ extern char *peer_uptime(time_t uptime2, char *buf, size_t len, bool use_json,
 
 extern int bgp_config_write(struct vty *);
 
-extern void bgp_master_init(struct thread_master *master);
+extern void bgp_master_init(struct thread_master *master,
+                           const int buffer_size);
 
 extern void bgp_init(unsigned short instance);
 extern void bgp_pthreads_run(void);
index b5db36703a58f75d15e6ebaf6d7f03d3d1b089af..925d3112d35f9962beea3df6c308b138b426ae2c 100644 (file)
@@ -1339,7 +1339,7 @@ int main(void)
 {
        int i = 0;
        qobj_init();
-       bgp_master_init(thread_master_create(NULL));
+       bgp_master_init(thread_master_create(NULL), BGP_SOCKET_SNDBUF_SIZE);
        master = bm->master;
        bgp_option_set(BGP_OPT_NO_LISTEN);
        bgp_attr_init();
index db1cf0611d4eeb117fe6e14e9db7b954c30ecafd..96e398512b75d556bdd2650a9f43c74babd8f0d7 100644 (file)
@@ -912,7 +912,7 @@ int main(void)
 
        qobj_init();
        master = thread_master_create(NULL);
-       bgp_master_init(master);
+       bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE);
        vrf_init(NULL, NULL, NULL, NULL, NULL);
        bgp_option_set(BGP_OPT_NO_LISTEN);
 
index 603b678cf17621b311327941cad84441489cc798..fbf2a9fed28be457202c858d92f49e40d0beac1a 100644 (file)
@@ -37,6 +37,7 @@
 #include "bgpd/bgp_mplsvpn.h"
 #include "bgpd/bgp_nexthop.h"
 #include "bgpd/bgp_vty.h"
+#include "bgpd/bgp_network.h"
 
 #define VT100_RESET "\x1b[0m"
 #define VT100_RED "\x1b[31m"
@@ -1078,7 +1079,7 @@ int main(void)
        cmd_init(0);
        bgp_vty_init();
        master = thread_master_create("test mp attr");
-       bgp_master_init(master);
+       bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE);
        vrf_init(NULL, NULL, NULL, NULL, NULL);
        bgp_option_set(BGP_OPT_NO_LISTEN);
        bgp_attr_init();
index 0ecd0fdfec75f0df2674688de65d9c2386a97371..21f4b38773c3f4d163c53a448250516f667f8229 100644 (file)
@@ -38,6 +38,7 @@
 #include "bgpd/bgp_nexthop.h"
 #include "bgpd/bgp_mpath.h"
 #include "bgpd/bgp_evpn.h"
+#include "bgpd/bgp_network.h"
 
 #define VT100_RESET "\x1b[0m"
 #define VT100_RED "\x1b[31m"
@@ -379,7 +380,7 @@ static int global_test_init(void)
        qobj_init();
        master = thread_master_create(NULL);
        zclient = zclient_new(master, &zclient_options_default);
-       bgp_master_init(master);
+       bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE);
        vrf_init(NULL, NULL, NULL, NULL, NULL);
        bgp_option_set(BGP_OPT_NO_LISTEN);
 
index 9719aceec99b01e29823a5506894cee69baf28db..7a038fb02e31dd9af6bce2ca89a5e7099b51a1df 100644 (file)
@@ -34,6 +34,7 @@
 #include "bgpd/bgp_debug.h"
 #include "bgpd/bgp_packet.h"
 #include "bgpd/bgp_aspath.h"
+#include "bgpd/bgp_network.h"
 
 /* need these to link in libbgp */
 struct zebra_privs_t *bgpd_privs = NULL;
@@ -58,7 +59,7 @@ int main(int argc, char *argv[])
        qobj_init();
        bgp_attr_init();
        master = thread_master_create(NULL);
-       bgp_master_init(master);
+       bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE);
        vrf_init(NULL, NULL, NULL, NULL, NULL);
        bgp_option_set(BGP_OPT_NO_LISTEN);
 
index e5d3030ed1e0565b1b48fb1bad4fbabd784f768c..422d397479f10dbb4bb90b2e5183de66aab5553a 100644 (file)
@@ -29,6 +29,7 @@
 #include "bgpd/bgp_route.h"
 #include "bgpd/bgp_vty.h"
 #include "bgpd/bgp_zebra.h"
+#include "bgpd/bgp_network.h"
 
 #ifdef ENABLE_BGP_VNC
 #include "bgpd/rfapi/rfapi_backend.h"
@@ -1388,7 +1389,7 @@ static void bgp_startup(void)
        master = thread_master_create(NULL);
        yang_init();
        nb_init(master, NULL, 0);
-       bgp_master_init(master);
+       bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE);
        bgp_option_set(BGP_OPT_NO_LISTEN);
        vrf_init(NULL, NULL, NULL, NULL, NULL);
        frr_pthread_init();