aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2020-02-05 23:59:55 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2020-02-05 23:59:55 +0100
commit0dc32bbeaf05c0ac7f4b6d131c0473434e12e25a (patch)
treed98cb7f8ea204dd8995bbd961c0db6f0e37ffd03
parentnetlink: remove libmnl requirement (diff)
downloadwireguard-tools-0dc32bbeaf05c0ac7f4b6d131c0473434e12e25a.tar.xz
wireguard-tools-0dc32bbeaf05c0ac7f4b6d131c0473434e12e25a.zip
netlink: don't pretend that sysconf isn't a function
We can cache the value of this instead of evaluating every time. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r--src/ipc.c2
-rw-r--r--src/netlink.h17
2 files changed, 15 insertions, 4 deletions
diff --git a/src/ipc.c b/src/ipc.c
index a0bf607..b9d2532 100644
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -40,7 +40,7 @@
#define SOCK_PATH RUNSTATEDIR "/wireguard/"
#define SOCK_SUFFIX ".sock"
#ifdef __linux__
-#define SOCKET_BUFFER_SIZE MNL_SOCKET_BUFFER_SIZE
+#define SOCKET_BUFFER_SIZE (mnl_ideal_socket_buffer_size())
#else
#define SOCKET_BUFFER_SIZE 8192
#endif
diff --git a/src/netlink.h b/src/netlink.h
index 2e36369..9d936c0 100644
--- a/src/netlink.h
+++ b/src/netlink.h
@@ -20,7 +20,6 @@
#include <linux/genetlink.h>
#define MNL_SOCKET_AUTOPID 0
-#define MNL_SOCKET_BUFFER_SIZE (sysconf(_SC_PAGESIZE) < 8192L ? sysconf(_SC_PAGESIZE) : 8192L)
#define MNL_ALIGNTO 4
#define MNL_ALIGN(len) (((len)+MNL_ALIGNTO-1) & ~(MNL_ALIGNTO-1))
#define MNL_NLMSG_HDRLEN MNL_ALIGN(sizeof(struct nlmsghdr))
@@ -68,6 +67,18 @@ typedef int (*mnl_cb_t)(const struct nlmsghdr *nlh, void *data);
#define MNL_ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
#endif
+static size_t mnl_ideal_socket_buffer_size(void)
+{
+ static size_t size = 0;
+
+ if (size)
+ return size;
+ size = (size_t)sysconf(_SC_PAGESIZE);
+ if (size > 8192)
+ size = 8192;
+ return size;
+}
+
static size_t mnl_nlmsg_size(size_t len)
{
return len + MNL_NLMSG_HDRLEN;
@@ -680,7 +691,7 @@ static int mnlg_socket_recv_run(struct mnlg_socket *nlg, mnl_cb_t data_cb, void
do {
err = mnl_socket_recvfrom(nlg->nl, nlg->buf,
- MNL_SOCKET_BUFFER_SIZE);
+ mnl_ideal_socket_buffer_size());
if (err <= 0)
break;
err = mnl_cb_run2(nlg->buf, err, nlg->seq, nlg->portid,
@@ -728,7 +739,7 @@ static struct mnlg_socket *mnlg_socket_open(const char *family_name, uint8_t ver
return NULL;
err = -ENOMEM;
- nlg->buf = malloc(MNL_SOCKET_BUFFER_SIZE);
+ nlg->buf = malloc(mnl_ideal_socket_buffer_size());
if (!nlg->buf)
goto err_buf_alloc;