From 0dc32bbeaf05c0ac7f4b6d131c0473434e12e25a Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Wed, 5 Feb 2020 23:59:55 +0100 Subject: 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 --- src/ipc.c | 2 +- src/netlink.h | 17 ++++++++++++++--- 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 #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; -- cgit v1.2.3-59-g8ed1b