get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/136848/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 136848,
    "url": "http://patches.dpdk.org/api/patches/136848/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20240216102348.480407-2-mattias.ronnblom@ericsson.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20240216102348.480407-2-mattias.ronnblom@ericsson.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240216102348.480407-2-mattias.ronnblom@ericsson.com",
    "date": "2024-02-16T10:23:46",
    "name": "[RFC,v4,2/4] eal: add bitset test suite",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "61121f83fc9fce89bcc6b677d2d553d120ad699c",
    "submitter": {
        "id": 1077,
        "url": "http://patches.dpdk.org/api/people/1077/?format=api",
        "name": "Mattias Rönnblom",
        "email": "mattias.ronnblom@ericsson.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20240216102348.480407-2-mattias.ronnblom@ericsson.com/mbox/",
    "series": [
        {
            "id": 30953,
            "url": "http://patches.dpdk.org/api/series/30953/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=30953",
            "date": "2024-01-31T13:13:01",
            "name": "[RFC,v3] eal: add bitset type",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/30953/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/136848/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/136848/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "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])\n\tby inbox.dpdk.org (Postfix) with ESMTP id EE2A143B30;\n\tFri, 16 Feb 2024 11:31:54 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id A7DB043260;\n\tFri, 16 Feb 2024 11:31:50 +0100 (CET)",
            "from EUR04-HE1-obe.outbound.protection.outlook.com\n (mail-he1eur04on2052.outbound.protection.outlook.com [40.107.7.52])\n by mails.dpdk.org (Postfix) with ESMTP id 64B194064A\n for <dev@dpdk.org>; Fri, 16 Feb 2024 11:31:48 +0100 (CET)",
            "from DB8PR06CA0030.eurprd06.prod.outlook.com (2603:10a6:10:100::43)\n by DBAPR07MB6776.eurprd07.prod.outlook.com (2603:10a6:10:19c::13)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7292.31; Fri, 16 Feb\n 2024 10:31:46 +0000",
            "from DU6PEPF0000B620.eurprd02.prod.outlook.com\n (2603:10a6:10:100:cafe::22) by DB8PR06CA0030.outlook.office365.com\n (2603:10a6:10:100::43) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7270.40 via Frontend\n Transport; Fri, 16 Feb 2024 10:31:46 +0000",
            "from oa.msg.ericsson.com (192.176.1.74) by\n DU6PEPF0000B620.mail.protection.outlook.com (10.167.8.136) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.7292.25 via Frontend Transport; Fri, 16 Feb 2024 10:31:45 +0000",
            "from seliicinfr00050.seli.gic.ericsson.se (153.88.142.248) by\n smtp-central.internal.ericsson.com (100.87.178.65) with Microsoft SMTP Server\n id 15.2.1258.12; Fri, 16 Feb 2024 11:31:45 +0100",
            "from breslau.. (seliicwb00002.seli.gic.ericsson.se [10.156.25.100])\n by seliicinfr00050.seli.gic.ericsson.se (Postfix) with ESMTP id\n 38B4F1C0084; Fri, 16 Feb 2024 11:31:45 +0100 (CET)"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=ELc23GRcd9gP0CUjc5O7iIjCz8dj0BtNvdkfBAlhYtpSQ8kJi9YEOpxHaKNdyGqPBYfvXR35XA7VV7Q+2ub+lksckcYDZoIDU/MpX8UAoILrbceT/+VZ6+ifks86K7DPtNxsANVx6+ia10PdGEPX1gklNZyoppi5wgkgup7aORjyWt2zXhZEmsWZmvbI3LYOp+08kSWOVJrx9FfN3aW5DadOG8pEKjZ5mpzh0dHLF64T+YuNoZ+sO+ZGgLFkQJ2uaLmt7aH57hhKkFKSzBsRJ8zVqoHB0IInzhyLmG5pYMvN3VATGhidPULL03LWVIDxSiKOEp5KEfgDehkVVJflqQ==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=eucfxGFbUBfHjrrSKntV2aIfZy07luKgQDt+AUeda7c=;\n b=BKN9lYWAm5jInsPfTuY7cbcMYQqCB2eNKw87Z286gCHQWiTWBulFiIImfv6kGNRB1fHKdIgZ3LQzCtjW8HnNI0/QhjiaoLlEIcgrhfulhg/3lHti6nOlFGixGHpDZpZad6GmWcAjwxHXKUUw6VQ80ckMtH5jyMvev8UXUVMNww6NceR8XYklqCej7kq5YmQaA15Ye9QVsdD5XhJt4h8B3pKG1Bmfw7qr8AqzeWqD7a5OyVjJJWADeQmJGuyaoiswn/txuEOq4rHGWZXZOhpGyomxrSo9lROmM2AWe49jXO0hKmWFNIAb87Vo8saaMUm0dEqCCoiKBPT10m4a0szDwQ==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 192.176.1.74) smtp.rcpttodomain=dpdk.org smtp.mailfrom=ericsson.com;\n dmarc=pass (p=reject sp=reject pct=100) action=none header.from=ericsson.com;\n dkim=none (message not signed); arc=none (0)",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=ericsson.com;\n s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=eucfxGFbUBfHjrrSKntV2aIfZy07luKgQDt+AUeda7c=;\n b=Wxr9HyJ5lNwo20dgoHIaThZMJMhUkwp9tOgx6iB8Lyh7h0wtAxnc1LXXiMQzORTGeC8oh7aKZp33OB2Q/dirkm7oPSkpIQn5n19a9KWh8nr8shNdJMQSd+0ijdN8+nPOhE2VrvcgziO5ZwuSbfN26jYAC27mUvZYGh+paa4ftC7Z9IcGC6zwV7fJRt0jTDBoaWDHqQryvhdMkyyjXajVQdRpObXPO1tTLjxeOSMhzMoOOMcZvzHBCf9D+IpopFBsHf5qx8Yha8bLYSc/Q+qgXd8oEfT7TvBlnKkmxU+Qzljdo4n/XsdOMaTCc7pwrmZP8U5fBn3JPY4FYAtisgB4YQ==",
        "X-MS-Exchange-Authentication-Results": "spf=pass (sender IP is 192.176.1.74)\n smtp.mailfrom=ericsson.com; dkim=none (message not signed)\n header.d=none;dmarc=pass action=none header.from=ericsson.com;",
        "Received-SPF": "Pass (protection.outlook.com: domain of ericsson.com designates\n 192.176.1.74 as permitted sender)\n receiver=protection.outlook.com;\n client-ip=192.176.1.74; helo=oa.msg.ericsson.com; pr=C",
        "From": "=?utf-8?q?Mattias_R=C3=B6nnblom?= <mattias.ronnblom@ericsson.com>",
        "To": "<dev@dpdk.org>",
        "CC": "<hofors@lysator.liu.se>,\n =?utf-8?q?Morten_Br=C3=B8rup?= <mb@smartsharesystems.com>,\n Tyler Retzlaff <roretzla@linux.microsoft.com>,\n Stephen Hemminger <stephen@networkplumber.org>,\n Harry van Haaren <harry.van.haaren@intel.com>, =?utf-8?q?Mattias_R=C3=B6nnb?=\n\t=?utf-8?q?lom?= <mattias.ronnblom@ericsson.com>",
        "Subject": "[RFC v4 2/4] eal: add bitset test suite",
        "Date": "Fri, 16 Feb 2024 11:23:46 +0100",
        "Message-ID": "<20240216102348.480407-2-mattias.ronnblom@ericsson.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20240216102348.480407-1-mattias.ronnblom@ericsson.com>",
        "References": "<20240131131301.418361-1-mattias.ronnblom@ericsson.com>\n <20240216102348.480407-1-mattias.ronnblom@ericsson.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=\"UTF-8\"",
        "Content-Transfer-Encoding": "8bit",
        "X-EOPAttributedMessage": "0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "DU6PEPF0000B620:EE_|DBAPR07MB6776:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "cb797b16-6bfc-4bee-7b8a-08dc2eda79c1",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n 8hDrAvl/IyhzKYDB8jIemi2FVZNnPrjqHg0SHiuqWaXJFISZWQaJvqSEnaPCZhJsyUddeFnqHc/87RlwXtalwzIEGr7jFaBw2zn4vbVZTbsliG2JIiFh55UIWezeCTkyLwSiDKrSCqDvaqpOBK1B/tmndkBUMTnRrYcKbXIt1FLXHicJ0iSlyHXHExA566jhQBMdJb7l/Hd+MhRQgQxjF6pfvFvGVTcEs7lB6m8zgwjEqJJ9NJLNtrNgPNzpOVqoMG2mJeGEY+eWWigM7IMQMWAN/3V9iH6GxEdZRnkNkz/Jw5kxmw5FArNsbsTKSurE0MSU6SWy69cKORZfWLQer7SUQ4QqG37UXOacZfcXAh4nf3UkNaDW8SEwcR3fzBvIBT7jtQpc4zLpTCI1fRt3WpFvLpu3G4u8MKY97QL0lpXEXFXjD6Idsq1nVB3ew+C6av/4xibEUHo+ZZn5Z7krzShB0vHr8zRq9ALEn+5HtIeJn7uzv4sdOW7oF7mcmgvYc4kvsdgIguxUL3xQ8yJvwcyMYNbTbFtomrRlZmJiQSAiaVZv7Peo7w6ItNuxJlFWI0BPPkulBMlh3PR3SC2EEfBVLpfzLhvR/fGINv3c4S9IKNNhtoAxUm4otqZcS5WZlhjNXrzJjHbdG1Qv/OLxBaPDRiRsrErzmFNP8P+7p14=",
        "X-Forefront-Antispam-Report": "CIP:192.176.1.74; CTRY:SE; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:oa.msg.ericsson.com; PTR:office365.se.ericsson.net;\n CAT:NONE;\n SFS:(13230031)(4636009)(376002)(396003)(346002)(39860400002)(136003)(230922051799003)(64100799003)(451199024)(36860700004)(1800799012)(186009)(82310400011)(46966006)(40470700004)(8676002)(478600001)(41300700001)(8936002)(4326008)(2906002)(30864003)(5660300002)(70206006)(316002)(54906003)(6916009)(70586007)(2616005)(1076003)(336012)(83380400001)(66574015)(356005)(82960400001)(6266002)(107886003)(86362001)(7636003)(26005)(36756003)(82740400003);\n DIR:OUT; SFP:1101;",
        "X-OriginatorOrg": "ericsson.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "16 Feb 2024 10:31:45.9301 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n cb797b16-6bfc-4bee-7b8a-08dc2eda79c1",
        "X-MS-Exchange-CrossTenant-Id": "92e84ceb-fbfd-47ab-be52-080c6b87953f",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=92e84ceb-fbfd-47ab-be52-080c6b87953f; Ip=[192.176.1.74];\n Helo=[oa.msg.ericsson.com]",
        "X-MS-Exchange-CrossTenant-AuthSource": "\n DU6PEPF0000B620.eurprd02.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DBAPR07MB6776",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Add test suite to exercise <rte_bitset.h>.\n\nRFC v4:\n * Fix signed char issue in test cases. (Stephen Hemminger)\n * Add test cases for logic operations.\n * Use the unit test suite runner helper.\n\nSigned-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>\n---\n app/test/meson.build   |   1 +\n app/test/test_bitset.c | 870 +++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 871 insertions(+)\n create mode 100644 app/test/test_bitset.c",
    "diff": "diff --git a/app/test/meson.build b/app/test/meson.build\nindex b4382cf4ad..d5a7f771ae 100644\n--- a/app/test/meson.build\n+++ b/app/test/meson.build\n@@ -33,6 +33,7 @@ source_file_deps = {\n     'test_bitcount.c': [],\n     'test_bitmap.c': [],\n     'test_bitops.c': [],\n+    'test_bitset.c': [],\n     'test_bitratestats.c': ['metrics', 'bitratestats', 'ethdev'] + sample_packet_forward_deps,\n     'test_bpf.c': ['bpf', 'net'],\n     'test_byteorder.c': [],\ndiff --git a/app/test/test_bitset.c b/app/test/test_bitset.c\nnew file mode 100644\nindex 0000000000..84c8a117ee\n--- /dev/null\n+++ b/app/test/test_bitset.c\n@@ -0,0 +1,870 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2023 Ericsson AB\n+ */\n+\n+#include <stdlib.h>\n+#include <inttypes.h>\n+\n+#include <rte_random.h>\n+\n+#include <rte_bitset.h>\n+\n+#include \"test.h\"\n+\n+#define MAGIC UINT64_C(0xdeadbeefdeadbeef)\n+\n+static void\n+rand_buf(void *buf, size_t n)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < n; i++)\n+\t\t((unsigned char *)buf)[i] = rte_rand();\n+}\n+\n+static uint64_t *\n+alloc_bitset(size_t size)\n+{\n+\tuint64_t *p;\n+\n+\tp = malloc(RTE_BITSET_SIZE(size) + 2 * sizeof(uint64_t));\n+\n+\tif (p == NULL)\n+\t\trte_panic(\"Unable to allocate memory\\n\");\n+\n+\trand_buf(&p[0], RTE_BITSET_SIZE(size));\n+\n+\tp[0] = MAGIC;\n+\tp[RTE_BITSET_NUM_WORDS(size) + 1] = MAGIC;\n+\n+\treturn p + 1;\n+}\n+\n+\n+static int\n+free_bitset(uint64_t *bitset, size_t size)\n+{\n+\tuint64_t *p;\n+\n+\tp = bitset - 1;\n+\n+\tif (p[0] != MAGIC)\n+\t\treturn TEST_FAILED;\n+\n+\tif (p[RTE_BITSET_NUM_WORDS(size) + 1] != MAGIC)\n+\t\treturn TEST_FAILED;\n+\n+\tfree(p);\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static bool\n+rand_bool(void)\n+{\n+\treturn rte_rand_max(2);\n+}\n+\n+static void\n+rand_bool_ary(bool *ary, size_t len)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < len; i++)\n+\t\tary[i] = rand_bool();\n+}\n+\n+static void\n+rand_unused_bits(uint64_t *bitset, size_t size)\n+{\n+\tuint64_t bits = rte_rand() & ~__RTE_BITSET_USED_MASK(size);\n+\n+\tbitset[RTE_BITSET_NUM_WORDS(size) - 1] |= bits;\n+}\n+\n+static void\n+rand_bitset(uint64_t *bitset, size_t size)\n+{\n+\tsize_t i;\n+\n+\trte_bitset_init(bitset, size);\n+\n+\tfor (i = 0; i < size; i++)\n+\t\trte_bitset_assign(bitset, i, rand_bool());\n+\n+\trand_unused_bits(bitset, size);\n+}\n+\n+static int\n+test_set_clear_size(size_t size)\n+{\n+\tsize_t i;\n+\tbool reference[size];\n+\tuint64_t *bitset;\n+\n+\trand_bool_ary(reference, size);\n+\n+\tbitset = alloc_bitset(size);\n+\n+\tTEST_ASSERT(bitset != NULL, \"Failed to allocate memory\");\n+\n+\trte_bitset_init(bitset, size);\n+\n+\tfor (i = 0; i < size; i++) {\n+\t\tif (reference[i])\n+\t\t\trte_bitset_set(bitset, i);\n+\t\telse\n+\t\t\trte_bitset_clear(bitset, i);\n+\t}\n+\n+\tfor (i = 0; i < size; i++)\n+\t\tif (reference[i] != rte_bitset_test(bitset, i))\n+\t\t\treturn TEST_FAILED;\n+\n+\tTEST_ASSERT_EQUAL(free_bitset(bitset, size), TEST_SUCCESS,\n+\t\t\t  \"Buffer over- or underrun detected\");\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+#define RAND_ITERATIONS (10000)\n+#define RAND_SET_MAX_SIZE (1000)\n+\n+static int\n+test_set_clear(void)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < RAND_ITERATIONS; i++) {\n+\t\tsize_t size = 1 + rte_rand_max(RAND_SET_MAX_SIZE - 1);\n+\n+\t\tif (test_set_clear_size(size) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_flip_size(size_t size)\n+{\n+\tsize_t i;\n+\tuint64_t *bitset;\n+\n+\tbitset = alloc_bitset(size);\n+\n+\tTEST_ASSERT(bitset != NULL, \"Failed to allocate memory\");\n+\n+\trand_bitset(bitset, size);\n+\n+\tfor (i = 0; i < size; i++) {\n+\t\tRTE_BITSET_DECLARE(reference, size);\n+\n+\t\trte_bitset_copy(reference, bitset, size);\n+\n+\t\tbool value = rte_bitset_test(bitset, i);\n+\n+\t\trte_bitset_flip(bitset, i);\n+\n+\t\tTEST_ASSERT(rte_bitset_test(bitset, i) != value,\n+\t\t\t    \"Bit %zd was not flipped\", i);\n+\n+\t\trte_bitset_assign(reference, i, !value);\n+\n+\t\tTEST_ASSERT(rte_bitset_equal(bitset, reference, size),\n+\t\t\t    \"Not only the target bit %zd was flipped\", i);\n+\n+\n+\t}\n+\n+\tTEST_ASSERT_EQUAL(free_bitset(bitset, size), TEST_SUCCESS,\n+\t\t\t  \"Buffer over- or underrun detected\");\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_flip(void)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < RAND_ITERATIONS; i++) {\n+\t\tsize_t size = 1 + rte_rand_max(RAND_SET_MAX_SIZE - 1);\n+\n+\t\tif (test_flip_size(size) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static ssize_t\n+find(const bool *ary, size_t num_bools, size_t start, size_t len, bool set)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < len; i++) {\n+\t\tssize_t idx = (start + i) % num_bools;\n+\n+\t\tif (ary[idx] == set)\n+\t\t\treturn idx;\n+\t}\n+\n+\treturn -1;\n+}\n+\n+static ssize_t\n+find_set(const bool *ary, size_t num_bools, size_t start, size_t len)\n+{\n+\treturn find(ary, num_bools, start, len, true);\n+}\n+\n+static ssize_t\n+find_clear(const bool *ary, size_t num_bools, size_t start, size_t len)\n+{\n+\treturn find(ary, num_bools, start, len, false);\n+}\n+\n+#define FFS_ITERATIONS (100)\n+\n+static int\n+test_find_size(size_t size, bool set)\n+{\n+\tuint64_t *bitset;\n+\tbool reference[size];\n+\tsize_t i;\n+\n+\tbitset = alloc_bitset(size);\n+\n+\tTEST_ASSERT(bitset != NULL, \"Failed to allocate memory\");\n+\n+\trte_bitset_init(bitset, size);\n+\n+\tfor (i = 0; i < size; i++) {\n+\t\tbool bit = rand_bool();\n+\t\treference[i] = bit;\n+\n+\t\tif (bit)\n+\t\t\trte_bitset_set(bitset, i);\n+\t\telse /* redundant, still useful for testing */\n+\t\t\trte_bitset_clear(bitset, i);\n+\t}\n+\n+\tfor (i = 0; i < FFS_ITERATIONS; i++) {\n+\t\tsize_t start_bit = rte_rand_max(size);\n+\t\tsize_t len = rte_rand_max(size + 1);\n+\t\tbool full_range = len == size && start_bit == 0;\n+\t\tbool wraps = start_bit + len > size;\n+\t\tssize_t rc;\n+\n+\t\tif (set) {\n+\t\t\tif (full_range && rand_bool())\n+\t\t\t\trc = rte_bitset_find_first_set(bitset,\n+\t\t\t\t\t\t\t       size);\n+\t\t\telse if (wraps || rand_bool()) {\n+\t\t\t\trc = rte_bitset_find_set_wrap(bitset, size,\n+\t\t\t\t\t\t\t      start_bit, len);\n+\n+\t\t\t} else\n+\t\t\t\trc = rte_bitset_find_set(bitset, size,\n+\t\t\t\t\t\t\t start_bit, len);\n+\n+\t\t\tif (rc != find_set(reference, size, start_bit,\n+\t\t\t\t\t   len))\n+\t\t\t\treturn TEST_FAILED;\n+\t\t} else {\n+\t\t\tif (full_range && rand_bool())\n+\t\t\t\trc = rte_bitset_find_first_clear(bitset,\n+\t\t\t\t\t\t\t\t size);\n+\t\t\telse if (wraps || rand_bool())\n+\t\t\t\trc = rte_bitset_find_clear_wrap(bitset,\n+\t\t\t\t\t\t\t\tsize,\n+\t\t\t\t\t\t\t\tstart_bit, len);\n+\t\t\telse\n+\t\t\t\trc = rte_bitset_find_clear(bitset, size,\n+\t\t\t\t\t\t\t   start_bit, len);\n+\n+\t\t\tif (rc != find_clear(reference, size, start_bit,\n+\t\t\t\t\t     len))\n+\t\t\t\treturn TEST_FAILED;\n+\t\t}\n+\n+\t}\n+\n+\tTEST_ASSERT_EQUAL(free_bitset(bitset, size), TEST_SUCCESS,\n+\t\t\t  \"Buffer over- or underrun detected\");\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_find_set_size(size_t size)\n+{\n+\treturn test_find_size(size, true);\n+}\n+\n+static int\n+test_find_clear_size(size_t size)\n+{\n+\treturn test_find_size(size, false);\n+}\n+\n+static int\n+test_find(void)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < RAND_ITERATIONS; i++) {\n+\t\tsize_t size = 2 + rte_rand_max(RAND_SET_MAX_SIZE - 2);\n+\n+\t\tif (test_find_set_size(size) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\n+\t\tif (test_find_clear_size(size) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+record_match(ssize_t match_idx, size_t size, int *calls)\n+{\n+\tif (match_idx < 0 || (size_t)match_idx >= size)\n+\t\treturn TEST_FAILED;\n+\n+\tcalls[match_idx]++;\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_foreach_size(ssize_t size, bool may_wrap, bool set)\n+{\n+\tbool reference[size];\n+\tint calls[size];\n+\tuint64_t *bitset;\n+\tssize_t i;\n+\tssize_t start_bit;\n+\tssize_t len;\n+\tbool full_range;\n+\tsize_t total_calls = 0;\n+\n+\trand_bool_ary(reference, size);\n+\n+\tbitset = alloc_bitset(size);\n+\n+\tTEST_ASSERT(bitset != NULL, \"Failed to allocate memory\");\n+\n+\tmemset(calls, 0, sizeof(calls));\n+\n+\tstart_bit = rte_rand_max(size);\n+\tlen = may_wrap ? rte_rand_max(size + 1) :\n+\t\trte_rand_max(size - start_bit + 1);\n+\n+\trte_bitset_init(bitset, size);\n+\n+\t/* random data in the unused bits should not matter */\n+\trand_buf(bitset, RTE_BITSET_SIZE(size));\n+\n+\tfor (i = start_bit; i < start_bit + len; i++) {\n+\t\tsize_t idx = i % size;\n+\n+\t\tif (reference[idx])\n+\t\t\trte_bitset_set(bitset, idx);\n+\t\telse\n+\t\t\trte_bitset_clear(bitset, idx);\n+\n+\t\tif (rte_bitset_test(bitset, idx) != reference[idx])\n+\t\t\treturn TEST_FAILED;\n+\t}\n+\n+\tfull_range = (len == size && start_bit == 0);\n+\n+\t/* XXX: verify iteration order as well */\n+\tif (set) {\n+\t\tif (full_range && rand_bool()) {\n+\t\t\tRTE_BITSET_FOREACH_SET(i, bitset, size) {\n+\t\t\t\tif (record_match(i, size, calls) !=\n+\t\t\t\t    TEST_SUCCESS)\n+\t\t\t\t\treturn TEST_FAILED;\n+\t\t\t}\n+\t\t} else if (may_wrap) {\n+\t\t\tRTE_BITSET_FOREACH_SET_WRAP(i, bitset, size,\n+\t\t\t\t\t\t    start_bit, len) {\n+\t\t\t\tif (record_match(i, size, calls) !=\n+\t\t\t\t    TEST_SUCCESS) {\n+\t\t\t\t\tprintf(\"failed\\n\");\n+\t\t\t\t\treturn TEST_FAILED;\n+\t\t\t\t}\n+\t\t\t}\n+\t\t} else {\n+\t\t\tRTE_BITSET_FOREACH_SET_RANGE(i, bitset, size,\n+\t\t\t\t\t\t     start_bit, len) {\n+\t\t\t\tif (record_match(i, size, calls) !=\n+\t\t\t\t    TEST_SUCCESS)\n+\t\t\t\t\treturn TEST_FAILED;\n+\t\t\t}\n+\t\t}\n+\t} else {\n+\t\tif (full_range && rand_bool()) {\n+\t\t\tRTE_BITSET_FOREACH_CLEAR(i, bitset, size)\n+\t\t\t\tif (record_match(i, size, calls) !=\n+\t\t\t\t    TEST_SUCCESS)\n+\t\t\t\t\treturn TEST_FAILED;\n+\t\t} else if (may_wrap) {\n+\t\t\tRTE_BITSET_FOREACH_CLEAR_WRAP(i, bitset, size,\n+\t\t\t\t\t\t      start_bit, len) {\n+\t\t\t\tif (record_match(i, size, calls) !=\n+\t\t\t\t    TEST_SUCCESS)\n+\t\t\t\t\treturn TEST_FAILED;\n+\t\t\t}\n+\t\t} else {\n+\t\t\tRTE_BITSET_FOREACH_CLEAR_RANGE(i, bitset, size,\n+\t\t\t\t\t\t       start_bit, len)\n+\t\t\t\tif (record_match(i, size, calls) !=\n+\t\t\t\t    TEST_SUCCESS)\n+\t\t\t\t\treturn TEST_FAILED;\n+\t\t}\n+\t}\n+\n+\tfor (i = 0; i < len; i++) {\n+\t\tsize_t idx = (start_bit + i) % size;\n+\n+\t\tif (reference[idx] == set && calls[idx] != 1) {\n+\t\t\tprintf(\"bit %zd shouldn't have been found %d \"\n+\t\t\t       \"times\\n\", idx, calls[idx]);\n+\t\t\treturn TEST_FAILED;\n+\t\t}\n+\n+\t\tif (reference[idx] != set && calls[idx] != 0) {\n+\t\t\tputs(\"bar\");\n+\t\t\treturn TEST_FAILED;\n+\t\t}\n+\n+\t\ttotal_calls += calls[idx];\n+\t}\n+\n+\tif (full_range) {\n+\t\tsize_t count;\n+\n+\t\tcount = set ? rte_bitset_count_set(bitset, size) :\n+\t\t\trte_bitset_count_clear(bitset, size);\n+\n+\t\tif (count != total_calls)\n+\t\t\treturn TEST_FAILED;\n+\t}\n+\n+\tTEST_ASSERT_EQUAL(free_bitset(bitset, size), TEST_SUCCESS,\n+\t\t\t  \"Buffer over- or underrun detected\");\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_foreach(void)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < RAND_ITERATIONS; i++) {\n+\t\tsize_t size = 1 + rte_rand_max(RAND_SET_MAX_SIZE - 1);\n+\n+\t\tif (test_foreach_size(size, false, true) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\n+\t\tif (test_foreach_size(size, false, false) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\n+\t\tif (test_foreach_size(size, true, true) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\n+\t\tif (test_foreach_size(size, true, false) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_count_size(size_t size)\n+{\n+\tuint64_t *bitset;\n+\n+\tbitset = alloc_bitset(size);\n+\n+\tTEST_ASSERT(bitset != NULL, \"Failed to allocate memory\");\n+\n+\trte_bitset_init(bitset, size);\n+\n+\trand_unused_bits(bitset, size);\n+\n+\tif (rte_bitset_count_set(bitset, size) != 0)\n+\t\treturn TEST_FAILED;\n+\n+\tif (rte_bitset_count_clear(bitset, size) != size)\n+\t\treturn TEST_FAILED;\n+\n+\trte_bitset_set_all(bitset, size);\n+\n+\tif (rte_bitset_count_set(bitset, size) != size)\n+\t\treturn TEST_FAILED;\n+\n+\tif (rte_bitset_count_clear(bitset, size) != 0)\n+\t\treturn TEST_FAILED;\n+\n+\trte_bitset_clear_all(bitset, size);\n+\n+\tif (rte_bitset_count_set(bitset, size) != 0)\n+\t\treturn TEST_FAILED;\n+\n+\tif (rte_bitset_count_clear(bitset, size) != size)\n+\t\treturn TEST_FAILED;\n+\n+\trte_bitset_set(bitset, rte_rand_max(size));\n+\n+\tif (rte_bitset_count_set(bitset, size) != 1)\n+\t\treturn TEST_FAILED;\n+\n+\tif (rte_bitset_count_clear(bitset, size) != (size - 1))\n+\t\treturn TEST_FAILED;\n+\n+\trte_bitset_clear_all(bitset, size);\n+\tif (rte_bitset_count_set(bitset, size) != 0)\n+\t\treturn TEST_FAILED;\n+\tif (rte_bitset_count_clear(bitset, size) != size)\n+\t\treturn TEST_FAILED;\n+\n+\trte_bitset_set_all(bitset, size);\n+\tif (rte_bitset_count_set(bitset, size) != size)\n+\t\treturn TEST_FAILED;\n+\tif (rte_bitset_count_clear(bitset, size) != 0)\n+\t\treturn TEST_FAILED;\n+\n+\tTEST_ASSERT_EQUAL(free_bitset(bitset, size), TEST_SUCCESS,\n+\t\t\t  \"Buffer over- or underrun detected\");\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_count(void)\n+{\n+\tsize_t i;\n+\n+\tif (test_count_size(128) != TEST_SUCCESS)\n+\t\treturn TEST_FAILED;\n+\tif (test_count_size(1) != TEST_SUCCESS)\n+\t\treturn TEST_FAILED;\n+\tif (test_count_size(63) != TEST_SUCCESS)\n+\t\treturn TEST_FAILED;\n+\tif (test_count_size(64) != TEST_SUCCESS)\n+\t\treturn TEST_FAILED;\n+\tif (test_count_size(65) != TEST_SUCCESS)\n+\t\treturn TEST_FAILED;\n+\n+\tfor (i = 0; i < RAND_ITERATIONS; i++) {\n+\t\tsize_t size = 1 + rte_rand_max(RAND_SET_MAX_SIZE - 1);\n+\n+\t\tif (test_count_size(size) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+#define GEN_DECLARE(size)\t\t\t\t\t\t\\\n+\t{\t\t\t\t\t\t\t\t\\\n+\t\tRTE_BITSET_DECLARE(bitset, size);\t\t\t\\\n+\t\tsize_t idx;\t\t\t\t\t\t\\\n+\t\t\t\t\t\t\t\t\t\\\n+\t\tidx = rte_rand_max(size);\t\t\t\t\\\n+\t\trte_bitset_init(bitset, size);\t\t\t\t\\\n+\t\t\t\t\t\t\t\t\t\\\n+\t\trte_bitset_set(bitset, idx);\t\t\t\t\\\n+\t\tif (!rte_bitset_test(bitset, idx))\t\t\t\\\n+\t\t\treturn TEST_FAILED;\t\t\t\t\\\n+\t\tif (rte_bitset_count_set(bitset, size) != 1)\t\t\\\n+\t\t\treturn TEST_FAILED;\t\t\t\t\\\n+\t\treturn TEST_SUCCESS;\t\t\t\t\t\\\n+\t}\n+\n+static int\n+test_define(void)\n+{\n+\tGEN_DECLARE(1);\n+\tGEN_DECLARE(64);\n+\tGEN_DECLARE(65);\n+\tGEN_DECLARE(4097);\n+}\n+\n+static int test_logic_op(void (*bitset_op)(uint64_t *, const uint64_t *,\n+\t\t\t\t\t   const uint64_t *, size_t),\n+\t\t\t bool (*bool_op)(bool, bool))\n+{\n+\tconst size_t size = 1 + rte_rand_max(200);\n+\tRTE_BITSET_DECLARE(bitset_a, size);\n+\tRTE_BITSET_DECLARE(bitset_b, size);\n+\tRTE_BITSET_DECLARE(bitset_d, size);\n+\n+\tbool ary_a[size];\n+\tbool ary_b[size];\n+\tbool ary_d[size];\n+\n+\trand_bool_ary(ary_a, size);\n+\trand_bool_ary(ary_b, size);\n+\n+\tsize_t i;\n+\tfor (i = 0; i < size; i++) {\n+\t\trte_bitset_assign(bitset_a, i, ary_a[i]);\n+\t\trte_bitset_assign(bitset_b, i, ary_b[i]);\n+\t\tary_d[i] = bool_op(ary_a[i], ary_b[i]);\n+\t}\n+\n+\tbitset_op(bitset_d, bitset_a, bitset_b, size);\n+\n+\tfor (i = 0; i < size; i++)\n+\t\tTEST_ASSERT_EQUAL(rte_bitset_test(bitset_d, i),\n+\t\t\t\t  ary_d[i], \"Unexpected value of bit %zd\", i);\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static bool\n+bool_or(bool a, bool b)\n+{\n+\treturn a || b;\n+}\n+\n+static int\n+test_or(void)\n+{\n+\treturn test_logic_op(rte_bitset_or, bool_or);\n+}\n+\n+static bool\n+bool_and(bool a, bool b)\n+{\n+\treturn a && b;\n+}\n+\n+static int\n+test_and(void)\n+{\n+\treturn test_logic_op(rte_bitset_and, bool_and);\n+}\n+\n+static bool\n+bool_xor(bool a, bool b)\n+{\n+\treturn a != b;\n+}\n+\n+static int\n+test_xor(void)\n+{\n+\treturn test_logic_op(rte_bitset_xor, bool_xor);\n+}\n+\n+static int\n+test_complement(void)\n+{\n+\tint i;\n+\n+\tfor (i = 0; i < RAND_ITERATIONS; i++) {\n+\t\tconst size_t size = 1 + rte_rand_max(RAND_SET_MAX_SIZE - 1);\n+\n+\t\tRTE_BITSET_DECLARE(src, size);\n+\n+\t\trand_bitset(src, size);\n+\n+\t\tbool bit_idx = rte_rand_max(size);\n+\t\tbool bit_value = rte_bitset_test(src, bit_idx);\n+\n+\t\tRTE_BITSET_DECLARE(dst, size);\n+\n+\t\trte_bitset_complement(dst, src, size);\n+\n+\t\tTEST_ASSERT(bit_value != rte_bitset_test(dst, bit_idx),\n+\t\t\t    \"Bit %d was not flipped\", bit_idx);\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_shift(bool right)\n+{\n+\tint i;\n+\n+\tconst char *direction = right ? \"right\" : \"left\";\n+\n+\tfor (i = 0; i < 10000; i++) {\n+\t\tconst int size = 1 + (int)rte_rand_max(500);\n+\t\tconst int shift_count = (int)rte_rand_max(1.5 * size);\n+\t\tint src_idx;\n+\n+\t\tRTE_BITSET_DECLARE(src, size);\n+\t\tRTE_BITSET_DECLARE(reference, size);\n+\n+\t\trte_bitset_init(src, size);\n+\t\trte_bitset_init(reference, size);\n+\n+\t\trand_unused_bits(src, size);\n+\t\trand_unused_bits(reference, size);\n+\n+\t\tfor (src_idx = 0; src_idx < size; src_idx++) {\n+\t\t\tbool value = rand_bool();\n+\n+\t\t\trte_bitset_assign(src, src_idx, value);\n+\n+\t\t\tint dst_idx = right ? src_idx - shift_count :\n+\t\t\t\tsrc_idx + shift_count;\n+\n+\t\t\tif (dst_idx >= 0 && dst_idx < size)\n+\t\t\t\trte_bitset_assign(reference, dst_idx, value);\n+\t\t}\n+\n+\t\tuint64_t *dst = alloc_bitset(size);\n+\n+\t\tif (right)\n+\t\t\trte_bitset_shift_right(dst, src, size, shift_count);\n+\t\telse\n+\t\t\trte_bitset_shift_left(dst, src, size, shift_count);\n+\n+\t\tTEST_ASSERT(rte_bitset_equal(dst, reference, size),\n+\t\t\t    \"Unexpected result from shifting bitset of size \"\n+\t\t\t    \"%d bits %d bits %s\", size, shift_count, direction);\n+\n+\t\tTEST_ASSERT_EQUAL(free_bitset(dst, size), TEST_SUCCESS,\n+\t\t\t\t  \"Shift %s operation overwrote buffer\",\n+\t\t\t\t  direction);\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_shift_right(void)\n+{\n+\treturn test_shift(true);\n+}\n+\n+static int\n+test_shift_left(void)\n+{\n+\treturn test_shift(false);\n+}\n+\n+static int\n+test_equal(void)\n+{\n+\tconst size_t size = 100;\n+\tRTE_BITSET_DECLARE(bitset_a, size);\n+\tRTE_BITSET_DECLARE(bitset_b, size);\n+\n+\trand_buf(bitset_a, RTE_BITSET_SIZE(size));\n+\trand_buf(bitset_b, RTE_BITSET_SIZE(size));\n+\n+\trte_bitset_init(bitset_a, size);\n+\trte_bitset_init(bitset_b, size);\n+\n+\trte_bitset_set(bitset_a, 9);\n+\trte_bitset_set(bitset_b, 9);\n+\trte_bitset_set(bitset_a, 90);\n+\trte_bitset_set(bitset_b, 90);\n+\n+\tif (!rte_bitset_equal(bitset_a, bitset_b, size))\n+\t\treturn TEST_FAILED;\n+\n+\t/* set unused bit, which should be ignored */\n+\trte_bitset_set(&bitset_a[1], 60);\n+\n+\tif (!rte_bitset_equal(bitset_a, bitset_b, size))\n+\t\treturn TEST_FAILED;\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_copy(void)\n+{\n+\tconst size_t size = 100;\n+\tRTE_BITSET_DECLARE(bitset_a, size);\n+\tRTE_BITSET_DECLARE(bitset_b, size);\n+\n+\trand_buf(bitset_a, RTE_BITSET_SIZE(size));\n+\trand_buf(bitset_b, RTE_BITSET_SIZE(size));\n+\n+\trte_bitset_copy(bitset_a, bitset_b, size);\n+\n+\tif (!rte_bitset_equal(bitset_a, bitset_b, size))\n+\t\treturn TEST_FAILED;\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_to_str(void)\n+{\n+\tchar buf[1024];\n+\tRTE_BITSET_DECLARE(bitset, 128);\n+\n+\trte_bitset_init(bitset, 128);\n+\trte_bitset_set(bitset, 1);\n+\n+\tif (rte_bitset_to_str(bitset, 2, buf, 3) != 3)\n+\t\treturn TEST_FAILED;\n+\tif (strcmp(buf, \"10\") != 0)\n+\t\treturn TEST_FAILED;\n+\n+\trte_bitset_set(bitset, 0);\n+\n+\tif (rte_bitset_to_str(bitset, 1, buf, sizeof(buf)) != 2)\n+\t\treturn TEST_FAILED;\n+\tif (strcmp(buf, \"1\") != 0)\n+\t\treturn TEST_FAILED;\n+\n+\trte_bitset_init(bitset, 99);\n+\trte_bitset_set(bitset, 98);\n+\n+\tif (rte_bitset_to_str(bitset, 99, buf, sizeof(buf)) != 100)\n+\t\treturn TEST_FAILED;\n+\n+\tif (buf[0] != '1' || strchr(&buf[1], '1') != NULL)\n+\t\treturn TEST_FAILED;\n+\n+\tif (rte_bitset_to_str(bitset, 128, buf, 64) != -EINVAL)\n+\t\treturn TEST_FAILED;\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static struct unit_test_suite bitset_tests  = {\n+\t.suite_name = \"bitset test suite\",\n+\t.unit_test_cases = {\n+\t\tTEST_CASE_ST(NULL, NULL, test_set_clear),\n+\t\tTEST_CASE_ST(NULL, NULL, test_flip),\n+\t\tTEST_CASE_ST(NULL, NULL, test_find),\n+\t\tTEST_CASE_ST(NULL, NULL, test_foreach),\n+\t\tTEST_CASE_ST(NULL, NULL, test_count),\n+\t\tTEST_CASE_ST(NULL, NULL, test_define),\n+\t\tTEST_CASE_ST(NULL, NULL, test_or),\n+\t\tTEST_CASE_ST(NULL, NULL, test_and),\n+\t\tTEST_CASE_ST(NULL, NULL, test_xor),\n+\t\tTEST_CASE_ST(NULL, NULL, test_complement),\n+\t\tTEST_CASE_ST(NULL, NULL, test_shift_right),\n+\t\tTEST_CASE_ST(NULL, NULL, test_shift_left),\n+\t\tTEST_CASE_ST(NULL, NULL, test_equal),\n+\t\tTEST_CASE_ST(NULL, NULL, test_copy),\n+\t\tTEST_CASE_ST(NULL, NULL, test_to_str),\n+\t\tTEST_CASES_END()\n+\t}\n+};\n+\n+static int\n+test_bitset(void)\n+{\n+\treturn unit_test_suite_runner(&bitset_tests);\n+}\n+\n+REGISTER_FAST_TEST(bitset_autotest, true, true, test_bitset);\n",
    "prefixes": [
        "RFC",
        "v4",
        "2/4"
    ]
}