doc: Test behaviour of zero length datagram recv()s
Add a test program verifying that we're able to discard datagrams from a socket without needing a big discard buffer, by using a zero length recv(). Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
299c407501
commit
ec2691a12e
3 changed files with 78 additions and 3 deletions
1
doc/platform-requirements/.gitignore
vendored
1
doc/platform-requirements/.gitignore
vendored
|
@ -1 +1,2 @@
|
||||||
/reuseaddr-priority
|
/reuseaddr-priority
|
||||||
|
/recv-zero
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
# Copyright Red Hat
|
# Copyright Red Hat
|
||||||
# Author: David Gibson <david@gibson.dropbear.id.au>
|
# Author: David Gibson <david@gibson.dropbear.id.au>
|
||||||
|
|
||||||
TARGETS = reuseaddr-priority
|
TARGETS = reuseaddr-priority recv-zero
|
||||||
SRCS = reuseaddr-priority.c
|
SRCS = reuseaddr-priority.c recv-zero.c
|
||||||
CFLAGS = -Wall
|
CFLAGS = -Wall
|
||||||
|
|
||||||
all: cppcheck clang-tidy $(TARGETS:%=check-%)
|
all: cppcheck clang-tidy $(TARGETS:%=check-%)
|
||||||
|
@ -16,7 +16,7 @@ check-%: %
|
||||||
|
|
||||||
cppcheck:
|
cppcheck:
|
||||||
cppcheck --std=c11 --error-exitcode=1 --enable=all --force \
|
cppcheck --std=c11 --error-exitcode=1 --enable=all --force \
|
||||||
--check-level=exhaustive \
|
--check-level=exhaustive --inline-suppr \
|
||||||
--inconclusive --library=posix --quiet \
|
--inconclusive --library=posix --quiet \
|
||||||
--suppress=missingIncludeSystem \
|
--suppress=missingIncludeSystem \
|
||||||
$(SRCS)
|
$(SRCS)
|
||||||
|
|
74
doc/platform-requirements/recv-zero.c
Normal file
74
doc/platform-requirements/recv-zero.c
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
/* recv-zero.c
|
||||||
|
*
|
||||||
|
* Verify that we're able to discard datagrams by recv()ing into a zero-length
|
||||||
|
* buffer.
|
||||||
|
*
|
||||||
|
* Copyright Red Hat
|
||||||
|
* Author: David Gibson <david@gibson.dropbear.id.au>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <net/if.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#define DSTPORT 13257U
|
||||||
|
|
||||||
|
/* 127.0.0.1:DSTPORT */
|
||||||
|
static const struct sockaddr_in lo_dst = SOCKADDR_INIT(INADDR_LOOPBACK, DSTPORT);
|
||||||
|
|
||||||
|
static void test_discard(void)
|
||||||
|
{
|
||||||
|
long token1, token2;
|
||||||
|
int recv_s, send_s;
|
||||||
|
ssize_t rc;
|
||||||
|
|
||||||
|
token1 = random();
|
||||||
|
token2 = random();
|
||||||
|
|
||||||
|
recv_s = sock_reuseaddr();
|
||||||
|
if (bind(recv_s, (struct sockaddr *)&lo_dst, sizeof(lo_dst)) < 0)
|
||||||
|
die("bind(): %s\n", strerror(errno));
|
||||||
|
|
||||||
|
send_s = sock_reuseaddr();
|
||||||
|
if (connect(send_s, (struct sockaddr *)&lo_dst, sizeof(lo_dst)) < 0)
|
||||||
|
die("connect(): %s\n", strerror(errno));
|
||||||
|
|
||||||
|
send_token(send_s, token1);
|
||||||
|
send_token(send_s, token2);
|
||||||
|
|
||||||
|
/* cppcheck-suppress nullPointer */
|
||||||
|
rc = recv(recv_s, NULL, 0, MSG_DONTWAIT);
|
||||||
|
if (rc < 0)
|
||||||
|
die("discarding recv(): %s\n", strerror(errno));
|
||||||
|
|
||||||
|
recv_token(recv_s, token2);
|
||||||
|
|
||||||
|
/* cppcheck-suppress nullPointer */
|
||||||
|
rc = recv(recv_s, NULL, 0, MSG_DONTWAIT);
|
||||||
|
if (rc < 0 && errno != EAGAIN)
|
||||||
|
die("redundant discarding recv(): %s\n", strerror(errno));
|
||||||
|
if (rc >= 0)
|
||||||
|
die("Unexpected receive: rc=%zd\n", rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
(void)argc;
|
||||||
|
(void)argv;
|
||||||
|
|
||||||
|
test_discard();
|
||||||
|
|
||||||
|
printf("Discarding datagrams with a 0-length recv() seems to work\n");
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
Loading…
Reference in a new issue