From: Oleksij Rempel <o.rempel@pengutronix.de>
To: Robin van der Gracht <robin@protonic.nl>,
Oliver Hartkopp <socketcan@hartkopp.net>,
Marc Kleine-Budde <mkl@pengutronix.de>,
Shuah Khan <shuah@kernel.org>
Cc: "Oleksij Rempel" <o.rempel@pengutronix.de>,
kernel@pengutronix.de, linux-can@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
"Alexander Hölzl" <alexander.hoelzl@gmx.net>,
Quchaosheng <quchaosheng000406@163.com>,
"Tetsuo Handa" <penguin-kernel@I-love.SAKURA.ne.jp>
Subject: [PATCH can-next v1 8/8] selftests: can: check SO_J1939_PROMISC receive effect
Date: Wed, 14 Oct 2026 17:44:34 +0200 [thread overview]
Message-ID: <20261014154435.3577983-9-o.rempel@pengutronix.de> (raw)
In-Reply-To: <20261014154435.3577983-1-o.rempel@pengutronix.de>
Add a test that exercises the SO_J1939_PROMISC receive effect. The
existing coverage only round-trips the flag through set/getsockopt, so a
kernel that stores it but never acts on it in the RX path stays green.
The test binds an rx socket to a specific (address, PGN), checks that a
frame to a different destination address and PGN is not delivered, then
enables SO_J1939_PROMISC and checks the same otherwise-unmatched frame is
now delivered unchanged.
Assisted-by: LLM
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
---
.../selftests/net/can/test_j1939_opts.c | 46 ++++++++++++++++++-
1 file changed, 44 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/net/can/test_j1939_opts.c b/tools/testing/selftests/net/can/test_j1939_opts.c
index f761a42db213..3afda9b4e4a8 100644
--- a/tools/testing/selftests/net/can/test_j1939_opts.c
+++ b/tools/testing/selftests/net/can/test_j1939_opts.c
@@ -5,8 +5,8 @@
* On top of the basic transport, cover the user-visible J1939 socket options and
* addressing: the SO_J1939_FILTER PGN whitelist, the SO_J1939_SEND_PRIO send
* priority seen in the CAN id (via a CAN_RAW peer, including the default of 6),
- * unconnected sendto(2), a wrong-family bind rejection, and SO_J1939_ERRQUEUE
- * TX-completion notifications.
+ * unconnected sendto(2), a wrong-family bind rejection, SO_J1939_ERRQUEUE
+ * TX-completion notifications, and the SO_J1939_PROMISC receive effect.
*
* The vcan interface is set up by the caller (see test_j1939_opts.sh); its name
* is passed via the CANIF environment variable.
@@ -22,6 +22,7 @@
#define SA_TX 0x80
#define SA_RX 0x90
+#define SA_OTHER 0x50
#define PGN_A 0x0ab00
#define PGN_B 0x0cd00
#define PRIO_SET 3
@@ -123,6 +124,47 @@ TEST_F(j1939_opts, filter_pgn)
TH_LOG("PGN_B was received but should have been filtered out");
}
+/* SO_J1939_PROMISC delivers a frame that does not match the bound (addr,pgn). */
+TEST_F(j1939_opts, promisc_receive)
+{
+ uint8_t tx_buf[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
+ uint8_t rx_buf[8];
+ int enable = 1;
+ int ret;
+
+ self->rx = j1939_open(self->ifindex, SA_RX, PGN_A);
+ ASSERT_GE(self->rx, 0);
+ self->tx = j1939_open(self->ifindex, SA_TX, J1939_NO_PGN);
+ ASSERT_GE(self->tx, 0);
+
+ /*
+ * This frame uses a different address and PGN than rx is bound to.
+ * Without promisc, rx must not receive it.
+ */
+ ret = j1939_sendto(self->tx, tx_buf, sizeof(tx_buf), self->ifindex,
+ J1939_NO_NAME, SA_OTHER, PGN_B);
+ ASSERT_EQ(ret, (int)sizeof(tx_buf))
+ TH_LOG("sendto unmatched frame failed: %d", errno);
+ EXPECT_EQ(recv_timeout(self->rx, rx_buf, sizeof(rx_buf),
+ J1939_NEG_RECV_TIMEOUT_MS), -1)
+ TH_LOG("unmatched frame was received without promisc");
+
+ /* SO_J1939_PROMISC returns the flag value (1), not 0, on success. */
+ ASSERT_GE(setsockopt(self->rx, SOL_CAN_J1939, SO_J1939_PROMISC,
+ &enable, sizeof(enable)), 0)
+ TH_LOG("SO_J1939_PROMISC failed: %d", errno);
+
+ /* The same otherwise-unmatched frame must now be delivered. */
+ ret = j1939_sendto(self->tx, tx_buf, sizeof(tx_buf), self->ifindex,
+ J1939_NO_NAME, SA_OTHER, PGN_B);
+ ASSERT_EQ(ret, (int)sizeof(tx_buf))
+ TH_LOG("sendto unmatched frame failed: %d", errno);
+ ASSERT_EQ(recv_timeout(self->rx, rx_buf, sizeof(rx_buf),
+ J1939_RECV_TIMEOUT_MS), (int)sizeof(tx_buf))
+ TH_LOG("unmatched frame not received despite promisc");
+ EXPECT_EQ(memcmp(tx_buf, rx_buf, sizeof(tx_buf)), 0);
+}
+
/* without SO_J1939_SEND_PRIO the J1939 default priority (6) is used. */
TEST_F(j1939_opts, send_prio_default)
{
--
2.47.3
next prev parent reply other threads:[~2026-10-14 15:44 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-14 15:44 [PATCH can-next v1 0/8] selftests: can: add J1939 socket and transport tests Oleksij Rempel
2026-10-14 15:44 ` [PATCH can-next v1 1/8] selftests: can: add J1939 test helper header and library Oleksij Rempel
2026-10-16 6:59 ` netdev-bot+sashiko
2026-10-14 15:44 ` [PATCH can-next v1 2/8] selftests: can: add J1939 base functional tests Oleksij Rempel
2026-10-16 7:00 ` netdev-bot+sashiko
2026-10-14 15:44 ` [PATCH can-next v1 3/8] selftests: can: add J1939 socket option and metadata tests Oleksij Rempel
2026-10-16 7:00 ` netdev-bot+sashiko
2026-10-14 15:44 ` [PATCH can-next v1 4/8] selftests: can: add J1939 addressing and concurrency tests Oleksij Rempel
2026-10-16 7:00 ` netdev-bot+sashiko
2026-10-14 15:44 ` [PATCH can-next v1 5/8] selftests: can: add J1939 wire-format tests against CAN_RAW Oleksij Rempel
2026-10-16 7:00 ` netdev-bot+sashiko
2026-10-14 15:44 ` [PATCH can-next v1 6/8] selftests: can: add J1939 TP/ETP multi-frame " Oleksij Rempel
2026-10-16 7:00 ` netdev-bot+sashiko
2026-10-14 15:44 ` [PATCH can-next v1 7/8] selftests: can: cover J1939 transport abort and timeout paths Oleksij Rempel
2026-10-16 7:00 ` netdev-bot+sashiko
2026-10-14 15:44 ` Oleksij Rempel [this message]
2026-10-14 22:19 ` [PATCH can-next v1 0/8] selftests: can: add J1939 socket and transport tests Marc Kleine-Budde
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261014154435.3577983-9-o.rempel@pengutronix.de \
--to=o.rempel@pengutronix.de \
--cc=alexander.hoelzl@gmx.net \
--cc=kernel@pengutronix.de \
--cc=linux-can@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=mkl@pengutronix.de \
--cc=penguin-kernel@I-love.SAKURA.ne.jp \
--cc=quchaosheng000406@163.com \
--cc=robin@protonic.nl \
--cc=shuah@kernel.org \
--cc=socketcan@hartkopp.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®