<div dir="ltr">Hi all,<div><br></div><div>We are using the following patch to increase the netlink receive buffer size to 2 MB. It has certainly helped reduce the instances of buffer overruns in either kernel async notifications or ack processing. Since more folks are having the same issue, maybe this patch could be added upstream?</div><div><br></div><div>Thanks,</div><div>Trisha<br><br></div><div>diff --git a/lib/socket.h b/lib/socket.h<br>index 96fedeeb..71fdcc1e 100644<br>--- a/lib/socket.h<br>+++ b/lib/socket.h<br>@@ -93,6 +93,7 @@ void sk_set_rbsize(sock *s, uint val); /* Resize RX buffer */<br> void sk_set_tbsize(sock *s, uint val);        /* Resize TX buffer, keeping content */<br> void sk_set_tbuf(sock *s, void *tbuf);       /* Switch TX buffer, NULL-> return to internal */<br> void sk_dump_all(void);<br>+void sk_set_rcvbuf(int fd, int val);  /* Set socket receive buffer size */<br> <br> int sk_is_ipv4(sock *s);            /* True if socket is IPv4 */<br> int sk_is_ipv6(sock *s);                /* True if socket is IPv6 */<br>diff --git a/sysdep/linux/netlink.c b/sysdep/linux/netlink.c<br>index fdf3f2db..89bb5a81 100644<br>--- a/sysdep/linux/netlink.c<br>+++ b/sysdep/linux/netlink.c<br>@@ -131,6 +131,7 @@ struct nl_sock<br> };<br> <br> #define NL_RX_SIZE 8192<br>+#define RCVBUF_SIZE 2*1024*1024<br> <br> #define NL_OP_DELETE  0<br> #define NL_OP_ADD  (NLM_F_CREATE|NLM_F_EXCL)<br>@@ -154,6 +155,7 @@ nl_open_sock(struct nl_sock *nl)<br>       nl->rx_buffer = xmalloc(NL_RX_SIZE);<br>       nl->last_hdr = NULL;<br>       nl->last_size = 0;<br>+      sk_set_rcvbuf(nl->fd, RCVBUF_SIZE);      <br>     }<br> }<br> <br>@@ -2014,6 +2016,7 @@ nl_open_async(void)<br>       log(L_ERR "Unable to open asynchronous rtnetlink socket: %m");<br>       return;<br>     }<br>+  sk_set_rcvbuf(fd, RCVBUF_SIZE);<br> <br>   bzero(&sa, sizeof(sa));<br>   sa.nl_family = AF_NETLINK;<br>diff --git a/sysdep/linux/sysio.h b/sysdep/linux/sysio.h<br>index e21ff487..93b5de7f 100644<br>--- a/sysdep/linux/sysio.h<br>+++ b/sysdep/linux/sysio.h<br>@@ -266,3 +266,10 @@ sk_set_priority(sock *s, int prio)<br>   return 0;<br> }<br> <br>+void<br>+sk_set_rcvbuf(int fd, int val)<br>+{<br>+  int len = val;<br>+  if (setsockopt(fd, SOL_SOCKET, SO_RCVBUFFORCE, &len, sizeof(len)) < 0)<br>+    log(L_WARN "sk_set_rcvbuf: Could not set RCVBUF to %d", len);<br>+}<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Sep 21, 2021 at 7:27 AM Alexander <<a href="mailto:aldem-bird.201704@nk7.net">aldem-bird.201704@nk7.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 2021-09-21 09:53, Maria Matejka wrote:<br>
<br>
> Here somebody suggests increasing net.core.rmem_default before starting <br>
> BIRD.<br>
> <br>
> <a href="https://bird.network.cz/pipermail/bird-users/2017-September/011541.html" rel="noreferrer" target="_blank">https://bird.network.cz/pipermail/bird-users/2017-September/011541.html</a><br>
<br>
Why not add an option with socket buffer size and force for netlink <br>
socket when specified? Like:<br>
<br>
   setsockopt(fd, SOL_SOCKET, SO_RCVBUFFORCE, &buffer_size, <br>
sizeof(buffer_size));<br>
<br>
SO_RCVBUFFORCE (available in kernels since 2.6.14) ignores limits in <br>
net.core.rmem_max<br>
so there is no need to mangle with settings, especially default settings <br>
(rmem_default)<br>
as it will affect *all* applications.<br>
<br>
Those who are lucky enough to run recent kernels without bugs could <br>
simply start bird<br>
with custom buffer size.<br>
<br>
/Al<br>
</blockquote></div>