From 5c85d67bc781430f2db8f446795494aa8d399de8 Mon Sep 17 00:00:00 2001 From: Ryan Liptak Date: Tue, 13 Jul 2021 08:20:53 -0700 Subject: [PATCH] doc,udp: note that suggested_size is 1 max-sized dgram The intention here is to make working with recvmmsg more straight-forward, since internally libuv expects buffers that are multiples of UV__UDP_DGRAM_MAXSIZE, but previously the availability of that value wasn't readily apparent to the caller. Closes: https://github.com/libuv/libuv/issues/2822 Closes: https://github.com/libuv/libuv/issues/1025 Closes: https://github.com/libuv/libuv/pull/1114 PR-URL: https://github.com/libuv/libuv/pull/2986 Reviewed-By: Jameson Nash --- docs/src/udp.rst | 5 +++++ src/unix/udp.c | 2 -- src/uv-common.h | 2 ++ src/win/udp.c | 4 ++-- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/src/udp.rst b/docs/src/udp.rst index 3a7c6db4..009767d5 100644 --- a/docs/src/udp.rst +++ b/docs/src/udp.rst @@ -404,6 +404,11 @@ API :returns: 0 on success, or an error code < 0 on failure. + .. note:: + When using :man:`recvmmsg(2)`, the number of messages received at a time is limited + by the number of max size dgrams that will fit into the buffer allocated in `alloc_cb`, and + `suggested_size` in `alloc_cb` for udp_recv is always set to the size of 1 max size dgram. + .. versionchanged:: 1.35.0 added support for :man:`recvmmsg(2)` on supported platforms). The use of this feature requires a buffer larger than 2 * 64KB to be passed to `alloc_cb`. diff --git a/src/unix/udp.c b/src/unix/udp.c index 5d0ec8d3..49051c07 100644 --- a/src/unix/udp.c +++ b/src/unix/udp.c @@ -32,8 +32,6 @@ #endif #include -#define UV__UDP_DGRAM_MAXSIZE (64 * 1024) - #if defined(IPV6_JOIN_GROUP) && !defined(IPV6_ADD_MEMBERSHIP) # define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP #endif diff --git a/src/uv-common.h b/src/uv-common.h index dbeb698c..8a190bf8 100644 --- a/src/uv-common.h +++ b/src/uv-common.h @@ -68,6 +68,8 @@ extern int snprintf(char*, size_t, const char*, ...); #define uv__store_relaxed(p, v) do *p = v; while (0) #endif +#define UV__UDP_DGRAM_MAXSIZE (64 * 1024) + /* Handle flags. Some flags are specific to Windows or UNIX. */ enum { /* Used by all handles. */ diff --git a/src/win/udp.c b/src/win/udp.c index 68ca728a..3043f2da 100644 --- a/src/win/udp.c +++ b/src/win/udp.c @@ -284,7 +284,7 @@ static void uv_udp_queue_recv(uv_loop_t* loop, uv_udp_t* handle) { handle->flags &= ~UV_HANDLE_ZERO_READ; handle->recv_buffer = uv_buf_init(NULL, 0); - handle->alloc_cb((uv_handle_t*) handle, 65536, &handle->recv_buffer); + handle->alloc_cb((uv_handle_t*) handle, UV__UDP_DGRAM_MAXSIZE, &handle->recv_buffer); if (handle->recv_buffer.base == NULL || handle->recv_buffer.len == 0) { handle->recv_cb(handle, UV_ENOBUFS, &handle->recv_buffer, NULL, 0); return; @@ -501,7 +501,7 @@ void uv_process_udp_recv_req(uv_loop_t* loop, uv_udp_t* handle, /* Do a nonblocking receive. * TODO: try to read multiple datagrams at once. FIONREAD maybe? */ buf = uv_buf_init(NULL, 0); - handle->alloc_cb((uv_handle_t*) handle, 65536, &buf); + handle->alloc_cb((uv_handle_t*) handle, UV__UDP_DGRAM_MAXSIZE, &buf); if (buf.base == NULL || buf.len == 0) { handle->recv_cb(handle, UV_ENOBUFS, &buf, NULL, 0); goto done;