From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.ozlabs.org (gandalf.ozlabs.org [150.107.74.76]) by passt.top (Postfix) with ESMTPS id 28F845A0322 for ; Wed, 17 Jul 2024 06:52:34 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202312; t=1721191945; bh=VMG1TyqPysBU3b9hpfVuVZoBzje+a/heT25YqWgx4TE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lwaQaWRQLJHyHGun2hNbCaGuivNoR5Qg9Ux1BaDxo071zvYDpZFqKdVrS7Nj1+t8s 2DBsvTpIjwqGHfNx4oY479DUrY1eVQURJAotOY1yKp9oId9lxcMhmuJQ/8xL0gVb0n 2P5v6/yzrh4ujASGAFydvIteAI/LYjPmRiNHKt6rCMFiFputheUpEjTNGmvMlnvXa8 C1L0+BOytmuKorgBKzP1PQNCcAVtH9a7kPs0LO8U3qZD3s3N9lModBLBBF4W2YSRaU wg5VD6EnWlTxO85l2FzqzlTbryDmId2IDjNCFoZ55Vcn42HWqjF0pOED9Bcn5ukF5/ ONVBRg1sml4yQ== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4WP3T54NMNz4x3c; Wed, 17 Jul 2024 14:52:25 +1000 (AEST) From: David Gibson To: passt-dev@passt.top, Stefano Brivio Subject: [PATCH 6/6] doc: Extend zero-recv test with methods using msghdr Date: Wed, 17 Jul 2024 14:52:23 +1000 Message-ID: <20240717045223.2309975-7-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240717045223.2309975-1-david@gibson.dropbear.id.au> References: <20240717045223.2309975-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: K3N24RB2AFX7QN7NX6UEPH6ZMSBZZ6YR X-Message-ID-Hash: K3N24RB2AFX7QN7NX6UEPH6ZMSBZZ6YR 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: This test program verifies that we can receive and discard datagrams by using recv() with a NULL buffer and zero-length. Extend it to verify it also works using recvmsg() and either an iov with a zero-length NULL buffer or an iov that itself is NULL and zero-length. Signed-off-by: David Gibson --- doc/platform-requirements/recv-zero.c | 60 +++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/doc/platform-requirements/recv-zero.c b/doc/platform-requirements/recv-zero.c index f161e5c2..ab27704d 100644 --- a/doc/platform-requirements/recv-zero.c +++ b/doc/platform-requirements/recv-zero.c @@ -23,11 +23,27 @@ #define DSTPORT 13257U +enum discard_method { + DISCARD_NULL_BUF, + DISCARD_ZERO_IOV, + DISCARD_NULL_IOV, + NUM_METHODS, +}; + /* 127.0.0.1:DSTPORT */ static const struct sockaddr_in lo_dst = SOCKADDR_INIT(INADDR_LOOPBACK, DSTPORT); -static void test_discard(void) +static void test_discard(enum discard_method method) { + struct iovec zero_iov = { .iov_base = NULL, .iov_len = 0, }; + struct msghdr mh_zero = { + .msg_iov = &zero_iov, + .msg_iovlen = 1, + }; + struct msghdr mh_null = { + .msg_iov = NULL, + .msg_iovlen = 0, + }; long token1, token2; int recv_s, send_s; ssize_t rc; @@ -46,11 +62,36 @@ static void test_discard(void) 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)); - + switch (method) { + case DISCARD_NULL_BUF: + /* cppcheck-suppress nullPointer */ + rc = recv(recv_s, NULL, 0, MSG_DONTWAIT); + if (rc < 0) + die("discarding recv(): %s\n", strerror(errno)); + break; + + case DISCARD_ZERO_IOV: + rc = recvmsg(recv_s, &mh_zero, MSG_DONTWAIT); + if (rc < 0) + die("recvmsg() with zero-length buffer: %s\n", + strerror(errno)); + if (!((unsigned)mh_zero.msg_flags & MSG_TRUNC)) + die("Missing MSG_TRUNC flag\n"); + break; + + case DISCARD_NULL_IOV: + rc = recvmsg(recv_s, &mh_null, MSG_DONTWAIT); + if (rc < 0) + die("recvmsg() with zero-length iov: %s\n", + strerror(errno)); + if (!((unsigned)mh_null.msg_flags & MSG_TRUNC)) + die("Missing MSG_TRUNC flag\n"); + break; + + default: + die("Bad method\n"); + } + recv_token(recv_s, token2); /* cppcheck-suppress nullPointer */ @@ -63,12 +104,15 @@ static void test_discard(void) int main(int argc, char *argv[]) { + enum discard_method method; + (void)argc; (void)argv; - test_discard(); + for (method = 0; method < NUM_METHODS; method++) + test_discard(method); - printf("Discarding datagrams with a 0-length recv() seems to work\n"); + printf("Discarding datagrams with a 0-length receives seems to work\n"); exit(0); } -- 2.45.2