diff options
| author | David Lamparter <equinox@opensourcerouting.org> | 2022-02-28 15:56:51 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-02-28 15:56:51 +0100 |
| commit | b9db469fe928ceed7e10752b8342d3e6c7ec6de8 (patch) | |
| tree | 97bd2b97b3b46717cd1fd18e7e4dc18f1a627f2f /zebra/kernel_socket.c | |
| parent | 801d1f9ccf94572b7c4b627d293235e984883181 (diff) | |
| parent | 4dca0c10df92bec3f200bbac545eb1f782956049 (diff) | |
Merge pull request #10667 from donaldsharp/bufsize
Diffstat (limited to 'zebra/kernel_socket.c')
| -rw-r--r-- | zebra/kernel_socket.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c index 53b7a21d32..d812094848 100644 --- a/zebra/kernel_socket.c +++ b/zebra/kernel_socket.c @@ -1408,6 +1408,9 @@ static void kernel_read(struct thread *thread) /* Make routing socket. */ static void routing_socket(struct zebra_ns *zns) { + uint32_t default_rcvbuf; + socklen_t optlen; + frr_with_privs(&zserv_privs) { routing_sock = ns_socket(AF_ROUTE, SOCK_RAW, 0, zns->ns_id); @@ -1442,6 +1445,23 @@ static void routing_socket(struct zebra_ns *zns) /*if (fcntl (routing_sock, F_SETFL, O_NONBLOCK) < 0) zlog_warn ("Can't set O_NONBLOCK to routing socket");*/ + /* + * Attempt to set a more useful receive buffer size + */ + optlen = sizeof(default_rcvbuf); + if (getsockopt(routing_sock, SOL_SOCKET, SO_RCVBUF, &default_rcvbuf, + &optlen) == -1) + flog_err_sys(EC_LIB_SOCKET, + "routing_sock sockopt SOL_SOCKET SO_RCVBUF"); + else { + for (; rcvbufsize > default_rcvbuf && + setsockopt(routing_sock, SOL_SOCKET, SO_RCVBUF, + &rcvbufsize, sizeof(rcvbufsize)) == -1 && + errno == ENOBUFS; + rcvbufsize /= 2) + ; + } + /* kernel_read needs rewrite. */ thread_add_read(zrouter.master, kernel_read, NULL, routing_sock, NULL); } |
