From patchwork Thu Aug 29 07:43:45 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matt Johnston X-Patchwork-Id: 13782699 X-Patchwork-Delegate: kuba@kernel.org Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 90E7615B57B for ; Thu, 29 Aug 2024 07:44:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724917455; cv=none; b=d9lzKVAg+yKUx8b0bkN5VtutJF8iniip8p7RGRZsp1StKxHQnlD3equGnqAMQgVdQieRILTaSp95Vm1AOizCEGAFE39twJdvIl50azv/LyhRcxspxWdTPtHHR5FaA3AYAbOl+awl+9u5mlPYxTWN+YRhi7o5zj/Yp7lnQLe5vtU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724917455; c=relaxed/simple; bh=+q3FPFGuibajnWuWX2jfk+fkSlj/QYdHqZdDZG49eSo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=m8m4Z4/F2lS0zDRlTBQODbQI8e+iSTJEuo3KhJD5BzEWWh+GbWB8r03d27z1JvxRm6wqyAoG7ZHahY63OVSGQ93arIqksDm123TkFDiLwuYaJhcPuHhXq5pEIUQ0/MuEMT7xpkY3GZnhz+MY8asR+RT0vfnLmUlryloH1195g2E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=JnMLiy8L; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="JnMLiy8L" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1724917445; bh=oo9yf4gSE/8aMfaF4REYuX4jPX28pDgBkc1JnnrYsHE=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=JnMLiy8LwcBuLZOHFeMjyXa6WWWfWXeYUpc06xLYtCVBVjwLjODWAT4DL+LXgh63d kLrqiW5iKzBValQyPIB1lihtS6p4xwxo8O3CHB4EQLxGzwy1/ixj98S7UT/rtFR2yc 0PfnxWrObXvzgJLeRrjHRwUz7xGiGfXyeGBJI9+q/kZ0udxEk86Hclg7GXS1cBkPnT ncKfpNGupMBNrMwSI2VXw5xTYygrdldrOI58y3orT8eSHSHmUjQowW0Yh4KOaU1QFw osTMULOQTogKstK0H78+yai2JntWN4AVDRC9722frVu73bbKYQFieEvJDac7Acsh36 1ZT86/itgyIlQ== Received: by codeconstruct.com.au (Postfix, from userid 10001) id 585D067507; Thu, 29 Aug 2024 15:44:05 +0800 (AWST) From: Matt Johnston To: Jeremy Kerr Cc: "David S. Miller" , Jakub Kicinski , Paolo Abeni , Eric Dumazet , netdev@vger.kernel.org Subject: [PATCH net v2 1/2] net: mctp-serial: Add kunit test for next_chunk_len() Date: Thu, 29 Aug 2024 15:43:45 +0800 Message-ID: <20240829074355.1327255-2-matt@codeconstruct.com.au> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240829074355.1327255-1-matt@codeconstruct.com.au> References: <20240829074355.1327255-1-matt@codeconstruct.com.au> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Test various edge cases of inputs that contain characters that need escaping. This adds a new kunit suite for mctp-serial. Signed-off-by: Matt Johnston --- v2: Fix kunit param const pointer drivers/net/mctp/Kconfig | 5 ++ drivers/net/mctp/mctp-serial.c | 109 +++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) diff --git a/drivers/net/mctp/Kconfig b/drivers/net/mctp/Kconfig index ce9d2d2ccf3b..15860d6ac39f 100644 --- a/drivers/net/mctp/Kconfig +++ b/drivers/net/mctp/Kconfig @@ -21,6 +21,11 @@ config MCTP_SERIAL Say y here if you need to connect to MCTP endpoints over serial. To compile as a module, use m; the module will be called mctp-serial. +config MCTP_SERIAL_TEST + bool "MCTP serial tests" if !KUNIT_ALL_TESTS + depends on MCTP_SERIAL=y && KUNIT=y + default KUNIT_ALL_TESTS + config MCTP_TRANSPORT_I2C tristate "MCTP SMBus/I2C transport" # i2c-mux is optional, but we must build as a module if i2c-mux is a module diff --git a/drivers/net/mctp/mctp-serial.c b/drivers/net/mctp/mctp-serial.c index 5bf6fdff701c..7a40d07ff77b 100644 --- a/drivers/net/mctp/mctp-serial.c +++ b/drivers/net/mctp/mctp-serial.c @@ -521,3 +521,112 @@ module_exit(mctp_serial_exit); MODULE_LICENSE("GPL v2"); MODULE_AUTHOR("Jeremy Kerr "); MODULE_DESCRIPTION("MCTP Serial transport"); + +#if IS_ENABLED(CONFIG_MCTP_SERIAL_TEST) +#include + +#define MAX_CHUNKS 6 +struct test_chunk_tx { + u8 input_len; + u8 input[MCTP_SERIAL_MTU]; + u8 chunks[MAX_CHUNKS]; +}; + +static void test_next_chunk_len(struct kunit *test) +{ + struct mctp_serial devx; + struct mctp_serial *dev = &devx; + int next; + + const struct test_chunk_tx *params = test->param_value; + + memset(dev, 0x0, sizeof(*dev)); + memcpy(dev->txbuf, params->input, params->input_len); + dev->txlen = params->input_len; + + for (size_t i = 0; i < MAX_CHUNKS; i++) { + next = next_chunk_len(dev); + dev->txpos += next; + KUNIT_EXPECT_EQ(test, next, params->chunks[i]); + + if (next == 0) { + KUNIT_EXPECT_EQ(test, dev->txpos, dev->txlen); + return; + } + } + + KUNIT_FAIL_AND_ABORT(test, "Ran out of chunks"); +} + +static struct test_chunk_tx chunk_tx_tests[] = { + { + .input_len = 5, + .input = { 0x00, 0x11, 0x22, 0x7e, 0x80 }, + .chunks = { 3, 1, 1, 0}, + }, + { + .input_len = 5, + .input = { 0x00, 0x11, 0x22, 0x7e, 0x7d }, + .chunks = { 3, 1, 1, 0}, + }, + { + .input_len = 3, + .input = { 0x7e, 0x11, 0x22, }, + .chunks = { 1, 2, 0}, + }, + { + .input_len = 3, + .input = { 0x7e, 0x7e, 0x7d, }, + .chunks = { 1, 1, 1, 0}, + }, + { + .input_len = 4, + .input = { 0x7e, 0x7e, 0x00, 0x7d, }, + .chunks = { 1, 1, 1, 1, 0}, + }, + { + .input_len = 6, + .input = { 0x7e, 0x7e, 0x00, 0x7d, 0x10, 0x10}, + .chunks = { 1, 1, 1, 1, 2, 0}, + }, + { + .input_len = 1, + .input = { 0x7e }, + .chunks = { 1, 0 }, + }, + { + .input_len = 1, + .input = { 0x80 }, + .chunks = { 1, 0 }, + }, + { + .input_len = 3, + .input = { 0x80, 0x80, 0x00 }, + .chunks = { 3, 0 }, + }, + { + .input_len = 7, + .input = { 0x01, 0x00, 0x08, 0xc8, 0x00, 0x80, 0x02 }, + .chunks = { 7, 0 }, + }, + { + .input_len = 7, + .input = { 0x01, 0x00, 0x08, 0xc8, 0x7e, 0x80, 0x02 }, + .chunks = { 4, 1, 2, 0 }, + }, +}; + +KUNIT_ARRAY_PARAM(chunk_tx, chunk_tx_tests, NULL); + +static struct kunit_case mctp_serial_test_cases[] = { + KUNIT_CASE_PARAM(test_next_chunk_len, chunk_tx_gen_params), +}; + +static struct kunit_suite mctp_serial_test_suite = { + .name = "mctp_serial", + .test_cases = mctp_serial_test_cases, +}; + +kunit_test_suite(mctp_serial_test_suite); + +#endif /* CONFIG_MCTP_SERIAL_TEST */ From patchwork Thu Aug 29 07:43:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matt Johnston X-Patchwork-Id: 13782700 X-Patchwork-Delegate: kuba@kernel.org Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF4AA18785D; Thu, 29 Aug 2024 07:44:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724917455; cv=none; b=iwYmUybdHwwLaAHH8J5GjXYu+DeMR+V3bp2hLv67HGUmeDPPRrpBAT4pHfWPUyWhU3/xqT/NBYmh0OXLfk/9QN3BywnOlxSRIRNtdYiLK4Q/cuzd/qoRAzWX1YuMscb3pC4zqJD8SoZ+82DvEvlvCPCXwLkF6IaFhX6T9P/4uJ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724917455; c=relaxed/simple; bh=3H72LhuMwWS0t4/YPNgUCGZ4hz8rWOy8uMlCfu9xSGU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rKYCBY5IkJZlubVLRpSLwkv4TJI+mKGzcTByQMKwZlrk1dquq1V2iV9XNV1ZHZiFm4r2l3e9GjJ7ZdTzh2qQX9OG4Ze1n04S2oCSn4cjmIwUzV24n7FNuifRACqgtxrar3NgTUDfwp/XSStuVRc2zldmCK++lKNnYZwMJak4hhI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=EJefvFLm; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="EJefvFLm" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1724917445; bh=5R+sgB3xKH3yRTXkv5FKxf6/TvALXzaZUV1xcy3orLM=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=EJefvFLmrToaN45BDm1toX0lNG1nkCxFmISUiVnFTeUKEgFFuzb9QxSguJGGECvK4 bAFnmZ2vQO7v0ZB/X3FN9qGv+XRkYt/HgjD6To+U4yTZSUC8qpe+KYXTw93QG7KHYK bSgwi8q5dA1QYUpHIg+pYHhDMEK1oa15JCRQD/sPZQ6ogoz3kSFyrltg8PzkWBwmva VOPOX/9j/BotVXKda6KcswQjrKHJzsIImPB8Y4Xt3ZyC6OET58E3OgY0egktuPHw2R HA3hFjMG7XVtDJPFc7UM5uqIQUJHRG4ljCQQ+jq7IRXgt3lxoZRS9AnFhWUGSBaBAl dtiKfyMk+3UXQ== Received: by codeconstruct.com.au (Postfix, from userid 10001) id DDA566750A; Thu, 29 Aug 2024 15:44:05 +0800 (AWST) From: Matt Johnston To: Jeremy Kerr Cc: "David S. Miller" , Jakub Kicinski , Paolo Abeni , Eric Dumazet , netdev@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH net v2 2/2] net: mctp-serial: Fix missing escapes on transmit Date: Thu, 29 Aug 2024 15:43:46 +0800 Message-ID: <20240829074355.1327255-3-matt@codeconstruct.com.au> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240829074355.1327255-1-matt@codeconstruct.com.au> References: <20240829074355.1327255-1-matt@codeconstruct.com.au> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org 0x7d and 0x7e bytes are meant to be escaped in the data portion of frames, but this didn't occur since next_chunk_len() had an off-by-one error. That also resulted in the final byte of a payload being written as a separate tty write op. The chunk prior to an escaped byte would be one byte short, and the next call would never test the txpos+1 case, which is where the escaped byte was located. That meant it never hit the escaping case in mctp_serial_tx_work(). Example Input: 01 00 08 c8 7e 80 02 Previous incorrect chunks from next_chunk_len(): 01 00 08 c8 7e 80 02 With this fix: 01 00 08 c8 7e 80 02 Cc: stable@vger.kernel.org Fixes: a0c2ccd9b5ad ("mctp: Add MCTP-over-serial transport binding") Signed-off-by: Matt Johnston --- drivers/net/mctp/mctp-serial.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/mctp/mctp-serial.c b/drivers/net/mctp/mctp-serial.c index 7a40d07ff77b..f39bbe255497 100644 --- a/drivers/net/mctp/mctp-serial.c +++ b/drivers/net/mctp/mctp-serial.c @@ -91,8 +91,8 @@ static int next_chunk_len(struct mctp_serial *dev) * will be those non-escaped bytes, and does not include the escaped * byte. */ - for (i = 1; i + dev->txpos + 1 < dev->txlen; i++) { - if (needs_escape(dev->txbuf[dev->txpos + i + 1])) + for (i = 1; i + dev->txpos < dev->txlen; i++) { + if (needs_escape(dev->txbuf[dev->txpos + i])) break; }