From 5249bf6428e70aa489aa9b8c44b16935c391a7fe Mon Sep 17 00:00:00 2001 From: "Sergey V. Lobanov" Date: Mon, 20 Dec 2021 18:00:32 +0300 Subject: T55: add netlink buffer size configuration parameters Netlink buffers may overflow so it might be useful to increase send and receive netlink buffer sizes. Two parameters to [common] configuration section added: nl-rcv-buffer, nl-snd-buffer. It is required to set (sysctl) net.core.wmem_max>=nl-snd-buffer and net.core.rmem_max>=nl-rcv-buffer before running accel-pppd To check current netlink buffer size and related info use the following command: % ss -f netlink -m 0 0 rtnl:kernel * skmem:(r0,rb212992,t0,tb212992,f0,w0,o0,bl0,d0) 0 0 rtnl:-1140221812 * skmem:(r0,rb2048000,t0,tb80000,f0,w0,o0,bl0,d0) 0 0 rtnl:accel-pppd/14285 * skmem:(r0,rb2048000,t0,tb65536,f0,w0,o0,bl0,d0) ... (Please check man ss to get the meaning for r,rb,t,tb,f,w,o,bl and d params) In the ss output you will see the values doubled from configured. First accel-pppd netlink socket will use default values (rcv=1048576, snd=32768) regardless of configured nl-rcv-buffer and nl-snd-buffer values. Signed-off-by: Sergey V. Lobanov --- accel-pppd/libnetlink/libnetlink.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'accel-pppd/libnetlink') diff --git a/accel-pppd/libnetlink/libnetlink.c b/accel-pppd/libnetlink/libnetlink.c index 0ab83a3..a0ea103 100644 --- a/accel-pppd/libnetlink/libnetlink.c +++ b/accel-pppd/libnetlink/libnetlink.c @@ -28,7 +28,8 @@ #define __export __attribute__((visibility("default"))) -int rcvbuf = 1024 * 1024; +extern int conf_nl_rcvbuf; +extern int conf_nl_sndbuf; void __export rtnl_close(struct rtnl_handle *rth) { @@ -52,12 +53,22 @@ int __export rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions, return -1; } - if (setsockopt(rth->fd,SOL_SOCKET,SO_SNDBUF,&sndbuf,sizeof(sndbuf)) < 0) { - log_debug("libnetlink: ""SO_SNDBUF: %s\n", strerror(errno)); - return -1; + if (conf_nl_sndbuf > 0) { + if (setsockopt(rth->fd,SOL_SOCKET,SO_SNDBUF,&conf_nl_sndbuf,sizeof(conf_nl_sndbuf)) < 0) { + log_debug("libnetlink: ""SO_SNDBUF: %s\n", strerror(errno)); + log_debug("libnetlink: unable to set custom sndbuf. Default value %d will be used", sndbuf); + conf_nl_sndbuf = -1; + } + } + + if (conf_nl_sndbuf <= 0) { + if (setsockopt(rth->fd,SOL_SOCKET,SO_SNDBUF,&sndbuf,sizeof(sndbuf)) < 0) { + log_debug("libnetlink: ""SO_SNDBUF: %s\n", strerror(errno)); + return -1; + } } - if (setsockopt(rth->fd,SOL_SOCKET,SO_RCVBUF,&rcvbuf,sizeof(rcvbuf)) < 0) { + if (setsockopt(rth->fd,SOL_SOCKET,SO_RCVBUF,&conf_nl_rcvbuf,sizeof(conf_nl_rcvbuf)) < 0) { log_debug("libnetlink: ""SO_RCVBUF: %s\n", strerror(errno)); return -1; } -- cgit v1.2.3