From patchwork Wed Jun 28 19:12:19 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Medvedkin X-Patchwork-Id: 129085 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 22A6342D83; Wed, 28 Jun 2023 21:12:26 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1128E406B8; Wed, 28 Jun 2023 21:12:26 +0200 (CEST) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by mails.dpdk.org (Postfix) with ESMTP id C642D406B3 for ; Wed, 28 Jun 2023 21:12:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1687979544; x=1719515544; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=TKYhN6CQlXYQCkx4tSkwL1yEvBURJ1l6LHJSvNdDsLk=; b=h0000SOqfeDWdfRNboYW5Y3WB8+96op3S35oJnJCKb5IMzS3A3+zVrU8 uhPXgPpI2g2j3Qw912CfC68NW8QpSpvOnNsuvPg9FO70mes5Pi0oT5hja mNKUVFqmTu3U907WCCWHEE+xxPM1L5FECEhrxOI3tik4FX80zBIXh1L5O H0MvtKYdMNPH2X4TpKI2HldQP3ZC07D5YPjKgtcQ9iW7mFhXjrqxD9FsH PDEbPRt5Vc6zvXq64A0+hMfuMBoRP8Rg7UwTdwku7p+EsV7IU4EOak//V I0JLfHkeehsKOV5o264IgheDfxs7zkzb3g4hU2jK4eZrLIvdxSauBnuU/ g==; X-IronPort-AV: E=McAfee;i="6600,9927,10755"; a="359427625" X-IronPort-AV: E=Sophos;i="6.01,166,1684825200"; d="scan'208";a="359427625" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2023 12:12:23 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10755"; a="667233849" X-IronPort-AV: E=Sophos;i="6.01,166,1684825200"; d="scan'208";a="667233849" Received: from unknown (HELO silpixa00401176.ger.corp.intel.com) ([10.237.222.204]) by orsmga003.jf.intel.com with ESMTP; 28 Jun 2023 12:12:22 -0700 From: Vladimir Medvedkin To: dev@dpdk.org Cc: konstantin.v.ananyev@yandex.ru Subject: [PATCH] test: add additional tests for thash library Date: Wed, 28 Jun 2023 19:12:19 +0000 Message-Id: <20230628191219.78753-1-vladimir.medvedkin@intel.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Adds tests comparing the results of applying the output of rte_thash_get_complement() to the tuple with the result of calling rte_thash_adjust_tuple(). Suggested-by: Konstantin Ananyev Signed-off-by: Konstantin Ananyev Signed-off-by: Vladimir Medvedkin --- app/test/test_thash.c | 132 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/app/test/test_thash.c b/app/test/test_thash.c index 62ba4a9528..53d9611e18 100644 --- a/app/test/test_thash.c +++ b/app/test/test_thash.c @@ -804,6 +804,137 @@ test_adjust_tuple(void) return TEST_SUCCESS; } +static uint32_t +calc_tuple_hash(const uint8_t tuple[TUPLE_SZ], const uint8_t *key) +{ + uint32_t i, hash; + uint32_t tmp[TUPLE_SZ / sizeof(uint32_t)]; + + for (i = 0; i < RTE_DIM(tmp); i++) + tmp[i] = rte_be_to_cpu_32( + *(const uint32_t *)&tuple[i * sizeof(uint32_t)]); + + hash = rte_softrss(tmp, RTE_DIM(tmp), key); + return hash; +} + +static int +check_adj_tuple(const uint8_t tuple[TUPLE_SZ], const uint8_t *key, + uint32_t dhv, uint32_t ohv, uint32_t adjust, uint32_t reta_sz, + const char *prefix) +{ + uint32_t hash, hashlsb; + + hash = calc_tuple_hash(tuple, key); + hashlsb = hash & HASH_MSK(reta_sz); + + printf("%s(%s) for tuple:\n", __func__, prefix); + rte_memdump(stdout, NULL, tuple, TUPLE_SZ); + printf("\treta_sz: %u,\n" + "\torig hash: %#x,\n" + "\tdesired: %#x,\n" + "\tadjust: %#x,\n" + "\tactual: %#x,\n", + reta_sz, ohv, dhv, adjust, hashlsb); + + if (dhv == hashlsb) { + printf("\t***Succeeded\n"); + return 0; + } + + printf("\t***Failed\n"); + return -1; +} + +static int +test_adjust_tuple_mb(uint32_t reta_sz, uint32_t bofs) +{ + struct rte_thash_ctx *ctx; + struct rte_thash_subtuple_helper *h; + const int key_len = 40; + const uint8_t *new_key; + uint8_t orig_tuple[TUPLE_SZ]; + uint8_t tuple_1[TUPLE_SZ]; + uint8_t tuple_2[TUPLE_SZ]; + uint32_t orig_hash; + int rc, ret; + uint32_t adj_bits; + unsigned int random = rte_rand(); + unsigned int desired_value = random & HASH_MSK(reta_sz); + + const uint32_t h_offset = offsetof(union rte_thash_tuple, v4.dport) * CHAR_BIT; + const uint32_t h_size = sizeof(uint16_t) * CHAR_BIT - bofs; + + printf("===%s(reta_sz=%u,bofs=%u)===\n", __func__, reta_sz, bofs); + + memset(orig_tuple, 0xab, sizeof(orig_tuple)); + + ctx = rte_thash_init_ctx("test", key_len, reta_sz, NULL, 0); + RTE_TEST_ASSERT(ctx != NULL, "can not create thash ctx\n"); + + ret = rte_thash_add_helper(ctx, "test", h_size, h_offset); + RTE_TEST_ASSERT(ret == 0, "can not add helper, ret %d\n", ret); + + new_key = rte_thash_get_key(ctx); + + h = rte_thash_get_helper(ctx, "test"); + + orig_hash = calc_tuple_hash(orig_tuple, new_key); + + adj_bits = rte_thash_get_complement(h, orig_hash, desired_value); + + /* use method #1, update tuple manually */ + memcpy(tuple_1, orig_tuple, sizeof(tuple_1)); + { + uint16_t nv, ov, *p; + + p = (uint16_t *)(tuple_1 + h_offset / CHAR_BIT); + ov = p[0]; + nv = ov ^ rte_cpu_to_be_16(adj_bits << bofs); + printf("%s#%d: ov=%#hx, nv=%#hx, adj=%#x;\n", + __func__, __LINE__, ov, nv, adj_bits); + p[0] = nv; + } + + rc = check_adj_tuple(tuple_1, new_key, desired_value, orig_hash, + adj_bits, reta_sz, "method #1"); + if (h_offset % CHAR_BIT == 0) + ret |= rc; + + /* use method #2, use library function to adjust tuple */ + memcpy(tuple_2, orig_tuple, sizeof(tuple_2)); + + rte_thash_adjust_tuple(ctx, h, tuple_2, sizeof(tuple_2), + desired_value, 1, NULL, NULL); + ret |= check_adj_tuple(tuple_2, new_key, desired_value, orig_hash, + adj_bits, reta_sz, "method #2"); + + rte_thash_free_ctx(ctx); + + ret |= memcmp(tuple_1, tuple_2, sizeof(tuple_1)); + + printf("%s EXIT=======\n", __func__); + return ret; +} + +static int +test_adjust_tuple_mult_reta(void) +{ + uint32_t i, j, np, nt; + + nt = 0, np = 0; + for (i = 0; i < CHAR_BIT; i++) { + for (j = 6; j <= RTE_THASH_RETA_SZ_MAX - i; j++) { + np += (test_adjust_tuple_mb(j, i) == 0); + nt++; + } + } + + printf("%s: tests executed: %u, test passed: %u\n", __func__, nt, np); + RTE_TEST_ASSERT(nt == np, "%u subtests failed", nt - np); + return TEST_SUCCESS; +} + static struct unit_test_suite thash_tests = { .suite_name = "thash autotest", .setup = NULL, @@ -824,6 +955,7 @@ static struct unit_test_suite thash_tests = { TEST_CASE(test_predictable_rss_min_seq), TEST_CASE(test_predictable_rss_multirange), TEST_CASE(test_adjust_tuple), + TEST_CASE(test_adjust_tuple_mult_reta), TEST_CASES_END() } };