win: make uv_udp_init_ex() accept UV_UDP_RECVMMSG
Commit 5736658b ("udp: add flag to enable recvmmsg(2) explicitly") added
the flag but didn't update the validation logic in src/win/udp.c.
This commit moves the validation logic to src/uv-common.c. The flag is
now accepted as a no-op on Windows.
Fixes: https://github.com/libuv/libuv/issues/2806
PR-URL: https://github.com/libuv/libuv/pull/2809
Reviewed-By: Bartosz Sosnowski <bartosz@janeasystems.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com>
This commit is contained in:
parent
e1180a6417
commit
aa7b62efd9
@ -944,22 +944,13 @@ static int uv__udp_set_source_membership6(uv_udp_t* handle,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
int uv_udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned int flags) {
|
int uv__udp_init_ex(uv_loop_t* loop,
|
||||||
int domain;
|
uv_udp_t* handle,
|
||||||
|
unsigned flags,
|
||||||
|
int domain) {
|
||||||
int err;
|
int err;
|
||||||
int extra_flags;
|
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
/* Use the lower 8 bits for the domain */
|
|
||||||
domain = flags & 0xFF;
|
|
||||||
if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC)
|
|
||||||
return UV_EINVAL;
|
|
||||||
|
|
||||||
/* Use the higher bits for extra flags */
|
|
||||||
extra_flags = flags & ~0xFF;
|
|
||||||
if (extra_flags & ~UV_UDP_RECVMMSG)
|
|
||||||
return UV_EINVAL;
|
|
||||||
|
|
||||||
if (domain != AF_UNSPEC) {
|
if (domain != AF_UNSPEC) {
|
||||||
err = uv__socket(domain, SOCK_DGRAM, 0);
|
err = uv__socket(domain, SOCK_DGRAM, 0);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
@ -978,18 +969,10 @@ int uv_udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned int flags) {
|
|||||||
QUEUE_INIT(&handle->write_queue);
|
QUEUE_INIT(&handle->write_queue);
|
||||||
QUEUE_INIT(&handle->write_completed_queue);
|
QUEUE_INIT(&handle->write_completed_queue);
|
||||||
|
|
||||||
if (extra_flags & UV_UDP_RECVMMSG)
|
|
||||||
handle->flags |= UV_HANDLE_UDP_RECVMMSG;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle) {
|
|
||||||
return uv_udp_init_ex(loop, handle, AF_UNSPEC);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) {
|
int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) {
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
|||||||
@ -293,6 +293,36 @@ int uv_tcp_bind(uv_tcp_t* handle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int uv_udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned flags) {
|
||||||
|
unsigned extra_flags;
|
||||||
|
int domain;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/* Use the lower 8 bits for the domain. */
|
||||||
|
domain = flags & 0xFF;
|
||||||
|
if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC)
|
||||||
|
return UV_EINVAL;
|
||||||
|
|
||||||
|
/* Use the higher bits for extra flags. */
|
||||||
|
extra_flags = flags & ~0xFF;
|
||||||
|
if (extra_flags & ~UV_UDP_RECVMMSG)
|
||||||
|
return UV_EINVAL;
|
||||||
|
|
||||||
|
rc = uv__udp_init_ex(loop, handle, flags, domain);
|
||||||
|
|
||||||
|
if (rc == 0)
|
||||||
|
if (extra_flags & UV_UDP_RECVMMSG)
|
||||||
|
handle->flags |= UV_HANDLE_UDP_RECVMMSG;
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle) {
|
||||||
|
return uv_udp_init_ex(loop, handle, AF_UNSPEC);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int uv_udp_bind(uv_udp_t* handle,
|
int uv_udp_bind(uv_udp_t* handle,
|
||||||
const struct sockaddr* addr,
|
const struct sockaddr* addr,
|
||||||
unsigned int flags) {
|
unsigned int flags) {
|
||||||
|
|||||||
@ -139,6 +139,11 @@ int uv__tcp_connect(uv_connect_t* req,
|
|||||||
unsigned int addrlen,
|
unsigned int addrlen,
|
||||||
uv_connect_cb cb);
|
uv_connect_cb cb);
|
||||||
|
|
||||||
|
int uv__udp_init_ex(uv_loop_t* loop,
|
||||||
|
uv_udp_t* handle,
|
||||||
|
unsigned flags,
|
||||||
|
int domain);
|
||||||
|
|
||||||
int uv__udp_bind(uv_udp_t* handle,
|
int uv__udp_bind(uv_udp_t* handle,
|
||||||
const struct sockaddr* addr,
|
const struct sockaddr* addr,
|
||||||
unsigned int addrlen,
|
unsigned int addrlen,
|
||||||
|
|||||||
@ -125,17 +125,10 @@ static int uv_udp_set_socket(uv_loop_t* loop, uv_udp_t* handle, SOCKET socket,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int uv_udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned int flags) {
|
int uv__udp_init_ex(uv_loop_t* loop,
|
||||||
int domain;
|
uv_udp_t* handle,
|
||||||
|
unsigned flags,
|
||||||
/* Use the lower 8 bits for the domain */
|
int domain) {
|
||||||
domain = flags & 0xFF;
|
|
||||||
if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC)
|
|
||||||
return UV_EINVAL;
|
|
||||||
|
|
||||||
if (flags & ~0xFF)
|
|
||||||
return UV_EINVAL;
|
|
||||||
|
|
||||||
uv__handle_init(loop, (uv_handle_t*) handle, UV_UDP);
|
uv__handle_init(loop, (uv_handle_t*) handle, UV_UDP);
|
||||||
handle->socket = INVALID_SOCKET;
|
handle->socket = INVALID_SOCKET;
|
||||||
handle->reqs_pending = 0;
|
handle->reqs_pending = 0;
|
||||||
@ -174,11 +167,6 @@ int uv_udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned int flags) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle) {
|
|
||||||
return uv_udp_init_ex(loop, handle, AF_UNSPEC);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void uv_udp_close(uv_loop_t* loop, uv_udp_t* handle) {
|
void uv_udp_close(uv_loop_t* loop, uv_udp_t* handle) {
|
||||||
uv_udp_recv_stop(handle);
|
uv_udp_recv_stop(handle);
|
||||||
closesocket(handle->socket);
|
closesocket(handle->socket);
|
||||||
|
|||||||
@ -133,7 +133,7 @@ TEST_IMPL(udp_no_autobind) {
|
|||||||
uv_close((uv_handle_t*) &h, NULL);
|
uv_close((uv_handle_t*) &h, NULL);
|
||||||
|
|
||||||
/* Test a non-lazily initialized socket. */
|
/* Test a non-lazily initialized socket. */
|
||||||
ASSERT(0 == uv_udp_init_ex(loop, &h2, AF_INET));
|
ASSERT(0 == uv_udp_init_ex(loop, &h2, AF_INET | UV_UDP_RECVMMSG));
|
||||||
ASSERT(0 == uv_udp_set_multicast_ttl(&h2, 32));
|
ASSERT(0 == uv_udp_set_multicast_ttl(&h2, 32));
|
||||||
ASSERT(0 == uv_udp_set_broadcast(&h2, 1));
|
ASSERT(0 == uv_udp_set_broadcast(&h2, 1));
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user