From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id D6EFB5A031A for ; Thu, 04 Jul 2024 06:59:03 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202312; t=1720069127; bh=LSMhRxgwneQnubkb78/zdiOAA6spAFQiMr3vy4DDrJA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ShDbQ+IF1IopYxv8/qtwG+AphR9Px2Vph+JIFACqwnLqMgzwihkxRm3cWwROApSZu KmD7DhEW7oz4zpyIi8D69DlhtyLxq6RxAa4KORl3VnN+gjXl0Bf84iZDk/jWvWy5nR zLX8gG4GvFdOw2OxY/9MggSA/Gfc5dw4H2mqrVvD0expbDyfwH9Uc296ZSTJKvF54z k9vbI1bR7uvIGWmyAuBmVOwRtt1ow6vJVnv+OVKzP+ij/9lh448lgqc51Tt/JRL2ps 1perRdqj/tDUcsuBv8wMfzpTlqC8mkmx67LscYYY9N+OnUw/vbU0WDGtRF5smP/zKy og0/baJgiUDoQ== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4WF4DR4t7Pz4xGl; Thu, 4 Jul 2024 14:58:47 +1000 (AEST) From: David Gibson To: Stefano Brivio , passt-dev@passt.top Subject: [PATCH 11/11] contrib: Test behaviour of zero length datagram recv()s Date: Thu, 4 Jul 2024 14:58:35 +1000 Message-ID: <20240704045835.1149746-12-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240704045835.1149746-1-david@gibson.dropbear.id.au> References: <20240704045835.1149746-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: HRCX6P67UZ67BVBC5QYZMLCGAU5CBRZF X-Message-ID-Hash: HRCX6P67UZ67BVBC5QYZMLCGAU5CBRZF X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: David Gibson X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: 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 --- contrib/udp-behaviour/.gitignore | 1 + contrib/udp-behaviour/Makefile | 6 +-- contrib/udp-behaviour/recv-zero.c | 74 +++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 contrib/udp-behaviour/recv-zero.c diff --git a/contrib/udp-behaviour/.gitignore b/contrib/udp-behaviour/.gitignore index c1baa98e..555031d8 100644 --- a/contrib/udp-behaviour/.gitignore +++ b/contrib/udp-behaviour/.gitignore @@ -1 +1,2 @@ /reuseaddr-priority +/recv-zero diff --git a/contrib/udp-behaviour/Makefile b/contrib/udp-behaviour/Makefile index 6e1d966c..82aaac29 100644 --- a/contrib/udp-behaviour/Makefile +++ b/contrib/udp-behaviour/Makefile @@ -3,8 +3,8 @@ # Copyright Red Hat # Author: David Gibson -TARGETS = reuseaddr-priority -SRCS = reuseaddr-priority.c +TARGETS = reuseaddr-priority recv-zero +SRCS = reuseaddr-priority.c recv-zero.c CFLAGS = -Wall all: cppcheck clang-tidy $(TARGETS:%=check-%) @@ -16,7 +16,7 @@ check-%: % cppcheck: cppcheck --std=c11 --error-exitcode=1 --enable=all --force \ - --check-level=exhaustive \ + --check-level=exhaustive --inline-suppr \ --inconclusive --library=posix --quiet \ --suppress=missingIncludeSystem \ $(SRCS) diff --git a/contrib/udp-behaviour/recv-zero.c b/contrib/udp-behaviour/recv-zero.c new file mode 100644 index 00000000..f161e5c2 --- /dev/null +++ b/contrib/udp-behaviour/recv-zero.c @@ -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 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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); +} -- 2.45.2