167d63751SSteen Hegelund // SPDX-License-Identifier: BSD-3-Clause
267d63751SSteen Hegelund /* Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries.
367d63751SSteen Hegelund * Microchip VCAP API kunit test suite
467d63751SSteen Hegelund */
567d63751SSteen Hegelund
667d63751SSteen Hegelund #include <kunit/test.h>
767d63751SSteen Hegelund #include "vcap_api.h"
867d63751SSteen Hegelund #include "vcap_api_client.h"
967d63751SSteen Hegelund #include "vcap_model_kunit.h"
1067d63751SSteen Hegelund
1167d63751SSteen Hegelund /* First we have the test infrastructure that emulates the platform
1267d63751SSteen Hegelund * implementation
1367d63751SSteen Hegelund */
1467d63751SSteen Hegelund #define TEST_BUF_CNT 100
1567d63751SSteen Hegelund #define TEST_BUF_SZ 350
1667d63751SSteen Hegelund #define STREAMWSIZE 64
1767d63751SSteen Hegelund
1867d63751SSteen Hegelund static u32 test_updateaddr[STREAMWSIZE] = {};
1967d63751SSteen Hegelund static int test_updateaddridx;
2067d63751SSteen Hegelund static int test_cache_erase_count;
2167d63751SSteen Hegelund static u32 test_init_start;
2267d63751SSteen Hegelund static u32 test_init_count;
2367d63751SSteen Hegelund static u32 test_hw_counter_id;
2467d63751SSteen Hegelund static struct vcap_cache_data test_hw_cache;
25c956b9b3SSteen Hegelund static struct net_device test_netdev = {};
26dccc30ccSSteen Hegelund static int test_move_addr;
27dccc30ccSSteen Hegelund static int test_move_offset;
28dccc30ccSSteen Hegelund static int test_move_count;
2967d63751SSteen Hegelund
3067d63751SSteen Hegelund /* Callback used by the VCAP API */
test_val_keyset(struct net_device * ndev,struct vcap_admin * admin,struct vcap_rule * rule,struct vcap_keyset_list * kslist,u16 l3_proto)3167d63751SSteen Hegelund static enum vcap_keyfield_set test_val_keyset(struct net_device *ndev,
3267d63751SSteen Hegelund struct vcap_admin *admin,
3367d63751SSteen Hegelund struct vcap_rule *rule,
3467d63751SSteen Hegelund struct vcap_keyset_list *kslist,
3567d63751SSteen Hegelund u16 l3_proto)
3667d63751SSteen Hegelund {
3767d63751SSteen Hegelund int idx;
3867d63751SSteen Hegelund
3967d63751SSteen Hegelund if (kslist->cnt > 0) {
4067d63751SSteen Hegelund switch (admin->vtype) {
4167d63751SSteen Hegelund case VCAP_TYPE_IS0:
4267d63751SSteen Hegelund for (idx = 0; idx < kslist->cnt; idx++) {
4367d63751SSteen Hegelund if (kslist->keysets[idx] == VCAP_KFS_ETAG)
4467d63751SSteen Hegelund return kslist->keysets[idx];
4567d63751SSteen Hegelund if (kslist->keysets[idx] == VCAP_KFS_PURE_5TUPLE_IP4)
4667d63751SSteen Hegelund return kslist->keysets[idx];
4767d63751SSteen Hegelund if (kslist->keysets[idx] == VCAP_KFS_NORMAL_5TUPLE_IP4)
4867d63751SSteen Hegelund return kslist->keysets[idx];
4967d63751SSteen Hegelund if (kslist->keysets[idx] == VCAP_KFS_NORMAL_7TUPLE)
5067d63751SSteen Hegelund return kslist->keysets[idx];
5167d63751SSteen Hegelund }
5267d63751SSteen Hegelund break;
5367d63751SSteen Hegelund case VCAP_TYPE_IS2:
5467d63751SSteen Hegelund for (idx = 0; idx < kslist->cnt; idx++) {
5567d63751SSteen Hegelund if (kslist->keysets[idx] == VCAP_KFS_MAC_ETYPE)
5667d63751SSteen Hegelund return kslist->keysets[idx];
5767d63751SSteen Hegelund if (kslist->keysets[idx] == VCAP_KFS_ARP)
5867d63751SSteen Hegelund return kslist->keysets[idx];
5967d63751SSteen Hegelund if (kslist->keysets[idx] == VCAP_KFS_IP_7TUPLE)
6067d63751SSteen Hegelund return kslist->keysets[idx];
6167d63751SSteen Hegelund }
6267d63751SSteen Hegelund break;
6367d63751SSteen Hegelund default:
6467d63751SSteen Hegelund pr_info("%s:%d: no validation for VCAP %d\n",
6567d63751SSteen Hegelund __func__, __LINE__, admin->vtype);
6667d63751SSteen Hegelund break;
6767d63751SSteen Hegelund }
6867d63751SSteen Hegelund }
6967d63751SSteen Hegelund return -EINVAL;
7067d63751SSteen Hegelund }
7167d63751SSteen Hegelund
7267d63751SSteen Hegelund /* Callback used by the VCAP API */
test_add_def_fields(struct net_device * ndev,struct vcap_admin * admin,struct vcap_rule * rule)7367d63751SSteen Hegelund static void test_add_def_fields(struct net_device *ndev,
7467d63751SSteen Hegelund struct vcap_admin *admin,
7567d63751SSteen Hegelund struct vcap_rule *rule)
7667d63751SSteen Hegelund {
7767d63751SSteen Hegelund if (admin->vinst == 0 || admin->vinst == 2)
7867d63751SSteen Hegelund vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS, VCAP_BIT_1);
7967d63751SSteen Hegelund else
8067d63751SSteen Hegelund vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS, VCAP_BIT_0);
8167d63751SSteen Hegelund }
8267d63751SSteen Hegelund
8367d63751SSteen Hegelund /* Callback used by the VCAP API */
test_cache_erase(struct vcap_admin * admin)8467d63751SSteen Hegelund static void test_cache_erase(struct vcap_admin *admin)
8567d63751SSteen Hegelund {
8667d63751SSteen Hegelund if (test_cache_erase_count) {
8767d63751SSteen Hegelund memset(admin->cache.keystream, 0, test_cache_erase_count);
8867d63751SSteen Hegelund memset(admin->cache.maskstream, 0, test_cache_erase_count);
8967d63751SSteen Hegelund memset(admin->cache.actionstream, 0, test_cache_erase_count);
9067d63751SSteen Hegelund test_cache_erase_count = 0;
9167d63751SSteen Hegelund }
9267d63751SSteen Hegelund }
9367d63751SSteen Hegelund
9467d63751SSteen Hegelund /* Callback used by the VCAP API */
test_cache_init(struct net_device * ndev,struct vcap_admin * admin,u32 start,u32 count)9567d63751SSteen Hegelund static void test_cache_init(struct net_device *ndev, struct vcap_admin *admin,
9667d63751SSteen Hegelund u32 start, u32 count)
9767d63751SSteen Hegelund {
9867d63751SSteen Hegelund test_init_start = start;
9967d63751SSteen Hegelund test_init_count = count;
10067d63751SSteen Hegelund }
10167d63751SSteen Hegelund
10267d63751SSteen Hegelund /* Callback used by the VCAP API */
test_cache_read(struct net_device * ndev,struct vcap_admin * admin,enum vcap_selection sel,u32 start,u32 count)10367d63751SSteen Hegelund static void test_cache_read(struct net_device *ndev, struct vcap_admin *admin,
10467d63751SSteen Hegelund enum vcap_selection sel, u32 start, u32 count)
10567d63751SSteen Hegelund {
10667d63751SSteen Hegelund u32 *keystr, *mskstr, *actstr;
10767d63751SSteen Hegelund int idx;
10867d63751SSteen Hegelund
10967d63751SSteen Hegelund pr_debug("%s:%d: %d %d\n", __func__, __LINE__, start, count);
11067d63751SSteen Hegelund switch (sel) {
11167d63751SSteen Hegelund case VCAP_SEL_ENTRY:
11267d63751SSteen Hegelund keystr = &admin->cache.keystream[start];
11367d63751SSteen Hegelund mskstr = &admin->cache.maskstream[start];
11467d63751SSteen Hegelund for (idx = 0; idx < count; ++idx) {
11567d63751SSteen Hegelund pr_debug("%s:%d: keydata[%02d]: 0x%08x\n", __func__,
11667d63751SSteen Hegelund __LINE__, start + idx, keystr[idx]);
11767d63751SSteen Hegelund }
11867d63751SSteen Hegelund for (idx = 0; idx < count; ++idx) {
11967d63751SSteen Hegelund /* Invert the mask before decoding starts */
12067d63751SSteen Hegelund mskstr[idx] = ~mskstr[idx];
12167d63751SSteen Hegelund pr_debug("%s:%d: mskdata[%02d]: 0x%08x\n", __func__,
12267d63751SSteen Hegelund __LINE__, start + idx, mskstr[idx]);
12367d63751SSteen Hegelund }
12467d63751SSteen Hegelund break;
12567d63751SSteen Hegelund case VCAP_SEL_ACTION:
12667d63751SSteen Hegelund actstr = &admin->cache.actionstream[start];
12767d63751SSteen Hegelund for (idx = 0; idx < count; ++idx) {
12867d63751SSteen Hegelund pr_debug("%s:%d: actdata[%02d]: 0x%08x\n", __func__,
12967d63751SSteen Hegelund __LINE__, start + idx, actstr[idx]);
13067d63751SSteen Hegelund }
13167d63751SSteen Hegelund break;
13267d63751SSteen Hegelund case VCAP_SEL_COUNTER:
13367d63751SSteen Hegelund pr_debug("%s:%d\n", __func__, __LINE__);
13467d63751SSteen Hegelund test_hw_counter_id = start;
13567d63751SSteen Hegelund admin->cache.counter = test_hw_cache.counter;
13667d63751SSteen Hegelund admin->cache.sticky = test_hw_cache.sticky;
13767d63751SSteen Hegelund break;
13867d63751SSteen Hegelund case VCAP_SEL_ALL:
13967d63751SSteen Hegelund pr_debug("%s:%d\n", __func__, __LINE__);
14067d63751SSteen Hegelund break;
14167d63751SSteen Hegelund }
14267d63751SSteen Hegelund }
14367d63751SSteen Hegelund
14467d63751SSteen Hegelund /* Callback used by the VCAP API */
test_cache_write(struct net_device * ndev,struct vcap_admin * admin,enum vcap_selection sel,u32 start,u32 count)14567d63751SSteen Hegelund static void test_cache_write(struct net_device *ndev, struct vcap_admin *admin,
14667d63751SSteen Hegelund enum vcap_selection sel, u32 start, u32 count)
14767d63751SSteen Hegelund {
14867d63751SSteen Hegelund u32 *keystr, *mskstr, *actstr;
14967d63751SSteen Hegelund int idx;
15067d63751SSteen Hegelund
15167d63751SSteen Hegelund switch (sel) {
15267d63751SSteen Hegelund case VCAP_SEL_ENTRY:
15367d63751SSteen Hegelund keystr = &admin->cache.keystream[start];
15467d63751SSteen Hegelund mskstr = &admin->cache.maskstream[start];
15567d63751SSteen Hegelund for (idx = 0; idx < count; ++idx) {
15667d63751SSteen Hegelund pr_debug("%s:%d: keydata[%02d]: 0x%08x\n", __func__,
15767d63751SSteen Hegelund __LINE__, start + idx, keystr[idx]);
15867d63751SSteen Hegelund }
15967d63751SSteen Hegelund for (idx = 0; idx < count; ++idx) {
16067d63751SSteen Hegelund /* Invert the mask before encoding starts */
16167d63751SSteen Hegelund mskstr[idx] = ~mskstr[idx];
16267d63751SSteen Hegelund pr_debug("%s:%d: mskdata[%02d]: 0x%08x\n", __func__,
16367d63751SSteen Hegelund __LINE__, start + idx, mskstr[idx]);
16467d63751SSteen Hegelund }
16567d63751SSteen Hegelund break;
16667d63751SSteen Hegelund case VCAP_SEL_ACTION:
16767d63751SSteen Hegelund actstr = &admin->cache.actionstream[start];
16867d63751SSteen Hegelund for (idx = 0; idx < count; ++idx) {
16967d63751SSteen Hegelund pr_debug("%s:%d: actdata[%02d]: 0x%08x\n", __func__,
17067d63751SSteen Hegelund __LINE__, start + idx, actstr[idx]);
17167d63751SSteen Hegelund }
17267d63751SSteen Hegelund break;
17367d63751SSteen Hegelund case VCAP_SEL_COUNTER:
17467d63751SSteen Hegelund pr_debug("%s:%d\n", __func__, __LINE__);
17567d63751SSteen Hegelund test_hw_counter_id = start;
17667d63751SSteen Hegelund test_hw_cache.counter = admin->cache.counter;
17767d63751SSteen Hegelund test_hw_cache.sticky = admin->cache.sticky;
17867d63751SSteen Hegelund break;
17967d63751SSteen Hegelund case VCAP_SEL_ALL:
18067d63751SSteen Hegelund pr_err("%s:%d: cannot write all streams at once\n",
18167d63751SSteen Hegelund __func__, __LINE__);
18267d63751SSteen Hegelund break;
18367d63751SSteen Hegelund }
18467d63751SSteen Hegelund }
18567d63751SSteen Hegelund
18667d63751SSteen Hegelund /* Callback used by the VCAP API */
test_cache_update(struct net_device * ndev,struct vcap_admin * admin,enum vcap_command cmd,enum vcap_selection sel,u32 addr)18767d63751SSteen Hegelund static void test_cache_update(struct net_device *ndev, struct vcap_admin *admin,
18867d63751SSteen Hegelund enum vcap_command cmd,
18967d63751SSteen Hegelund enum vcap_selection sel, u32 addr)
19067d63751SSteen Hegelund {
19167d63751SSteen Hegelund if (test_updateaddridx < ARRAY_SIZE(test_updateaddr))
19267d63751SSteen Hegelund test_updateaddr[test_updateaddridx] = addr;
19367d63751SSteen Hegelund else
19467d63751SSteen Hegelund pr_err("%s:%d: overflow: %d\n", __func__, __LINE__, test_updateaddridx);
19567d63751SSteen Hegelund test_updateaddridx++;
19667d63751SSteen Hegelund }
19767d63751SSteen Hegelund
test_cache_move(struct net_device * ndev,struct vcap_admin * admin,u32 addr,int offset,int count)19867d63751SSteen Hegelund static void test_cache_move(struct net_device *ndev, struct vcap_admin *admin,
19967d63751SSteen Hegelund u32 addr, int offset, int count)
20067d63751SSteen Hegelund {
201dccc30ccSSteen Hegelund test_move_addr = addr;
202dccc30ccSSteen Hegelund test_move_offset = offset;
203dccc30ccSSteen Hegelund test_move_count = count;
20467d63751SSteen Hegelund }
20567d63751SSteen Hegelund
20667d63751SSteen Hegelund /* Provide port information via a callback interface */
vcap_test_port_info(struct net_device * ndev,struct vcap_admin * admin,struct vcap_output_print * out)207e0305cc1SSteen Hegelund static int vcap_test_port_info(struct net_device *ndev,
208e0305cc1SSteen Hegelund struct vcap_admin *admin,
209e0305cc1SSteen Hegelund struct vcap_output_print *out)
21067d63751SSteen Hegelund {
21167d63751SSteen Hegelund return 0;
21267d63751SSteen Hegelund }
21367d63751SSteen Hegelund
214e8572f03SYang Yingliang static struct vcap_operations test_callbacks = {
21567d63751SSteen Hegelund .validate_keyset = test_val_keyset,
21667d63751SSteen Hegelund .add_default_fields = test_add_def_fields,
21767d63751SSteen Hegelund .cache_erase = test_cache_erase,
21867d63751SSteen Hegelund .cache_write = test_cache_write,
21967d63751SSteen Hegelund .cache_read = test_cache_read,
22067d63751SSteen Hegelund .init = test_cache_init,
22167d63751SSteen Hegelund .update = test_cache_update,
22267d63751SSteen Hegelund .move = test_cache_move,
22367d63751SSteen Hegelund .port_info = vcap_test_port_info,
22467d63751SSteen Hegelund };
22567d63751SSteen Hegelund
226e8572f03SYang Yingliang static struct vcap_control test_vctrl = {
22767d63751SSteen Hegelund .vcaps = kunit_test_vcaps,
22867d63751SSteen Hegelund .stats = &kunit_test_vcap_stats,
22967d63751SSteen Hegelund .ops = &test_callbacks,
23067d63751SSteen Hegelund };
23167d63751SSteen Hegelund
vcap_test_api_init(struct vcap_admin * admin)23267d63751SSteen Hegelund static void vcap_test_api_init(struct vcap_admin *admin)
23367d63751SSteen Hegelund {
23467d63751SSteen Hegelund /* Initialize the shared objects */
23567d63751SSteen Hegelund INIT_LIST_HEAD(&test_vctrl.list);
23667d63751SSteen Hegelund INIT_LIST_HEAD(&admin->list);
23767d63751SSteen Hegelund INIT_LIST_HEAD(&admin->rules);
23801ef75a2SSteen Hegelund INIT_LIST_HEAD(&admin->enabled);
239595655e0SSteen Hegelund mutex_init(&admin->lock);
24067d63751SSteen Hegelund list_add_tail(&admin->list, &test_vctrl.list);
24167d63751SSteen Hegelund memset(test_updateaddr, 0, sizeof(test_updateaddr));
24267d63751SSteen Hegelund test_updateaddridx = 0;
24367d63751SSteen Hegelund }
24467d63751SSteen Hegelund
245dccc30ccSSteen Hegelund /* Helper function to create a rule of a specific size */
test_vcap_xn_rule_creator(struct kunit * test,int cid,enum vcap_user user,u16 priority,int id,int size,int expected_addr)24620146fa7SJinjie Ruan static void test_vcap_xn_rule_creator(struct kunit *test, int cid,
24720146fa7SJinjie Ruan enum vcap_user user, u16 priority,
248dccc30ccSSteen Hegelund int id, int size, int expected_addr)
249dccc30ccSSteen Hegelund {
250aa5ac4beSHoratiu Vultur struct vcap_rule *rule;
251aa5ac4beSHoratiu Vultur struct vcap_rule_internal *ri;
252dccc30ccSSteen Hegelund enum vcap_keyfield_set keyset = VCAP_KFS_NO_VALUE;
253dccc30ccSSteen Hegelund enum vcap_actionfield_set actionset = VCAP_AFS_NO_VALUE;
254dccc30ccSSteen Hegelund int ret;
255dccc30ccSSteen Hegelund
256dccc30ccSSteen Hegelund /* init before testing */
257dccc30ccSSteen Hegelund memset(test_updateaddr, 0, sizeof(test_updateaddr));
258dccc30ccSSteen Hegelund test_updateaddridx = 0;
259dccc30ccSSteen Hegelund test_move_addr = 0;
260dccc30ccSSteen Hegelund test_move_offset = 0;
261dccc30ccSSteen Hegelund test_move_count = 0;
262dccc30ccSSteen Hegelund
263dccc30ccSSteen Hegelund switch (size) {
264dccc30ccSSteen Hegelund case 2:
265dccc30ccSSteen Hegelund keyset = VCAP_KFS_ETAG;
266dccc30ccSSteen Hegelund actionset = VCAP_AFS_CLASS_REDUCED;
267dccc30ccSSteen Hegelund break;
268dccc30ccSSteen Hegelund case 3:
269dccc30ccSSteen Hegelund keyset = VCAP_KFS_PURE_5TUPLE_IP4;
270dccc30ccSSteen Hegelund actionset = VCAP_AFS_CLASSIFICATION;
271dccc30ccSSteen Hegelund break;
272dccc30ccSSteen Hegelund case 6:
273dccc30ccSSteen Hegelund keyset = VCAP_KFS_NORMAL_5TUPLE_IP4;
274dccc30ccSSteen Hegelund actionset = VCAP_AFS_CLASSIFICATION;
275dccc30ccSSteen Hegelund break;
276dccc30ccSSteen Hegelund case 12:
277dccc30ccSSteen Hegelund keyset = VCAP_KFS_NORMAL_7TUPLE;
278dccc30ccSSteen Hegelund actionset = VCAP_AFS_FULL;
279dccc30ccSSteen Hegelund break;
280dccc30ccSSteen Hegelund default:
281dccc30ccSSteen Hegelund break;
282dccc30ccSSteen Hegelund }
283dccc30ccSSteen Hegelund
284dccc30ccSSteen Hegelund /* Check that a valid size was used */
285dccc30ccSSteen Hegelund KUNIT_ASSERT_NE(test, VCAP_KFS_NO_VALUE, keyset);
286dccc30ccSSteen Hegelund
287dccc30ccSSteen Hegelund /* Allocate the rule */
288dccc30ccSSteen Hegelund rule = vcap_alloc_rule(&test_vctrl, &test_netdev, cid, user, priority,
289dccc30ccSSteen Hegelund id);
290dccc30ccSSteen Hegelund KUNIT_EXPECT_PTR_NE(test, NULL, rule);
291dccc30ccSSteen Hegelund
292dccc30ccSSteen Hegelund ri = (struct vcap_rule_internal *)rule;
293dccc30ccSSteen Hegelund
294dccc30ccSSteen Hegelund /* Override rule keyset */
295dccc30ccSSteen Hegelund ret = vcap_set_rule_set_keyset(rule, keyset);
296dccc30ccSSteen Hegelund
297dccc30ccSSteen Hegelund /* Add rule actions : there must be at least one action */
298f274a659SSteen Hegelund ret = vcap_rule_add_action_u32(rule, VCAP_AF_ISDX_VAL, 0);
299dccc30ccSSteen Hegelund
300dccc30ccSSteen Hegelund /* Override rule actionset */
301dccc30ccSSteen Hegelund ret = vcap_set_rule_set_actionset(rule, actionset);
302dccc30ccSSteen Hegelund
303dccc30ccSSteen Hegelund ret = vcap_val_rule(rule, ETH_P_ALL);
304dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
305dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, keyset, rule->keyset);
306dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, actionset, rule->actionset);
307dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, size, ri->size);
308dccc30ccSSteen Hegelund
309dccc30ccSSteen Hegelund /* Add rule with write callback */
310dccc30ccSSteen Hegelund ret = vcap_add_rule(rule);
311dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
312dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, expected_addr, ri->addr);
31320146fa7SJinjie Ruan vcap_free_rule(rule);
314dccc30ccSSteen Hegelund }
315dccc30ccSSteen Hegelund
316dccc30ccSSteen Hegelund /* Prepare testing rule deletion */
test_init_rule_deletion(void)317dccc30ccSSteen Hegelund static void test_init_rule_deletion(void)
318dccc30ccSSteen Hegelund {
319dccc30ccSSteen Hegelund test_move_addr = 0;
320dccc30ccSSteen Hegelund test_move_offset = 0;
321dccc30ccSSteen Hegelund test_move_count = 0;
322dccc30ccSSteen Hegelund test_init_start = 0;
323dccc30ccSSteen Hegelund test_init_count = 0;
324dccc30ccSSteen Hegelund }
325dccc30ccSSteen Hegelund
32667d63751SSteen Hegelund /* Define the test cases. */
32767d63751SSteen Hegelund
vcap_api_set_bit_1_test(struct kunit * test)32867d63751SSteen Hegelund static void vcap_api_set_bit_1_test(struct kunit *test)
32967d63751SSteen Hegelund {
33067d63751SSteen Hegelund struct vcap_stream_iter iter = {
33167d63751SSteen Hegelund .offset = 35,
33267d63751SSteen Hegelund .sw_width = 52,
33367d63751SSteen Hegelund .reg_idx = 1,
33467d63751SSteen Hegelund .reg_bitpos = 20,
335aa5ac4beSHoratiu Vultur .tg = NULL,
33667d63751SSteen Hegelund };
33767d63751SSteen Hegelund u32 stream[2] = {0};
33867d63751SSteen Hegelund
33967d63751SSteen Hegelund vcap_set_bit(stream, &iter, 1);
34067d63751SSteen Hegelund
34167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[0]);
34267d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)BIT(20), stream[1]);
34367d63751SSteen Hegelund }
34467d63751SSteen Hegelund
vcap_api_set_bit_0_test(struct kunit * test)34567d63751SSteen Hegelund static void vcap_api_set_bit_0_test(struct kunit *test)
34667d63751SSteen Hegelund {
34767d63751SSteen Hegelund struct vcap_stream_iter iter = {
34867d63751SSteen Hegelund .offset = 35,
34967d63751SSteen Hegelund .sw_width = 52,
35067d63751SSteen Hegelund .reg_idx = 2,
35167d63751SSteen Hegelund .reg_bitpos = 11,
352aa5ac4beSHoratiu Vultur .tg = NULL,
35367d63751SSteen Hegelund };
35467d63751SSteen Hegelund u32 stream[3] = {~0, ~0, ~0};
35567d63751SSteen Hegelund
35667d63751SSteen Hegelund vcap_set_bit(stream, &iter, 0);
35767d63751SSteen Hegelund
35867d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)~0, stream[0]);
35967d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)~0, stream[1]);
36067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)~BIT(11), stream[2]);
36167d63751SSteen Hegelund }
36267d63751SSteen Hegelund
vcap_api_iterator_init_test(struct kunit * test)36367d63751SSteen Hegelund static void vcap_api_iterator_init_test(struct kunit *test)
36467d63751SSteen Hegelund {
36567d63751SSteen Hegelund struct vcap_stream_iter iter;
36667d63751SSteen Hegelund struct vcap_typegroup typegroups[] = {
36767d63751SSteen Hegelund { .offset = 0, .width = 2, .value = 2, },
36867d63751SSteen Hegelund { .offset = 156, .width = 1, .value = 0, },
369*f2a30e6fSGuenter Roeck { }
37067d63751SSteen Hegelund };
37167d63751SSteen Hegelund struct vcap_typegroup typegroups2[] = {
37267d63751SSteen Hegelund { .offset = 0, .width = 3, .value = 4, },
37367d63751SSteen Hegelund { .offset = 49, .width = 2, .value = 0, },
37467d63751SSteen Hegelund { .offset = 98, .width = 2, .value = 0, },
375*f2a30e6fSGuenter Roeck { }
37667d63751SSteen Hegelund };
37767d63751SSteen Hegelund
37867d63751SSteen Hegelund vcap_iter_init(&iter, 52, typegroups, 86);
37967d63751SSteen Hegelund
38067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 52, iter.sw_width);
38167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 86 + 2, iter.offset);
38267d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 3, iter.reg_idx);
38367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 4, iter.reg_bitpos);
38467d63751SSteen Hegelund
38567d63751SSteen Hegelund vcap_iter_init(&iter, 49, typegroups2, 134);
38667d63751SSteen Hegelund
38767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 49, iter.sw_width);
38867d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 134 + 7, iter.offset);
38967d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 5, iter.reg_idx);
39067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 11, iter.reg_bitpos);
39167d63751SSteen Hegelund }
39267d63751SSteen Hegelund
vcap_api_iterator_next_test(struct kunit * test)39367d63751SSteen Hegelund static void vcap_api_iterator_next_test(struct kunit *test)
39467d63751SSteen Hegelund {
39567d63751SSteen Hegelund struct vcap_stream_iter iter;
39667d63751SSteen Hegelund struct vcap_typegroup typegroups[] = {
39767d63751SSteen Hegelund { .offset = 0, .width = 4, .value = 8, },
39867d63751SSteen Hegelund { .offset = 49, .width = 1, .value = 0, },
39967d63751SSteen Hegelund { .offset = 98, .width = 2, .value = 0, },
40067d63751SSteen Hegelund { .offset = 147, .width = 3, .value = 0, },
40167d63751SSteen Hegelund { .offset = 196, .width = 2, .value = 0, },
40267d63751SSteen Hegelund { .offset = 245, .width = 1, .value = 0, },
403*f2a30e6fSGuenter Roeck { }
40467d63751SSteen Hegelund };
40567d63751SSteen Hegelund int idx;
40667d63751SSteen Hegelund
40767d63751SSteen Hegelund vcap_iter_init(&iter, 49, typegroups, 86);
40867d63751SSteen Hegelund
40967d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 49, iter.sw_width);
41067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 86 + 5, iter.offset);
41167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 3, iter.reg_idx);
41267d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 10, iter.reg_bitpos);
41367d63751SSteen Hegelund
41467d63751SSteen Hegelund vcap_iter_next(&iter);
41567d63751SSteen Hegelund
41667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 91 + 1, iter.offset);
41767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 3, iter.reg_idx);
41867d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 11, iter.reg_bitpos);
41967d63751SSteen Hegelund
42067d63751SSteen Hegelund for (idx = 0; idx < 6; idx++)
42167d63751SSteen Hegelund vcap_iter_next(&iter);
42267d63751SSteen Hegelund
42367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 92 + 6 + 2, iter.offset);
42467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 4, iter.reg_idx);
42567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 2, iter.reg_bitpos);
42667d63751SSteen Hegelund }
42767d63751SSteen Hegelund
vcap_api_encode_typegroups_test(struct kunit * test)42867d63751SSteen Hegelund static void vcap_api_encode_typegroups_test(struct kunit *test)
42967d63751SSteen Hegelund {
43067d63751SSteen Hegelund u32 stream[12] = {0};
43167d63751SSteen Hegelund struct vcap_typegroup typegroups[] = {
43267d63751SSteen Hegelund { .offset = 0, .width = 4, .value = 8, },
43367d63751SSteen Hegelund { .offset = 49, .width = 1, .value = 1, },
43467d63751SSteen Hegelund { .offset = 98, .width = 2, .value = 3, },
43567d63751SSteen Hegelund { .offset = 147, .width = 3, .value = 5, },
43667d63751SSteen Hegelund { .offset = 196, .width = 2, .value = 2, },
43767d63751SSteen Hegelund { .offset = 245, .width = 5, .value = 27, },
438*f2a30e6fSGuenter Roeck { }
43967d63751SSteen Hegelund };
44067d63751SSteen Hegelund
44167d63751SSteen Hegelund vcap_encode_typegroups(stream, 49, typegroups, false);
44267d63751SSteen Hegelund
44367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x8, stream[0]);
44467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[1]);
44567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x1, stream[2]);
44667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[3]);
44767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x3, stream[4]);
44867d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[5]);
44967d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x5, stream[6]);
45067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[7]);
45167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x2, stream[8]);
45267d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[9]);
45367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)27, stream[10]);
45467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[11]);
45567d63751SSteen Hegelund }
45667d63751SSteen Hegelund
vcap_api_encode_bit_test(struct kunit * test)45767d63751SSteen Hegelund static void vcap_api_encode_bit_test(struct kunit *test)
45867d63751SSteen Hegelund {
45967d63751SSteen Hegelund struct vcap_stream_iter iter;
46067d63751SSteen Hegelund u32 stream[4] = {0};
46167d63751SSteen Hegelund struct vcap_typegroup typegroups[] = {
46267d63751SSteen Hegelund { .offset = 0, .width = 4, .value = 8, },
46367d63751SSteen Hegelund { .offset = 49, .width = 1, .value = 1, },
46467d63751SSteen Hegelund { .offset = 98, .width = 2, .value = 3, },
46567d63751SSteen Hegelund { .offset = 147, .width = 3, .value = 5, },
46667d63751SSteen Hegelund { .offset = 196, .width = 2, .value = 2, },
46767d63751SSteen Hegelund { .offset = 245, .width = 1, .value = 0, },
468*f2a30e6fSGuenter Roeck { }
46967d63751SSteen Hegelund };
47067d63751SSteen Hegelund
47167d63751SSteen Hegelund vcap_iter_init(&iter, 49, typegroups, 44);
47267d63751SSteen Hegelund
47367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 48, iter.offset);
47467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 1, iter.reg_idx);
47567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 16, iter.reg_bitpos);
47667d63751SSteen Hegelund
47767d63751SSteen Hegelund vcap_encode_bit(stream, &iter, 1);
47867d63751SSteen Hegelund
47967d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[0]);
48067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)BIT(16), stream[1]);
48167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[2]);
48267d63751SSteen Hegelund }
48367d63751SSteen Hegelund
vcap_api_encode_field_test(struct kunit * test)48467d63751SSteen Hegelund static void vcap_api_encode_field_test(struct kunit *test)
48567d63751SSteen Hegelund {
48667d63751SSteen Hegelund struct vcap_stream_iter iter;
48767d63751SSteen Hegelund u32 stream[16] = {0};
48867d63751SSteen Hegelund struct vcap_typegroup typegroups[] = {
48967d63751SSteen Hegelund { .offset = 0, .width = 4, .value = 8, },
49067d63751SSteen Hegelund { .offset = 49, .width = 1, .value = 1, },
49167d63751SSteen Hegelund { .offset = 98, .width = 2, .value = 3, },
49267d63751SSteen Hegelund { .offset = 147, .width = 3, .value = 5, },
49367d63751SSteen Hegelund { .offset = 196, .width = 2, .value = 2, },
49467d63751SSteen Hegelund { .offset = 245, .width = 5, .value = 27, },
495*f2a30e6fSGuenter Roeck { }
49667d63751SSteen Hegelund };
49767d63751SSteen Hegelund struct vcap_field rf = {
49867d63751SSteen Hegelund .type = VCAP_FIELD_U32,
49967d63751SSteen Hegelund .offset = 86,
50067d63751SSteen Hegelund .width = 4,
50167d63751SSteen Hegelund };
50267d63751SSteen Hegelund u8 value[] = {0x5};
50367d63751SSteen Hegelund
50467d63751SSteen Hegelund vcap_iter_init(&iter, 49, typegroups, rf.offset);
50567d63751SSteen Hegelund
50667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 91, iter.offset);
50767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 3, iter.reg_idx);
50867d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 10, iter.reg_bitpos);
50967d63751SSteen Hegelund
51067d63751SSteen Hegelund vcap_encode_field(stream, &iter, rf.width, value);
51167d63751SSteen Hegelund
51267d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[0]);
51367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[1]);
51467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[2]);
51567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)(0x5 << 10), stream[3]);
51667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[4]);
51767d63751SSteen Hegelund
51867d63751SSteen Hegelund vcap_encode_typegroups(stream, 49, typegroups, false);
51967d63751SSteen Hegelund
52067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x8, stream[0]);
52167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[1]);
52267d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x1, stream[2]);
52367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)(0x5 << 10), stream[3]);
52467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x3, stream[4]);
52567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[5]);
52667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x5, stream[6]);
52767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[7]);
52867d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x2, stream[8]);
52967d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[9]);
53067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)27, stream[10]);
53167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[11]);
53267d63751SSteen Hegelund }
53367d63751SSteen Hegelund
53467d63751SSteen Hegelund /* In this testcase the subword is smaller than a register */
vcap_api_encode_short_field_test(struct kunit * test)53567d63751SSteen Hegelund static void vcap_api_encode_short_field_test(struct kunit *test)
53667d63751SSteen Hegelund {
53767d63751SSteen Hegelund struct vcap_stream_iter iter;
53867d63751SSteen Hegelund int sw_width = 21;
53967d63751SSteen Hegelund u32 stream[6] = {0};
54067d63751SSteen Hegelund struct vcap_typegroup tgt[] = {
54167d63751SSteen Hegelund { .offset = 0, .width = 3, .value = 7, },
54267d63751SSteen Hegelund { .offset = 21, .width = 2, .value = 3, },
54367d63751SSteen Hegelund { .offset = 42, .width = 1, .value = 1, },
544*f2a30e6fSGuenter Roeck { }
54567d63751SSteen Hegelund };
54667d63751SSteen Hegelund struct vcap_field rf = {
54767d63751SSteen Hegelund .type = VCAP_FIELD_U32,
54867d63751SSteen Hegelund .offset = 25,
54967d63751SSteen Hegelund .width = 4,
55067d63751SSteen Hegelund };
55167d63751SSteen Hegelund u8 value[] = {0x5};
55267d63751SSteen Hegelund
55367d63751SSteen Hegelund vcap_iter_init(&iter, sw_width, tgt, rf.offset);
55467d63751SSteen Hegelund
55567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 1, iter.regs_per_sw);
55667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 21, iter.sw_width);
55767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 25 + 3 + 2, iter.offset);
55867d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 1, iter.reg_idx);
55967d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 25 + 3 + 2 - sw_width, iter.reg_bitpos);
56067d63751SSteen Hegelund
56167d63751SSteen Hegelund vcap_encode_field(stream, &iter, rf.width, value);
56267d63751SSteen Hegelund
56367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[0]);
56467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)(0x5 << (25 + 3 + 2 - sw_width)), stream[1]);
56567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[2]);
56667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[3]);
56767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[4]);
56867d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, stream[5]);
56967d63751SSteen Hegelund
57067d63751SSteen Hegelund vcap_encode_typegroups(stream, sw_width, tgt, false);
57167d63751SSteen Hegelund
57267d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)7, stream[0]);
57367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)((0x5 << (25 + 3 + 2 - sw_width)) + 3), stream[1]);
57467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)1, stream[2]);
57567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0, stream[3]);
57667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0, stream[4]);
57767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0, stream[5]);
57867d63751SSteen Hegelund }
57967d63751SSteen Hegelund
vcap_api_encode_keyfield_test(struct kunit * test)58067d63751SSteen Hegelund static void vcap_api_encode_keyfield_test(struct kunit *test)
58167d63751SSteen Hegelund {
58267d63751SSteen Hegelund u32 keywords[16] = {0};
58367d63751SSteen Hegelund u32 maskwords[16] = {0};
58467d63751SSteen Hegelund struct vcap_admin admin = {
58567d63751SSteen Hegelund .vtype = VCAP_TYPE_IS2,
58667d63751SSteen Hegelund .cache = {
58767d63751SSteen Hegelund .keystream = keywords,
58867d63751SSteen Hegelund .maskstream = maskwords,
58967d63751SSteen Hegelund .actionstream = keywords,
59067d63751SSteen Hegelund },
59167d63751SSteen Hegelund };
59267d63751SSteen Hegelund struct vcap_rule_internal rule = {
59367d63751SSteen Hegelund .admin = &admin,
59467d63751SSteen Hegelund .data = {
59567d63751SSteen Hegelund .keyset = VCAP_KFS_MAC_ETYPE,
59667d63751SSteen Hegelund },
59767d63751SSteen Hegelund .vctrl = &test_vctrl,
59867d63751SSteen Hegelund };
59967d63751SSteen Hegelund struct vcap_client_keyfield ckf = {
60067d63751SSteen Hegelund .ctrl.list = {},
60167d63751SSteen Hegelund .ctrl.key = VCAP_KF_ISDX_CLS,
60267d63751SSteen Hegelund .ctrl.type = VCAP_FIELD_U32,
60367d63751SSteen Hegelund .data.u32.value = 0xeef014a1,
60467d63751SSteen Hegelund .data.u32.mask = 0xfff,
60567d63751SSteen Hegelund };
60667d63751SSteen Hegelund struct vcap_field rf = {
60767d63751SSteen Hegelund .type = VCAP_FIELD_U32,
60867d63751SSteen Hegelund .offset = 56,
60967d63751SSteen Hegelund .width = 12,
61067d63751SSteen Hegelund };
61167d63751SSteen Hegelund struct vcap_typegroup tgt[] = {
61267d63751SSteen Hegelund { .offset = 0, .width = 2, .value = 2, },
61367d63751SSteen Hegelund { .offset = 156, .width = 1, .value = 1, },
614*f2a30e6fSGuenter Roeck { }
61567d63751SSteen Hegelund };
61667d63751SSteen Hegelund
61767d63751SSteen Hegelund vcap_test_api_init(&admin);
61867d63751SSteen Hegelund vcap_encode_keyfield(&rule, &ckf, &rf, tgt);
61967d63751SSteen Hegelund
62067d63751SSteen Hegelund /* Key */
62167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[0]);
62267d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[1]);
62367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)(0x04a1 << 6), keywords[2]);
62467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[3]);
62567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[4]);
62667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[5]);
62767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[6]);
62867d63751SSteen Hegelund
62967d63751SSteen Hegelund /* Mask */
63067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[0]);
63167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[1]);
63267d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)(0x0fff << 6), maskwords[2]);
63367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[3]);
63467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[4]);
63567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[5]);
63667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[6]);
63767d63751SSteen Hegelund }
63867d63751SSteen Hegelund
vcap_api_encode_max_keyfield_test(struct kunit * test)63967d63751SSteen Hegelund static void vcap_api_encode_max_keyfield_test(struct kunit *test)
64067d63751SSteen Hegelund {
64167d63751SSteen Hegelund int idx;
64267d63751SSteen Hegelund u32 keywords[6] = {0};
64367d63751SSteen Hegelund u32 maskwords[6] = {0};
64467d63751SSteen Hegelund struct vcap_admin admin = {
64567d63751SSteen Hegelund .vtype = VCAP_TYPE_IS2,
64667d63751SSteen Hegelund /* IS2 sw_width = 52 bit */
64767d63751SSteen Hegelund .cache = {
64867d63751SSteen Hegelund .keystream = keywords,
64967d63751SSteen Hegelund .maskstream = maskwords,
65067d63751SSteen Hegelund .actionstream = keywords,
65167d63751SSteen Hegelund },
65267d63751SSteen Hegelund };
65367d63751SSteen Hegelund struct vcap_rule_internal rule = {
65467d63751SSteen Hegelund .admin = &admin,
65567d63751SSteen Hegelund .data = {
65667d63751SSteen Hegelund .keyset = VCAP_KFS_IP_7TUPLE,
65767d63751SSteen Hegelund },
65867d63751SSteen Hegelund .vctrl = &test_vctrl,
65967d63751SSteen Hegelund };
66067d63751SSteen Hegelund struct vcap_client_keyfield ckf = {
66167d63751SSteen Hegelund .ctrl.list = {},
66267d63751SSteen Hegelund .ctrl.key = VCAP_KF_L3_IP6_DIP,
66367d63751SSteen Hegelund .ctrl.type = VCAP_FIELD_U128,
66467d63751SSteen Hegelund .data.u128.value = { 0xa1, 0xa2, 0xa3, 0xa4, 0, 0, 0x43, 0,
66567d63751SSteen Hegelund 0, 0, 0, 0, 0, 0, 0x78, 0x8e, },
66667d63751SSteen Hegelund .data.u128.mask = { 0xff, 0xff, 0xff, 0xff, 0, 0, 0xff, 0,
66767d63751SSteen Hegelund 0, 0, 0, 0, 0, 0, 0xff, 0xff },
66867d63751SSteen Hegelund };
66967d63751SSteen Hegelund struct vcap_field rf = {
67067d63751SSteen Hegelund .type = VCAP_FIELD_U128,
67167d63751SSteen Hegelund .offset = 0,
67267d63751SSteen Hegelund .width = 128,
67367d63751SSteen Hegelund };
67467d63751SSteen Hegelund struct vcap_typegroup tgt[] = {
67567d63751SSteen Hegelund { .offset = 0, .width = 2, .value = 2, },
67667d63751SSteen Hegelund { .offset = 156, .width = 1, .value = 1, },
677*f2a30e6fSGuenter Roeck { }
67867d63751SSteen Hegelund };
67967d63751SSteen Hegelund u32 keyres[] = {
68067d63751SSteen Hegelund 0x928e8a84,
68167d63751SSteen Hegelund 0x000c0002,
68267d63751SSteen Hegelund 0x00000010,
68367d63751SSteen Hegelund 0x00000000,
68467d63751SSteen Hegelund 0x0239e000,
68567d63751SSteen Hegelund 0x00000000,
68667d63751SSteen Hegelund };
68767d63751SSteen Hegelund u32 mskres[] = {
68867d63751SSteen Hegelund 0xfffffffc,
68967d63751SSteen Hegelund 0x000c0003,
69067d63751SSteen Hegelund 0x0000003f,
69167d63751SSteen Hegelund 0x00000000,
69267d63751SSteen Hegelund 0x03fffc00,
69367d63751SSteen Hegelund 0x00000000,
69467d63751SSteen Hegelund };
69567d63751SSteen Hegelund
69667d63751SSteen Hegelund vcap_encode_keyfield(&rule, &ckf, &rf, tgt);
69767d63751SSteen Hegelund
69867d63751SSteen Hegelund /* Key */
69967d63751SSteen Hegelund for (idx = 0; idx < ARRAY_SIZE(keyres); ++idx)
70067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, keyres[idx], keywords[idx]);
70167d63751SSteen Hegelund /* Mask */
70267d63751SSteen Hegelund for (idx = 0; idx < ARRAY_SIZE(mskres); ++idx)
70367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, mskres[idx], maskwords[idx]);
70467d63751SSteen Hegelund }
70567d63751SSteen Hegelund
vcap_api_encode_actionfield_test(struct kunit * test)70667d63751SSteen Hegelund static void vcap_api_encode_actionfield_test(struct kunit *test)
70767d63751SSteen Hegelund {
70867d63751SSteen Hegelund u32 actwords[16] = {0};
70967d63751SSteen Hegelund int sw_width = 21;
71067d63751SSteen Hegelund struct vcap_admin admin = {
71167d63751SSteen Hegelund .vtype = VCAP_TYPE_ES2, /* act_width = 21 */
71267d63751SSteen Hegelund .cache = {
71367d63751SSteen Hegelund .actionstream = actwords,
71467d63751SSteen Hegelund },
71567d63751SSteen Hegelund };
71667d63751SSteen Hegelund struct vcap_rule_internal rule = {
71767d63751SSteen Hegelund .admin = &admin,
71867d63751SSteen Hegelund .data = {
71967d63751SSteen Hegelund .actionset = VCAP_AFS_BASE_TYPE,
72067d63751SSteen Hegelund },
72167d63751SSteen Hegelund .vctrl = &test_vctrl,
72267d63751SSteen Hegelund };
72367d63751SSteen Hegelund struct vcap_client_actionfield caf = {
72467d63751SSteen Hegelund .ctrl.list = {},
72567d63751SSteen Hegelund .ctrl.action = VCAP_AF_POLICE_IDX,
72667d63751SSteen Hegelund .ctrl.type = VCAP_FIELD_U32,
72767d63751SSteen Hegelund .data.u32.value = 0x67908032,
72867d63751SSteen Hegelund };
72967d63751SSteen Hegelund struct vcap_field rf = {
73067d63751SSteen Hegelund .type = VCAP_FIELD_U32,
73167d63751SSteen Hegelund .offset = 35,
73267d63751SSteen Hegelund .width = 6,
73367d63751SSteen Hegelund };
73467d63751SSteen Hegelund struct vcap_typegroup tgt[] = {
73567d63751SSteen Hegelund { .offset = 0, .width = 2, .value = 2, },
73667d63751SSteen Hegelund { .offset = 21, .width = 1, .value = 1, },
73767d63751SSteen Hegelund { .offset = 42, .width = 1, .value = 0, },
738*f2a30e6fSGuenter Roeck { }
73967d63751SSteen Hegelund };
74067d63751SSteen Hegelund
74167d63751SSteen Hegelund vcap_encode_actionfield(&rule, &caf, &rf, tgt);
74267d63751SSteen Hegelund
74367d63751SSteen Hegelund /* Action */
74467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, actwords[0]);
74567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)((0x32 << (35 + 2 + 1 - sw_width)) & 0x1fffff), actwords[1]);
74667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)((0x32 >> ((2 * sw_width) - 38 - 1))), actwords[2]);
74767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, actwords[3]);
74867d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, actwords[4]);
74967d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, actwords[5]);
75067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0, actwords[6]);
75167d63751SSteen Hegelund }
75267d63751SSteen Hegelund
vcap_api_keyfield_typegroup_test(struct kunit * test)75367d63751SSteen Hegelund static void vcap_api_keyfield_typegroup_test(struct kunit *test)
75467d63751SSteen Hegelund {
75567d63751SSteen Hegelund const struct vcap_typegroup *tg;
75667d63751SSteen Hegelund
75767d63751SSteen Hegelund tg = vcap_keyfield_typegroup(&test_vctrl, VCAP_TYPE_IS2, VCAP_KFS_MAC_ETYPE);
75867d63751SSteen Hegelund KUNIT_EXPECT_PTR_NE(test, NULL, tg);
75967d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, tg[0].offset);
76067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 2, tg[0].width);
76167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 2, tg[0].value);
76267d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 156, tg[1].offset);
76367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 1, tg[1].width);
76467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, tg[1].value);
76567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, tg[2].offset);
76667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, tg[2].width);
76767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, tg[2].value);
76867d63751SSteen Hegelund
76967d63751SSteen Hegelund tg = vcap_keyfield_typegroup(&test_vctrl, VCAP_TYPE_ES2, VCAP_KFS_LL_FULL);
77067d63751SSteen Hegelund KUNIT_EXPECT_PTR_EQ(test, NULL, tg);
77167d63751SSteen Hegelund }
77267d63751SSteen Hegelund
vcap_api_actionfield_typegroup_test(struct kunit * test)77367d63751SSteen Hegelund static void vcap_api_actionfield_typegroup_test(struct kunit *test)
77467d63751SSteen Hegelund {
77567d63751SSteen Hegelund const struct vcap_typegroup *tg;
77667d63751SSteen Hegelund
77767d63751SSteen Hegelund tg = vcap_actionfield_typegroup(&test_vctrl, VCAP_TYPE_IS0, VCAP_AFS_FULL);
77867d63751SSteen Hegelund KUNIT_EXPECT_PTR_NE(test, NULL, tg);
77967d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, tg[0].offset);
78067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 3, tg[0].width);
78167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 4, tg[0].value);
78267d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 110, tg[1].offset);
78367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 2, tg[1].width);
78467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, tg[1].value);
78567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 220, tg[2].offset);
78667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 2, tg[2].width);
78767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, tg[2].value);
78867d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, tg[3].offset);
78967d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, tg[3].width);
79067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, tg[3].value);
79167d63751SSteen Hegelund
79267d63751SSteen Hegelund tg = vcap_actionfield_typegroup(&test_vctrl, VCAP_TYPE_IS2, VCAP_AFS_CLASSIFICATION);
79367d63751SSteen Hegelund KUNIT_EXPECT_PTR_EQ(test, NULL, tg);
79467d63751SSteen Hegelund }
79567d63751SSteen Hegelund
vcap_api_vcap_keyfields_test(struct kunit * test)79667d63751SSteen Hegelund static void vcap_api_vcap_keyfields_test(struct kunit *test)
79767d63751SSteen Hegelund {
79867d63751SSteen Hegelund const struct vcap_field *ft;
79967d63751SSteen Hegelund
80067d63751SSteen Hegelund ft = vcap_keyfields(&test_vctrl, VCAP_TYPE_IS2, VCAP_KFS_MAC_ETYPE);
80167d63751SSteen Hegelund KUNIT_EXPECT_PTR_NE(test, NULL, ft);
80267d63751SSteen Hegelund
80367d63751SSteen Hegelund /* Keyset that is not available and within the maximum keyset enum value */
80467d63751SSteen Hegelund ft = vcap_keyfields(&test_vctrl, VCAP_TYPE_ES2, VCAP_KFS_PURE_5TUPLE_IP4);
80567d63751SSteen Hegelund KUNIT_EXPECT_PTR_EQ(test, NULL, ft);
80667d63751SSteen Hegelund
80767d63751SSteen Hegelund /* Keyset that is not available and beyond the maximum keyset enum value */
80867d63751SSteen Hegelund ft = vcap_keyfields(&test_vctrl, VCAP_TYPE_ES2, VCAP_KFS_LL_FULL);
80967d63751SSteen Hegelund KUNIT_EXPECT_PTR_EQ(test, NULL, ft);
81067d63751SSteen Hegelund }
81167d63751SSteen Hegelund
vcap_api_vcap_actionfields_test(struct kunit * test)81267d63751SSteen Hegelund static void vcap_api_vcap_actionfields_test(struct kunit *test)
81367d63751SSteen Hegelund {
81467d63751SSteen Hegelund const struct vcap_field *ft;
81567d63751SSteen Hegelund
81667d63751SSteen Hegelund ft = vcap_actionfields(&test_vctrl, VCAP_TYPE_IS0, VCAP_AFS_FULL);
81767d63751SSteen Hegelund KUNIT_EXPECT_PTR_NE(test, NULL, ft);
81867d63751SSteen Hegelund
81967d63751SSteen Hegelund ft = vcap_actionfields(&test_vctrl, VCAP_TYPE_IS2, VCAP_AFS_FULL);
82067d63751SSteen Hegelund KUNIT_EXPECT_PTR_EQ(test, NULL, ft);
82167d63751SSteen Hegelund
82267d63751SSteen Hegelund ft = vcap_actionfields(&test_vctrl, VCAP_TYPE_IS2, VCAP_AFS_CLASSIFICATION);
82367d63751SSteen Hegelund KUNIT_EXPECT_PTR_EQ(test, NULL, ft);
82467d63751SSteen Hegelund }
82567d63751SSteen Hegelund
vcap_api_encode_rule_keyset_test(struct kunit * test)82667d63751SSteen Hegelund static void vcap_api_encode_rule_keyset_test(struct kunit *test)
82767d63751SSteen Hegelund {
82867d63751SSteen Hegelund u32 keywords[16] = {0};
82967d63751SSteen Hegelund u32 maskwords[16] = {0};
83067d63751SSteen Hegelund struct vcap_admin admin = {
83167d63751SSteen Hegelund .vtype = VCAP_TYPE_IS2,
83267d63751SSteen Hegelund .cache = {
83367d63751SSteen Hegelund .keystream = keywords,
83467d63751SSteen Hegelund .maskstream = maskwords,
83567d63751SSteen Hegelund },
83667d63751SSteen Hegelund };
83767d63751SSteen Hegelund struct vcap_rule_internal rule = {
83867d63751SSteen Hegelund .admin = &admin,
83967d63751SSteen Hegelund .data = {
84067d63751SSteen Hegelund .keyset = VCAP_KFS_MAC_ETYPE,
84167d63751SSteen Hegelund },
84267d63751SSteen Hegelund .vctrl = &test_vctrl,
84367d63751SSteen Hegelund };
84467d63751SSteen Hegelund struct vcap_client_keyfield ckf[] = {
84567d63751SSteen Hegelund {
84667d63751SSteen Hegelund .ctrl.key = VCAP_KF_TYPE,
84767d63751SSteen Hegelund .ctrl.type = VCAP_FIELD_U32,
84867d63751SSteen Hegelund .data.u32.value = 0x00,
84967d63751SSteen Hegelund .data.u32.mask = 0x0f,
85067d63751SSteen Hegelund },
85167d63751SSteen Hegelund {
85267d63751SSteen Hegelund .ctrl.key = VCAP_KF_LOOKUP_FIRST_IS,
85367d63751SSteen Hegelund .ctrl.type = VCAP_FIELD_BIT,
85467d63751SSteen Hegelund .data.u1.value = 0x01,
85567d63751SSteen Hegelund .data.u1.mask = 0x01,
85667d63751SSteen Hegelund },
85767d63751SSteen Hegelund {
85867d63751SSteen Hegelund .ctrl.key = VCAP_KF_IF_IGR_PORT_MASK_L3,
85967d63751SSteen Hegelund .ctrl.type = VCAP_FIELD_BIT,
86067d63751SSteen Hegelund .data.u1.value = 0x00,
86167d63751SSteen Hegelund .data.u1.mask = 0x01,
86267d63751SSteen Hegelund },
86367d63751SSteen Hegelund {
86467d63751SSteen Hegelund .ctrl.key = VCAP_KF_IF_IGR_PORT_MASK_RNG,
86567d63751SSteen Hegelund .ctrl.type = VCAP_FIELD_U32,
86667d63751SSteen Hegelund .data.u32.value = 0x00,
86767d63751SSteen Hegelund .data.u32.mask = 0x0f,
86867d63751SSteen Hegelund },
86967d63751SSteen Hegelund {
87067d63751SSteen Hegelund .ctrl.key = VCAP_KF_IF_IGR_PORT_MASK,
87167d63751SSteen Hegelund .ctrl.type = VCAP_FIELD_U72,
87267d63751SSteen Hegelund .data.u72.value = {0x0, 0x00, 0x00, 0x00},
87367d63751SSteen Hegelund .data.u72.mask = {0xfd, 0xff, 0xff, 0xff},
87467d63751SSteen Hegelund },
87567d63751SSteen Hegelund {
87667d63751SSteen Hegelund .ctrl.key = VCAP_KF_L2_DMAC,
87767d63751SSteen Hegelund .ctrl.type = VCAP_FIELD_U48,
87867d63751SSteen Hegelund /* Opposite endianness */
87967d63751SSteen Hegelund .data.u48.value = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06},
88067d63751SSteen Hegelund .data.u48.mask = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
88167d63751SSteen Hegelund },
88267d63751SSteen Hegelund {
88367d63751SSteen Hegelund .ctrl.key = VCAP_KF_ETYPE_LEN_IS,
88467d63751SSteen Hegelund .ctrl.type = VCAP_FIELD_BIT,
88567d63751SSteen Hegelund .data.u1.value = 0x01,
88667d63751SSteen Hegelund .data.u1.mask = 0x01,
88767d63751SSteen Hegelund },
88867d63751SSteen Hegelund {
88967d63751SSteen Hegelund .ctrl.key = VCAP_KF_ETYPE,
89067d63751SSteen Hegelund .ctrl.type = VCAP_FIELD_U32,
89167d63751SSteen Hegelund .data.u32.value = 0xaabb,
89267d63751SSteen Hegelund .data.u32.mask = 0xffff,
89367d63751SSteen Hegelund },
89467d63751SSteen Hegelund };
89567d63751SSteen Hegelund int idx;
89667d63751SSteen Hegelund int ret;
89767d63751SSteen Hegelund
89867d63751SSteen Hegelund /* Empty entry list */
89967d63751SSteen Hegelund INIT_LIST_HEAD(&rule.data.keyfields);
90067d63751SSteen Hegelund ret = vcap_encode_rule_keyset(&rule);
90167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, -EINVAL, ret);
90267d63751SSteen Hegelund
90367d63751SSteen Hegelund for (idx = 0; idx < ARRAY_SIZE(ckf); idx++)
90467d63751SSteen Hegelund list_add_tail(&ckf[idx].ctrl.list, &rule.data.keyfields);
90567d63751SSteen Hegelund ret = vcap_encode_rule_keyset(&rule);
90667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
90767d63751SSteen Hegelund
90867d63751SSteen Hegelund /* The key and mask values below are from an actual Sparx5 rule config */
90967d63751SSteen Hegelund /* Key */
91067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000042, keywords[0]);
91167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[1]);
91267d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[2]);
91367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00020100, keywords[3]);
91467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x60504030, keywords[4]);
91567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[5]);
91667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[6]);
91767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x0002aaee, keywords[7]);
91867d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[8]);
91967d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[9]);
92067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[10]);
92167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[11]);
92267d63751SSteen Hegelund
92367d63751SSteen Hegelund /* Mask: they will be inverted when applied to the register */
92467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)~0x00b07f80, maskwords[0]);
92567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)~0xfff00000, maskwords[1]);
92667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)~0xfffffffc, maskwords[2]);
92767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)~0xfff000ff, maskwords[3]);
92867d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)~0x00000000, maskwords[4]);
92967d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)~0xfffffff0, maskwords[5]);
93067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)~0xfffffffe, maskwords[6]);
93167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)~0xfffc0001, maskwords[7]);
93267d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)~0xffffffff, maskwords[8]);
93367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)~0xffffffff, maskwords[9]);
93467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)~0xffffffff, maskwords[10]);
93567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)~0xffffffff, maskwords[11]);
93667d63751SSteen Hegelund }
93767d63751SSteen Hegelund
vcap_api_encode_rule_actionset_test(struct kunit * test)93867d63751SSteen Hegelund static void vcap_api_encode_rule_actionset_test(struct kunit *test)
93967d63751SSteen Hegelund {
94067d63751SSteen Hegelund u32 actwords[16] = {0};
94167d63751SSteen Hegelund struct vcap_admin admin = {
94267d63751SSteen Hegelund .vtype = VCAP_TYPE_IS2,
94367d63751SSteen Hegelund .cache = {
94467d63751SSteen Hegelund .actionstream = actwords,
94567d63751SSteen Hegelund },
94667d63751SSteen Hegelund };
94767d63751SSteen Hegelund struct vcap_rule_internal rule = {
94867d63751SSteen Hegelund .admin = &admin,
94967d63751SSteen Hegelund .data = {
95067d63751SSteen Hegelund .actionset = VCAP_AFS_BASE_TYPE,
95167d63751SSteen Hegelund },
95267d63751SSteen Hegelund .vctrl = &test_vctrl,
95367d63751SSteen Hegelund };
95467d63751SSteen Hegelund struct vcap_client_actionfield caf[] = {
95567d63751SSteen Hegelund {
95667d63751SSteen Hegelund .ctrl.action = VCAP_AF_MATCH_ID,
95767d63751SSteen Hegelund .ctrl.type = VCAP_FIELD_U32,
95867d63751SSteen Hegelund .data.u32.value = 0x01,
95967d63751SSteen Hegelund },
96067d63751SSteen Hegelund {
96167d63751SSteen Hegelund .ctrl.action = VCAP_AF_MATCH_ID_MASK,
96267d63751SSteen Hegelund .ctrl.type = VCAP_FIELD_U32,
96367d63751SSteen Hegelund .data.u32.value = 0x01,
96467d63751SSteen Hegelund },
96567d63751SSteen Hegelund {
96667d63751SSteen Hegelund .ctrl.action = VCAP_AF_CNT_ID,
96767d63751SSteen Hegelund .ctrl.type = VCAP_FIELD_U32,
96867d63751SSteen Hegelund .data.u32.value = 0x64,
96967d63751SSteen Hegelund },
97067d63751SSteen Hegelund };
97167d63751SSteen Hegelund int idx;
97267d63751SSteen Hegelund int ret;
97367d63751SSteen Hegelund
97467d63751SSteen Hegelund /* Empty entry list */
97567d63751SSteen Hegelund INIT_LIST_HEAD(&rule.data.actionfields);
97667d63751SSteen Hegelund ret = vcap_encode_rule_actionset(&rule);
97767d63751SSteen Hegelund /* We allow rules with no actions */
97867d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
97967d63751SSteen Hegelund
98067d63751SSteen Hegelund for (idx = 0; idx < ARRAY_SIZE(caf); idx++)
98167d63751SSteen Hegelund list_add_tail(&caf[idx].ctrl.list, &rule.data.actionfields);
98267d63751SSteen Hegelund ret = vcap_encode_rule_actionset(&rule);
98367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
98467d63751SSteen Hegelund
98567d63751SSteen Hegelund /* The action values below are from an actual Sparx5 rule config */
98667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000002, actwords[0]);
98767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[1]);
98867d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[2]);
98967d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[3]);
99067d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[4]);
99167d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00100000, actwords[5]);
99267d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x06400010, actwords[6]);
99367d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[7]);
99467d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[8]);
99567d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[9]);
99667d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[10]);
99767d63751SSteen Hegelund KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[11]);
99867d63751SSteen Hegelund }
99967d63751SSteen Hegelund
vcap_free_ckf(struct vcap_rule * rule)1000f037fc99SJinjie Ruan static void vcap_free_ckf(struct vcap_rule *rule)
1001f037fc99SJinjie Ruan {
1002f037fc99SJinjie Ruan struct vcap_client_keyfield *ckf, *next_ckf;
1003f037fc99SJinjie Ruan
1004f037fc99SJinjie Ruan list_for_each_entry_safe(ckf, next_ckf, &rule->keyfields, ctrl.list) {
1005f037fc99SJinjie Ruan list_del(&ckf->ctrl.list);
1006f037fc99SJinjie Ruan kfree(ckf);
1007f037fc99SJinjie Ruan }
1008f037fc99SJinjie Ruan }
1009f037fc99SJinjie Ruan
vcap_api_rule_add_keyvalue_test(struct kunit * test)1010c956b9b3SSteen Hegelund static void vcap_api_rule_add_keyvalue_test(struct kunit *test)
1011c956b9b3SSteen Hegelund {
1012c956b9b3SSteen Hegelund struct vcap_admin admin = {
1013c956b9b3SSteen Hegelund .vtype = VCAP_TYPE_IS2,
1014c956b9b3SSteen Hegelund };
1015c956b9b3SSteen Hegelund struct vcap_rule_internal ri = {
1016c956b9b3SSteen Hegelund .admin = &admin,
1017c956b9b3SSteen Hegelund .data = {
1018c956b9b3SSteen Hegelund .keyset = VCAP_KFS_NO_VALUE,
1019c956b9b3SSteen Hegelund },
1020c956b9b3SSteen Hegelund .vctrl = &test_vctrl,
1021c956b9b3SSteen Hegelund };
1022c956b9b3SSteen Hegelund struct vcap_rule *rule = (struct vcap_rule *)&ri;
1023c956b9b3SSteen Hegelund struct vcap_client_keyfield *kf;
1024c956b9b3SSteen Hegelund int ret;
1025c956b9b3SSteen Hegelund struct vcap_u128_key dip = {
1026c956b9b3SSteen Hegelund .value = {0x17, 0x26, 0x35, 0x44, 0x63, 0x62, 0x71},
1027c956b9b3SSteen Hegelund .mask = {0xf1, 0xf2, 0xf3, 0xf4, 0x4f, 0x3f, 0x2f, 0x1f},
1028c956b9b3SSteen Hegelund };
1029c956b9b3SSteen Hegelund int idx;
1030c956b9b3SSteen Hegelund
1031c956b9b3SSteen Hegelund INIT_LIST_HEAD(&rule->keyfields);
1032c956b9b3SSteen Hegelund ret = vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS, VCAP_BIT_0);
1033c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1034c956b9b3SSteen Hegelund ret = list_empty(&rule->keyfields);
1035c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1036c956b9b3SSteen Hegelund kf = list_first_entry(&rule->keyfields, struct vcap_client_keyfield,
1037c956b9b3SSteen Hegelund ctrl.list);
1038c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_KF_LOOKUP_FIRST_IS, kf->ctrl.key);
1039c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, kf->ctrl.type);
1040c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0x0, kf->data.u1.value);
1041c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0x1, kf->data.u1.mask);
1042f037fc99SJinjie Ruan vcap_free_ckf(rule);
1043c956b9b3SSteen Hegelund
1044c956b9b3SSteen Hegelund INIT_LIST_HEAD(&rule->keyfields);
1045c956b9b3SSteen Hegelund ret = vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS, VCAP_BIT_1);
1046c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1047c956b9b3SSteen Hegelund ret = list_empty(&rule->keyfields);
1048c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1049c956b9b3SSteen Hegelund kf = list_first_entry(&rule->keyfields, struct vcap_client_keyfield,
1050c956b9b3SSteen Hegelund ctrl.list);
1051c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_KF_LOOKUP_FIRST_IS, kf->ctrl.key);
1052c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, kf->ctrl.type);
1053c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0x1, kf->data.u1.value);
1054c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0x1, kf->data.u1.mask);
1055f037fc99SJinjie Ruan vcap_free_ckf(rule);
1056c956b9b3SSteen Hegelund
1057c956b9b3SSteen Hegelund INIT_LIST_HEAD(&rule->keyfields);
1058c956b9b3SSteen Hegelund ret = vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS,
1059c956b9b3SSteen Hegelund VCAP_BIT_ANY);
1060c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1061c956b9b3SSteen Hegelund ret = list_empty(&rule->keyfields);
1062c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1063c956b9b3SSteen Hegelund kf = list_first_entry(&rule->keyfields, struct vcap_client_keyfield,
1064c956b9b3SSteen Hegelund ctrl.list);
1065c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_KF_LOOKUP_FIRST_IS, kf->ctrl.key);
1066c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, kf->ctrl.type);
1067c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0x0, kf->data.u1.value);
1068c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0x0, kf->data.u1.mask);
1069f037fc99SJinjie Ruan vcap_free_ckf(rule);
1070c956b9b3SSteen Hegelund
1071c956b9b3SSteen Hegelund INIT_LIST_HEAD(&rule->keyfields);
1072c956b9b3SSteen Hegelund ret = vcap_rule_add_key_u32(rule, VCAP_KF_TYPE, 0x98765432, 0xff00ffab);
1073c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1074c956b9b3SSteen Hegelund ret = list_empty(&rule->keyfields);
1075c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1076c956b9b3SSteen Hegelund kf = list_first_entry(&rule->keyfields, struct vcap_client_keyfield,
1077c956b9b3SSteen Hegelund ctrl.list);
1078c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_KF_TYPE, kf->ctrl.key);
1079c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_FIELD_U32, kf->ctrl.type);
1080c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0x98765432, kf->data.u32.value);
1081c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0xff00ffab, kf->data.u32.mask);
1082f037fc99SJinjie Ruan vcap_free_ckf(rule);
1083c956b9b3SSteen Hegelund
1084c956b9b3SSteen Hegelund INIT_LIST_HEAD(&rule->keyfields);
1085c956b9b3SSteen Hegelund ret = vcap_rule_add_key_u128(rule, VCAP_KF_L3_IP6_SIP, &dip);
1086c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1087c956b9b3SSteen Hegelund ret = list_empty(&rule->keyfields);
1088c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1089c956b9b3SSteen Hegelund kf = list_first_entry(&rule->keyfields, struct vcap_client_keyfield,
1090c956b9b3SSteen Hegelund ctrl.list);
1091c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_KF_L3_IP6_SIP, kf->ctrl.key);
1092c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_FIELD_U128, kf->ctrl.type);
1093c956b9b3SSteen Hegelund for (idx = 0; idx < ARRAY_SIZE(dip.value); ++idx)
1094c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, dip.value[idx], kf->data.u128.value[idx]);
1095c956b9b3SSteen Hegelund for (idx = 0; idx < ARRAY_SIZE(dip.mask); ++idx)
1096c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, dip.mask[idx], kf->data.u128.mask[idx]);
1097f037fc99SJinjie Ruan vcap_free_ckf(rule);
1098c956b9b3SSteen Hegelund }
1099c956b9b3SSteen Hegelund
vcap_free_caf(struct vcap_rule * rule)110039d0ccc1SJinjie Ruan static void vcap_free_caf(struct vcap_rule *rule)
110139d0ccc1SJinjie Ruan {
110239d0ccc1SJinjie Ruan struct vcap_client_actionfield *caf, *next_caf;
110339d0ccc1SJinjie Ruan
110439d0ccc1SJinjie Ruan list_for_each_entry_safe(caf, next_caf,
110539d0ccc1SJinjie Ruan &rule->actionfields, ctrl.list) {
110639d0ccc1SJinjie Ruan list_del(&caf->ctrl.list);
110739d0ccc1SJinjie Ruan kfree(caf);
110839d0ccc1SJinjie Ruan }
110939d0ccc1SJinjie Ruan }
111039d0ccc1SJinjie Ruan
vcap_api_rule_add_actionvalue_test(struct kunit * test)1111c956b9b3SSteen Hegelund static void vcap_api_rule_add_actionvalue_test(struct kunit *test)
1112c956b9b3SSteen Hegelund {
1113c956b9b3SSteen Hegelund struct vcap_admin admin = {
1114c956b9b3SSteen Hegelund .vtype = VCAP_TYPE_IS2,
1115c956b9b3SSteen Hegelund };
1116c956b9b3SSteen Hegelund struct vcap_rule_internal ri = {
1117c956b9b3SSteen Hegelund .admin = &admin,
1118c956b9b3SSteen Hegelund .data = {
1119c956b9b3SSteen Hegelund .actionset = VCAP_AFS_NO_VALUE,
1120c956b9b3SSteen Hegelund },
1121c956b9b3SSteen Hegelund };
1122c956b9b3SSteen Hegelund struct vcap_rule *rule = (struct vcap_rule *)&ri;
1123c956b9b3SSteen Hegelund struct vcap_client_actionfield *af;
1124c956b9b3SSteen Hegelund int ret;
1125c956b9b3SSteen Hegelund
1126c956b9b3SSteen Hegelund INIT_LIST_HEAD(&rule->actionfields);
1127c956b9b3SSteen Hegelund ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_0);
1128c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1129c956b9b3SSteen Hegelund ret = list_empty(&rule->actionfields);
1130c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1131c956b9b3SSteen Hegelund af = list_first_entry(&rule->actionfields,
1132c956b9b3SSteen Hegelund struct vcap_client_actionfield, ctrl.list);
1133c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_AF_POLICE_ENA, af->ctrl.action);
1134c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, af->ctrl.type);
1135c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0x0, af->data.u1.value);
113639d0ccc1SJinjie Ruan vcap_free_caf(rule);
1137c956b9b3SSteen Hegelund
1138c956b9b3SSteen Hegelund INIT_LIST_HEAD(&rule->actionfields);
1139c956b9b3SSteen Hegelund ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_1);
1140c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1141c956b9b3SSteen Hegelund ret = list_empty(&rule->actionfields);
1142c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1143c956b9b3SSteen Hegelund af = list_first_entry(&rule->actionfields,
1144c956b9b3SSteen Hegelund struct vcap_client_actionfield, ctrl.list);
1145c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_AF_POLICE_ENA, af->ctrl.action);
1146c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, af->ctrl.type);
1147c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0x1, af->data.u1.value);
114839d0ccc1SJinjie Ruan vcap_free_caf(rule);
1149c956b9b3SSteen Hegelund
1150c956b9b3SSteen Hegelund INIT_LIST_HEAD(&rule->actionfields);
1151c956b9b3SSteen Hegelund ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_ANY);
1152c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1153c956b9b3SSteen Hegelund ret = list_empty(&rule->actionfields);
1154c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1155c956b9b3SSteen Hegelund af = list_first_entry(&rule->actionfields,
1156c956b9b3SSteen Hegelund struct vcap_client_actionfield, ctrl.list);
1157c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_AF_POLICE_ENA, af->ctrl.action);
1158c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, af->ctrl.type);
1159c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0x0, af->data.u1.value);
116039d0ccc1SJinjie Ruan vcap_free_caf(rule);
1161c956b9b3SSteen Hegelund
1162c956b9b3SSteen Hegelund INIT_LIST_HEAD(&rule->actionfields);
1163c956b9b3SSteen Hegelund ret = vcap_rule_add_action_u32(rule, VCAP_AF_TYPE, 0x98765432);
1164c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1165c956b9b3SSteen Hegelund ret = list_empty(&rule->actionfields);
1166c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1167c956b9b3SSteen Hegelund af = list_first_entry(&rule->actionfields,
1168c956b9b3SSteen Hegelund struct vcap_client_actionfield, ctrl.list);
1169c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_AF_TYPE, af->ctrl.action);
1170c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_FIELD_U32, af->ctrl.type);
1171c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0x98765432, af->data.u32.value);
117239d0ccc1SJinjie Ruan vcap_free_caf(rule);
1173c956b9b3SSteen Hegelund
1174c956b9b3SSteen Hegelund INIT_LIST_HEAD(&rule->actionfields);
1175c956b9b3SSteen Hegelund ret = vcap_rule_add_action_u32(rule, VCAP_AF_MASK_MODE, 0xaabbccdd);
1176c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1177c956b9b3SSteen Hegelund ret = list_empty(&rule->actionfields);
1178c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1179c956b9b3SSteen Hegelund af = list_first_entry(&rule->actionfields,
1180c956b9b3SSteen Hegelund struct vcap_client_actionfield, ctrl.list);
1181c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_AF_MASK_MODE, af->ctrl.action);
1182c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_FIELD_U32, af->ctrl.type);
1183c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0xaabbccdd, af->data.u32.value);
118439d0ccc1SJinjie Ruan vcap_free_caf(rule);
1185c956b9b3SSteen Hegelund }
1186c956b9b3SSteen Hegelund
vcap_api_rule_find_keyset_basic_test(struct kunit * test)1187c956b9b3SSteen Hegelund static void vcap_api_rule_find_keyset_basic_test(struct kunit *test)
1188c956b9b3SSteen Hegelund {
1189c956b9b3SSteen Hegelund struct vcap_keyset_list matches = {};
1190c956b9b3SSteen Hegelund struct vcap_admin admin = {
1191c956b9b3SSteen Hegelund .vtype = VCAP_TYPE_IS2,
1192c956b9b3SSteen Hegelund };
1193c956b9b3SSteen Hegelund struct vcap_rule_internal ri = {
1194c956b9b3SSteen Hegelund .admin = &admin,
1195c956b9b3SSteen Hegelund .vctrl = &test_vctrl,
1196c956b9b3SSteen Hegelund };
1197c956b9b3SSteen Hegelund struct vcap_client_keyfield ckf[] = {
1198c956b9b3SSteen Hegelund {
1199c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_TYPE,
1200c956b9b3SSteen Hegelund }, {
1201c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_LOOKUP_FIRST_IS,
1202c956b9b3SSteen Hegelund }, {
1203c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_IF_IGR_PORT_MASK_L3,
1204c956b9b3SSteen Hegelund }, {
1205c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_IF_IGR_PORT_MASK_RNG,
1206c956b9b3SSteen Hegelund }, {
1207c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_IF_IGR_PORT_MASK,
1208c956b9b3SSteen Hegelund }, {
1209c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_L2_DMAC,
1210c956b9b3SSteen Hegelund }, {
1211c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_ETYPE_LEN_IS,
1212c956b9b3SSteen Hegelund }, {
1213c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_ETYPE,
1214c956b9b3SSteen Hegelund },
1215c956b9b3SSteen Hegelund };
1216c956b9b3SSteen Hegelund int idx;
1217c956b9b3SSteen Hegelund bool ret;
1218c956b9b3SSteen Hegelund enum vcap_keyfield_set keysets[10] = {};
1219c956b9b3SSteen Hegelund
1220c956b9b3SSteen Hegelund matches.keysets = keysets;
1221c956b9b3SSteen Hegelund matches.max = ARRAY_SIZE(keysets);
1222c956b9b3SSteen Hegelund
1223c956b9b3SSteen Hegelund INIT_LIST_HEAD(&ri.data.keyfields);
1224c956b9b3SSteen Hegelund for (idx = 0; idx < ARRAY_SIZE(ckf); idx++)
1225c956b9b3SSteen Hegelund list_add_tail(&ckf[idx].ctrl.list, &ri.data.keyfields);
1226c956b9b3SSteen Hegelund
1227465a38a2SSteen Hegelund ret = vcap_rule_find_keysets(&ri.data, &matches);
1228c956b9b3SSteen Hegelund
1229c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, true, ret);
1230c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 1, matches.cnt);
1231c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_KFS_MAC_ETYPE, matches.keysets[0]);
1232c956b9b3SSteen Hegelund }
1233c956b9b3SSteen Hegelund
vcap_api_rule_find_keyset_failed_test(struct kunit * test)1234c956b9b3SSteen Hegelund static void vcap_api_rule_find_keyset_failed_test(struct kunit *test)
1235c956b9b3SSteen Hegelund {
1236c956b9b3SSteen Hegelund struct vcap_keyset_list matches = {};
1237c956b9b3SSteen Hegelund struct vcap_admin admin = {
1238c956b9b3SSteen Hegelund .vtype = VCAP_TYPE_IS2,
1239c956b9b3SSteen Hegelund };
1240c956b9b3SSteen Hegelund struct vcap_rule_internal ri = {
1241c956b9b3SSteen Hegelund .admin = &admin,
1242c956b9b3SSteen Hegelund .vctrl = &test_vctrl,
1243c956b9b3SSteen Hegelund };
1244c956b9b3SSteen Hegelund struct vcap_client_keyfield ckf[] = {
1245c956b9b3SSteen Hegelund {
1246c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_TYPE,
1247c956b9b3SSteen Hegelund }, {
1248c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_LOOKUP_FIRST_IS,
1249c956b9b3SSteen Hegelund }, {
1250c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_ARP_OPCODE,
1251c956b9b3SSteen Hegelund }, {
1252c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_L3_IP4_SIP,
1253c956b9b3SSteen Hegelund }, {
1254c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_L3_IP4_DIP,
1255c956b9b3SSteen Hegelund }, {
1256c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_8021Q_PCP_CLS,
1257c956b9b3SSteen Hegelund }, {
1258c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_ETYPE_LEN_IS, /* Not with ARP */
1259c956b9b3SSteen Hegelund }, {
1260c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_ETYPE, /* Not with ARP */
1261c956b9b3SSteen Hegelund },
1262c956b9b3SSteen Hegelund };
1263c956b9b3SSteen Hegelund int idx;
1264c956b9b3SSteen Hegelund bool ret;
1265c956b9b3SSteen Hegelund enum vcap_keyfield_set keysets[10] = {};
1266c956b9b3SSteen Hegelund
1267c956b9b3SSteen Hegelund matches.keysets = keysets;
1268c956b9b3SSteen Hegelund matches.max = ARRAY_SIZE(keysets);
1269c956b9b3SSteen Hegelund
1270c956b9b3SSteen Hegelund INIT_LIST_HEAD(&ri.data.keyfields);
1271c956b9b3SSteen Hegelund for (idx = 0; idx < ARRAY_SIZE(ckf); idx++)
1272c956b9b3SSteen Hegelund list_add_tail(&ckf[idx].ctrl.list, &ri.data.keyfields);
1273c956b9b3SSteen Hegelund
1274465a38a2SSteen Hegelund ret = vcap_rule_find_keysets(&ri.data, &matches);
1275c956b9b3SSteen Hegelund
1276c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1277c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, matches.cnt);
1278c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_KFS_NO_VALUE, matches.keysets[0]);
1279c956b9b3SSteen Hegelund }
1280c956b9b3SSteen Hegelund
vcap_api_rule_find_keyset_many_test(struct kunit * test)1281c956b9b3SSteen Hegelund static void vcap_api_rule_find_keyset_many_test(struct kunit *test)
1282c956b9b3SSteen Hegelund {
1283c956b9b3SSteen Hegelund struct vcap_keyset_list matches = {};
1284c956b9b3SSteen Hegelund struct vcap_admin admin = {
1285c956b9b3SSteen Hegelund .vtype = VCAP_TYPE_IS2,
1286c956b9b3SSteen Hegelund };
1287c956b9b3SSteen Hegelund struct vcap_rule_internal ri = {
1288c956b9b3SSteen Hegelund .admin = &admin,
1289c956b9b3SSteen Hegelund .vctrl = &test_vctrl,
1290c956b9b3SSteen Hegelund };
1291c956b9b3SSteen Hegelund struct vcap_client_keyfield ckf[] = {
1292c956b9b3SSteen Hegelund {
1293c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_TYPE,
1294c956b9b3SSteen Hegelund }, {
1295c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_LOOKUP_FIRST_IS,
1296c956b9b3SSteen Hegelund }, {
1297c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_8021Q_DEI_CLS,
1298c956b9b3SSteen Hegelund }, {
1299c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_8021Q_PCP_CLS,
1300c956b9b3SSteen Hegelund }, {
1301c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_8021Q_VID_CLS,
1302c956b9b3SSteen Hegelund }, {
1303c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_ISDX_CLS,
1304c956b9b3SSteen Hegelund }, {
1305c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_L2_MC_IS,
1306c956b9b3SSteen Hegelund }, {
1307c956b9b3SSteen Hegelund .ctrl.key = VCAP_KF_L2_BC_IS,
1308c956b9b3SSteen Hegelund },
1309c956b9b3SSteen Hegelund };
1310c956b9b3SSteen Hegelund int idx;
1311c956b9b3SSteen Hegelund bool ret;
1312c956b9b3SSteen Hegelund enum vcap_keyfield_set keysets[10] = {};
1313c956b9b3SSteen Hegelund
1314c956b9b3SSteen Hegelund matches.keysets = keysets;
1315c956b9b3SSteen Hegelund matches.max = ARRAY_SIZE(keysets);
1316c956b9b3SSteen Hegelund
1317c956b9b3SSteen Hegelund INIT_LIST_HEAD(&ri.data.keyfields);
1318c956b9b3SSteen Hegelund for (idx = 0; idx < ARRAY_SIZE(ckf); idx++)
1319c956b9b3SSteen Hegelund list_add_tail(&ckf[idx].ctrl.list, &ri.data.keyfields);
1320c956b9b3SSteen Hegelund
1321465a38a2SSteen Hegelund ret = vcap_rule_find_keysets(&ri.data, &matches);
1322c956b9b3SSteen Hegelund
1323c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, true, ret);
1324c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 6, matches.cnt);
1325c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_KFS_ARP, matches.keysets[0]);
1326c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_KFS_IP4_OTHER, matches.keysets[1]);
1327c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_KFS_IP4_TCP_UDP, matches.keysets[2]);
1328c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_KFS_IP6_STD, matches.keysets[3]);
1329c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_KFS_IP_7TUPLE, matches.keysets[4]);
1330c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_KFS_MAC_ETYPE, matches.keysets[5]);
1331c956b9b3SSteen Hegelund }
1332c956b9b3SSteen Hegelund
vcap_api_encode_rule_test(struct kunit * test)1333c956b9b3SSteen Hegelund static void vcap_api_encode_rule_test(struct kunit *test)
1334c956b9b3SSteen Hegelund {
1335c956b9b3SSteen Hegelund /* Data used by VCAP Library callback */
1336c956b9b3SSteen Hegelund static u32 keydata[32] = {};
1337c956b9b3SSteen Hegelund static u32 mskdata[32] = {};
1338c956b9b3SSteen Hegelund static u32 actdata[32] = {};
1339c956b9b3SSteen Hegelund
1340c956b9b3SSteen Hegelund struct vcap_admin is2_admin = {
1341c956b9b3SSteen Hegelund .vtype = VCAP_TYPE_IS2,
134218a15c76SSteen Hegelund .first_cid = 8000000,
134318a15c76SSteen Hegelund .last_cid = 8099999,
1344c956b9b3SSteen Hegelund .lookups = 4,
1345c956b9b3SSteen Hegelund .last_valid_addr = 3071,
1346c956b9b3SSteen Hegelund .first_valid_addr = 0,
1347c956b9b3SSteen Hegelund .last_used_addr = 800,
1348c956b9b3SSteen Hegelund .cache = {
1349c956b9b3SSteen Hegelund .keystream = keydata,
1350c956b9b3SSteen Hegelund .maskstream = mskdata,
1351c956b9b3SSteen Hegelund .actionstream = actdata,
1352c956b9b3SSteen Hegelund },
1353c956b9b3SSteen Hegelund };
1354aa5ac4beSHoratiu Vultur struct vcap_rule *rule;
1355aa5ac4beSHoratiu Vultur struct vcap_rule_internal *ri;
135618a15c76SSteen Hegelund int vcap_chain_id = 8000000;
1357c956b9b3SSteen Hegelund enum vcap_user user = VCAP_USER_VCAP_UTIL;
1358c956b9b3SSteen Hegelund u16 priority = 10;
1359c956b9b3SSteen Hegelund int id = 100;
1360c956b9b3SSteen Hegelund int ret;
1361c956b9b3SSteen Hegelund struct vcap_u48_key smac = {
1362c956b9b3SSteen Hegelund .value = { 0x88, 0x75, 0x32, 0x34, 0x9e, 0xb1 },
1363c956b9b3SSteen Hegelund .mask = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }
1364c956b9b3SSteen Hegelund };
1365c956b9b3SSteen Hegelund struct vcap_u48_key dmac = {
1366c956b9b3SSteen Hegelund .value = { 0x06, 0x05, 0x04, 0x03, 0x02, 0x01 },
1367c956b9b3SSteen Hegelund .mask = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }
1368c956b9b3SSteen Hegelund };
1369c956b9b3SSteen Hegelund u32 port_mask_rng_value = 0x05;
1370c956b9b3SSteen Hegelund u32 port_mask_rng_mask = 0x0f;
1371c956b9b3SSteen Hegelund u32 igr_port_mask_value = 0xffabcd01;
1372c956b9b3SSteen Hegelund u32 igr_port_mask_mask = ~0;
1373d7953da4SSteen Hegelund /* counter is written as the first operation */
1374d7953da4SSteen Hegelund u32 expwriteaddr[] = {792, 792, 793, 794, 795, 796, 797};
1375c956b9b3SSteen Hegelund int idx;
1376c956b9b3SSteen Hegelund
1377c956b9b3SSteen Hegelund vcap_test_api_init(&is2_admin);
1378c956b9b3SSteen Hegelund
1379c956b9b3SSteen Hegelund /* Allocate the rule */
1380c956b9b3SSteen Hegelund rule = vcap_alloc_rule(&test_vctrl, &test_netdev, vcap_chain_id, user,
1381c956b9b3SSteen Hegelund priority, id);
1382c956b9b3SSteen Hegelund KUNIT_EXPECT_PTR_NE(test, NULL, rule);
1383c956b9b3SSteen Hegelund ri = (struct vcap_rule_internal *)rule;
1384c956b9b3SSteen Hegelund
1385c956b9b3SSteen Hegelund /* Add rule keys */
1386c956b9b3SSteen Hegelund ret = vcap_rule_add_key_u48(rule, VCAP_KF_L2_DMAC, &dmac);
1387c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1388c956b9b3SSteen Hegelund ret = vcap_rule_add_key_u48(rule, VCAP_KF_L2_SMAC, &smac);
1389c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1390c956b9b3SSteen Hegelund ret = vcap_rule_add_key_bit(rule, VCAP_KF_ETYPE_LEN_IS, VCAP_BIT_1);
1391c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1392c956b9b3SSteen Hegelund /* Cannot add the same field twice */
1393c956b9b3SSteen Hegelund ret = vcap_rule_add_key_bit(rule, VCAP_KF_ETYPE_LEN_IS, VCAP_BIT_1);
1394c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, -EINVAL, ret);
1395c956b9b3SSteen Hegelund ret = vcap_rule_add_key_bit(rule, VCAP_KF_IF_IGR_PORT_MASK_L3,
1396c956b9b3SSteen Hegelund VCAP_BIT_ANY);
1397c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1398c956b9b3SSteen Hegelund ret = vcap_rule_add_key_u32(rule, VCAP_KF_IF_IGR_PORT_MASK_RNG,
1399c956b9b3SSteen Hegelund port_mask_rng_value, port_mask_rng_mask);
1400c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1401c956b9b3SSteen Hegelund ret = vcap_rule_add_key_u32(rule, VCAP_KF_IF_IGR_PORT_MASK,
1402c956b9b3SSteen Hegelund igr_port_mask_value, igr_port_mask_mask);
1403c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1404c956b9b3SSteen Hegelund
1405c956b9b3SSteen Hegelund /* Add rule actions */
1406c956b9b3SSteen Hegelund ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_1);
1407c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1408c956b9b3SSteen Hegelund ret = vcap_rule_add_action_u32(rule, VCAP_AF_CNT_ID, id);
1409c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1410c956b9b3SSteen Hegelund ret = vcap_rule_add_action_u32(rule, VCAP_AF_MATCH_ID, 1);
1411c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1412c956b9b3SSteen Hegelund ret = vcap_rule_add_action_u32(rule, VCAP_AF_MATCH_ID_MASK, 1);
1413c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1414c956b9b3SSteen Hegelund
1415c956b9b3SSteen Hegelund /* For now the actionset is hardcoded */
1416c956b9b3SSteen Hegelund ret = vcap_set_rule_set_actionset(rule, VCAP_AFS_BASE_TYPE);
1417c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1418c956b9b3SSteen Hegelund
1419c956b9b3SSteen Hegelund /* Validation with validate keyset callback */
1420c956b9b3SSteen Hegelund ret = vcap_val_rule(rule, ETH_P_ALL);
1421c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1422c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_KFS_MAC_ETYPE, rule->keyset);
1423c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, VCAP_AFS_BASE_TYPE, rule->actionset);
1424c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 6, ri->size);
1425c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 2, ri->keyset_sw_regs);
1426c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 4, ri->actionset_sw_regs);
1427c956b9b3SSteen Hegelund
142818a15c76SSteen Hegelund /* Enable lookup, so the rule will be written */
142918a15c76SSteen Hegelund ret = vcap_enable_lookups(&test_vctrl, &test_netdev, 0,
143018a15c76SSteen Hegelund rule->vcap_chain_id, rule->cookie, true);
143118a15c76SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
143218a15c76SSteen Hegelund
1433c956b9b3SSteen Hegelund /* Add rule with write callback */
1434c956b9b3SSteen Hegelund ret = vcap_add_rule(rule);
1435c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1436c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 792, is2_admin.last_used_addr);
1437c956b9b3SSteen Hegelund for (idx = 0; idx < ARRAY_SIZE(expwriteaddr); ++idx)
1438c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, expwriteaddr[idx], test_updateaddr[idx]);
1439c956b9b3SSteen Hegelund
1440c956b9b3SSteen Hegelund /* Check that the rule has been added */
1441c956b9b3SSteen Hegelund ret = list_empty(&is2_admin.rules);
1442c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1443c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
144489e3af02SJinjie Ruan
144589e3af02SJinjie Ruan vcap_enable_lookups(&test_vctrl, &test_netdev, 0, 0,
144689e3af02SJinjie Ruan rule->cookie, false);
144789e3af02SJinjie Ruan
1448b0804c28SJens Emil Schulz Østergaard ret = vcap_del_rule(&test_vctrl, &test_netdev, id);
1449b0804c28SJens Emil Schulz Østergaard KUNIT_EXPECT_EQ(test, 0, ret);
145020b5342dSJinjie Ruan
145120b5342dSJinjie Ruan vcap_free_rule(rule);
1452c956b9b3SSteen Hegelund }
1453c956b9b3SSteen Hegelund
vcap_api_set_rule_counter_test(struct kunit * test)1454dccc30ccSSteen Hegelund static void vcap_api_set_rule_counter_test(struct kunit *test)
1455dccc30ccSSteen Hegelund {
1456dccc30ccSSteen Hegelund struct vcap_admin is2_admin = {
1457dccc30ccSSteen Hegelund .cache = {
1458dccc30ccSSteen Hegelund .counter = 100,
1459dccc30ccSSteen Hegelund .sticky = true,
1460dccc30ccSSteen Hegelund },
1461dccc30ccSSteen Hegelund };
1462dccc30ccSSteen Hegelund struct vcap_rule_internal ri = {
1463dccc30ccSSteen Hegelund .data = {
1464dccc30ccSSteen Hegelund .id = 1001,
1465dccc30ccSSteen Hegelund },
1466dccc30ccSSteen Hegelund .addr = 600,
1467dccc30ccSSteen Hegelund .admin = &is2_admin,
1468dccc30ccSSteen Hegelund .counter_id = 1002,
1469dccc30ccSSteen Hegelund .vctrl = &test_vctrl,
1470dccc30ccSSteen Hegelund };
1471dccc30ccSSteen Hegelund struct vcap_rule_internal ri2 = {
1472dccc30ccSSteen Hegelund .data = {
1473dccc30ccSSteen Hegelund .id = 2001,
1474dccc30ccSSteen Hegelund },
1475dccc30ccSSteen Hegelund .addr = 700,
1476dccc30ccSSteen Hegelund .admin = &is2_admin,
1477dccc30ccSSteen Hegelund .counter_id = 2002,
1478dccc30ccSSteen Hegelund .vctrl = &test_vctrl,
1479dccc30ccSSteen Hegelund };
1480dccc30ccSSteen Hegelund struct vcap_counter ctr = { .value = 0, .sticky = false};
1481dccc30ccSSteen Hegelund struct vcap_counter ctr2 = { .value = 101, .sticky = true};
1482dccc30ccSSteen Hegelund int ret;
1483dccc30ccSSteen Hegelund
1484dccc30ccSSteen Hegelund vcap_test_api_init(&is2_admin);
1485dccc30ccSSteen Hegelund list_add_tail(&ri.list, &is2_admin.rules);
1486dccc30ccSSteen Hegelund list_add_tail(&ri2.list, &is2_admin.rules);
1487dccc30ccSSteen Hegelund
1488dccc30ccSSteen Hegelund pr_info("%s:%d\n", __func__, __LINE__);
1489dccc30ccSSteen Hegelund ret = vcap_rule_set_counter(&ri.data, &ctr);
1490dccc30ccSSteen Hegelund pr_info("%s:%d\n", __func__, __LINE__);
1491dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1492dccc30ccSSteen Hegelund
1493dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 1002, test_hw_counter_id);
1494dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_hw_cache.counter);
1495dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, false, test_hw_cache.sticky);
1496dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 600, test_updateaddr[0]);
1497dccc30ccSSteen Hegelund
1498dccc30ccSSteen Hegelund ret = vcap_rule_set_counter(&ri2.data, &ctr2);
1499dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1500dccc30ccSSteen Hegelund
1501dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 2002, test_hw_counter_id);
1502dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 101, test_hw_cache.counter);
1503dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, true, test_hw_cache.sticky);
1504dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 700, test_updateaddr[1]);
1505dccc30ccSSteen Hegelund }
1506dccc30ccSSteen Hegelund
vcap_api_get_rule_counter_test(struct kunit * test)1507dccc30ccSSteen Hegelund static void vcap_api_get_rule_counter_test(struct kunit *test)
1508dccc30ccSSteen Hegelund {
1509dccc30ccSSteen Hegelund struct vcap_admin is2_admin = {
1510dccc30ccSSteen Hegelund .cache = {
1511dccc30ccSSteen Hegelund .counter = 100,
1512dccc30ccSSteen Hegelund .sticky = true,
1513dccc30ccSSteen Hegelund },
1514dccc30ccSSteen Hegelund };
1515dccc30ccSSteen Hegelund struct vcap_rule_internal ri = {
1516dccc30ccSSteen Hegelund .data = {
1517dccc30ccSSteen Hegelund .id = 1010,
1518dccc30ccSSteen Hegelund },
1519dccc30ccSSteen Hegelund .addr = 400,
1520dccc30ccSSteen Hegelund .admin = &is2_admin,
1521dccc30ccSSteen Hegelund .counter_id = 1011,
1522dccc30ccSSteen Hegelund .vctrl = &test_vctrl,
1523dccc30ccSSteen Hegelund };
1524dccc30ccSSteen Hegelund struct vcap_rule_internal ri2 = {
1525dccc30ccSSteen Hegelund .data = {
1526dccc30ccSSteen Hegelund .id = 2011,
1527dccc30ccSSteen Hegelund },
1528dccc30ccSSteen Hegelund .addr = 300,
1529dccc30ccSSteen Hegelund .admin = &is2_admin,
1530dccc30ccSSteen Hegelund .counter_id = 2012,
1531dccc30ccSSteen Hegelund .vctrl = &test_vctrl,
1532dccc30ccSSteen Hegelund };
1533dccc30ccSSteen Hegelund struct vcap_counter ctr = {};
1534dccc30ccSSteen Hegelund struct vcap_counter ctr2 = {};
1535dccc30ccSSteen Hegelund int ret;
1536dccc30ccSSteen Hegelund
1537dccc30ccSSteen Hegelund vcap_test_api_init(&is2_admin);
1538dccc30ccSSteen Hegelund test_hw_cache.counter = 55;
1539dccc30ccSSteen Hegelund test_hw_cache.sticky = true;
1540dccc30ccSSteen Hegelund
1541dccc30ccSSteen Hegelund list_add_tail(&ri.list, &is2_admin.rules);
1542dccc30ccSSteen Hegelund list_add_tail(&ri2.list, &is2_admin.rules);
1543dccc30ccSSteen Hegelund
1544dccc30ccSSteen Hegelund ret = vcap_rule_get_counter(&ri.data, &ctr);
1545dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1546dccc30ccSSteen Hegelund
1547dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 1011, test_hw_counter_id);
1548dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 55, ctr.value);
1549dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, true, ctr.sticky);
1550dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 400, test_updateaddr[0]);
1551dccc30ccSSteen Hegelund
1552dccc30ccSSteen Hegelund test_hw_cache.counter = 22;
1553dccc30ccSSteen Hegelund test_hw_cache.sticky = false;
1554dccc30ccSSteen Hegelund
1555dccc30ccSSteen Hegelund ret = vcap_rule_get_counter(&ri2.data, &ctr2);
1556dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1557dccc30ccSSteen Hegelund
1558dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 2012, test_hw_counter_id);
1559dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 22, ctr2.value);
1560dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, false, ctr2.sticky);
1561dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 300, test_updateaddr[1]);
1562dccc30ccSSteen Hegelund }
1563dccc30ccSSteen Hegelund
vcap_api_rule_insert_in_order_test(struct kunit * test)1564dccc30ccSSteen Hegelund static void vcap_api_rule_insert_in_order_test(struct kunit *test)
1565dccc30ccSSteen Hegelund {
1566dccc30ccSSteen Hegelund /* Data used by VCAP Library callback */
1567dccc30ccSSteen Hegelund static u32 keydata[32] = {};
1568dccc30ccSSteen Hegelund static u32 mskdata[32] = {};
1569dccc30ccSSteen Hegelund static u32 actdata[32] = {};
1570dccc30ccSSteen Hegelund
1571dccc30ccSSteen Hegelund struct vcap_admin admin = {
1572dccc30ccSSteen Hegelund .vtype = VCAP_TYPE_IS0,
1573dccc30ccSSteen Hegelund .first_cid = 10000,
1574dccc30ccSSteen Hegelund .last_cid = 19999,
1575dccc30ccSSteen Hegelund .lookups = 4,
1576dccc30ccSSteen Hegelund .last_valid_addr = 3071,
1577dccc30ccSSteen Hegelund .first_valid_addr = 0,
1578dccc30ccSSteen Hegelund .last_used_addr = 800,
1579dccc30ccSSteen Hegelund .cache = {
1580dccc30ccSSteen Hegelund .keystream = keydata,
1581dccc30ccSSteen Hegelund .maskstream = mskdata,
1582dccc30ccSSteen Hegelund .actionstream = actdata,
1583dccc30ccSSteen Hegelund },
1584dccc30ccSSteen Hegelund };
1585dccc30ccSSteen Hegelund
1586dccc30ccSSteen Hegelund vcap_test_api_init(&admin);
1587dccc30ccSSteen Hegelund
1588dccc30ccSSteen Hegelund /* Create rules with different sizes and check that they are placed
1589dccc30ccSSteen Hegelund * at the correct address in the VCAP according to size
1590dccc30ccSSteen Hegelund */
1591dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 10, 500, 12, 780);
1592dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 400, 6, 774);
1593dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 771);
1594dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 200, 2, 768);
15952a2dffd9SJinjie Ruan
15962a2dffd9SJinjie Ruan vcap_del_rule(&test_vctrl, &test_netdev, 200);
15972a2dffd9SJinjie Ruan vcap_del_rule(&test_vctrl, &test_netdev, 300);
15982a2dffd9SJinjie Ruan vcap_del_rule(&test_vctrl, &test_netdev, 400);
15992a2dffd9SJinjie Ruan vcap_del_rule(&test_vctrl, &test_netdev, 500);
1600dccc30ccSSteen Hegelund }
1601dccc30ccSSteen Hegelund
vcap_api_rule_insert_reverse_order_test(struct kunit * test)1602dccc30ccSSteen Hegelund static void vcap_api_rule_insert_reverse_order_test(struct kunit *test)
1603dccc30ccSSteen Hegelund {
1604dccc30ccSSteen Hegelund /* Data used by VCAP Library callback */
1605dccc30ccSSteen Hegelund static u32 keydata[32] = {};
1606dccc30ccSSteen Hegelund static u32 mskdata[32] = {};
1607dccc30ccSSteen Hegelund static u32 actdata[32] = {};
1608dccc30ccSSteen Hegelund
1609dccc30ccSSteen Hegelund struct vcap_admin admin = {
1610dccc30ccSSteen Hegelund .vtype = VCAP_TYPE_IS0,
1611dccc30ccSSteen Hegelund .first_cid = 10000,
1612dccc30ccSSteen Hegelund .last_cid = 19999,
1613dccc30ccSSteen Hegelund .lookups = 4,
1614dccc30ccSSteen Hegelund .last_valid_addr = 3071,
1615dccc30ccSSteen Hegelund .first_valid_addr = 0,
1616dccc30ccSSteen Hegelund .last_used_addr = 800,
1617dccc30ccSSteen Hegelund .cache = {
1618dccc30ccSSteen Hegelund .keystream = keydata,
1619dccc30ccSSteen Hegelund .maskstream = mskdata,
1620dccc30ccSSteen Hegelund .actionstream = actdata,
1621dccc30ccSSteen Hegelund },
1622dccc30ccSSteen Hegelund };
1623dccc30ccSSteen Hegelund struct vcap_rule_internal *elem;
1624dccc30ccSSteen Hegelund u32 exp_addr[] = {780, 774, 771, 768, 767};
1625dccc30ccSSteen Hegelund int idx;
1626dccc30ccSSteen Hegelund
1627dccc30ccSSteen Hegelund vcap_test_api_init(&admin);
1628dccc30ccSSteen Hegelund
1629dccc30ccSSteen Hegelund /* Create rules with different sizes and check that they are placed
1630dccc30ccSSteen Hegelund * at the correct address in the VCAP according to size
1631dccc30ccSSteen Hegelund */
1632dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 200, 2, 798);
1633dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1634dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_count);
1635dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1636dccc30ccSSteen Hegelund
1637dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 795);
1638dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 6, test_move_offset);
1639dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 3, test_move_count);
1640dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 798, test_move_addr);
1641dccc30ccSSteen Hegelund
1642dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 400, 6, 792);
1643dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 6, test_move_offset);
1644dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 6, test_move_count);
1645dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 792, test_move_addr);
1646dccc30ccSSteen Hegelund
1647dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 50, 500, 12, 780);
1648dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 18, test_move_offset);
1649dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 12, test_move_count);
1650dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 786, test_move_addr);
1651dccc30ccSSteen Hegelund
1652dccc30ccSSteen Hegelund idx = 0;
1653dccc30ccSSteen Hegelund list_for_each_entry(elem, &admin.rules, list) {
1654dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, exp_addr[idx], elem->addr);
1655dccc30ccSSteen Hegelund ++idx;
1656dccc30ccSSteen Hegelund }
1657dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 768, admin.last_used_addr);
16582a2dffd9SJinjie Ruan
16592a2dffd9SJinjie Ruan vcap_del_rule(&test_vctrl, &test_netdev, 500);
16602a2dffd9SJinjie Ruan vcap_del_rule(&test_vctrl, &test_netdev, 400);
16612a2dffd9SJinjie Ruan vcap_del_rule(&test_vctrl, &test_netdev, 300);
16622a2dffd9SJinjie Ruan vcap_del_rule(&test_vctrl, &test_netdev, 200);
1663dccc30ccSSteen Hegelund }
1664dccc30ccSSteen Hegelund
vcap_api_rule_remove_at_end_test(struct kunit * test)1665dccc30ccSSteen Hegelund static void vcap_api_rule_remove_at_end_test(struct kunit *test)
1666dccc30ccSSteen Hegelund {
1667dccc30ccSSteen Hegelund /* Data used by VCAP Library callback */
1668dccc30ccSSteen Hegelund static u32 keydata[32] = {};
1669dccc30ccSSteen Hegelund static u32 mskdata[32] = {};
1670dccc30ccSSteen Hegelund static u32 actdata[32] = {};
1671dccc30ccSSteen Hegelund
1672dccc30ccSSteen Hegelund struct vcap_admin admin = {
1673dccc30ccSSteen Hegelund .vtype = VCAP_TYPE_IS0,
1674dccc30ccSSteen Hegelund .first_cid = 10000,
1675dccc30ccSSteen Hegelund .last_cid = 19999,
1676dccc30ccSSteen Hegelund .lookups = 4,
1677dccc30ccSSteen Hegelund .last_valid_addr = 3071,
1678dccc30ccSSteen Hegelund .first_valid_addr = 0,
1679dccc30ccSSteen Hegelund .last_used_addr = 800,
1680dccc30ccSSteen Hegelund .cache = {
1681dccc30ccSSteen Hegelund .keystream = keydata,
1682dccc30ccSSteen Hegelund .maskstream = mskdata,
1683dccc30ccSSteen Hegelund .actionstream = actdata,
1684dccc30ccSSteen Hegelund },
1685dccc30ccSSteen Hegelund };
1686dccc30ccSSteen Hegelund int ret;
1687dccc30ccSSteen Hegelund
1688dccc30ccSSteen Hegelund vcap_test_api_init(&admin);
1689dccc30ccSSteen Hegelund test_init_rule_deletion();
1690dccc30ccSSteen Hegelund
1691dccc30ccSSteen Hegelund /* Create rules with different sizes and check that they are placed
1692dccc30ccSSteen Hegelund * at the correct address in the VCAP according to size
1693dccc30ccSSteen Hegelund */
1694dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 10, 500, 12, 780);
1695dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 400, 6, 774);
1696dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 771);
1697dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 200, 2, 768);
1698dccc30ccSSteen Hegelund
1699dccc30ccSSteen Hegelund /* Remove rules again from the end */
1700dccc30ccSSteen Hegelund ret = vcap_del_rule(&test_vctrl, &test_netdev, 200);
1701dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1702dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1703dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1704dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_count);
1705dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 768, test_init_start);
1706dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 2, test_init_count);
1707dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 771, admin.last_used_addr);
1708dccc30ccSSteen Hegelund
1709dccc30ccSSteen Hegelund ret = vcap_del_rule(&test_vctrl, &test_netdev, 300);
1710dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, ret, 0);
1711dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1712dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1713dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_count);
1714dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 771, test_init_start);
1715dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 3, test_init_count);
1716dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 774, admin.last_used_addr);
1717dccc30ccSSteen Hegelund
1718dccc30ccSSteen Hegelund ret = vcap_del_rule(&test_vctrl, &test_netdev, 400);
1719dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, ret, 0);
1720dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1721dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1722dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_count);
1723dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 774, test_init_start);
1724dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 6, test_init_count);
1725dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 780, admin.last_used_addr);
1726dccc30ccSSteen Hegelund
1727dccc30ccSSteen Hegelund ret = vcap_del_rule(&test_vctrl, &test_netdev, 500);
1728dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, ret, 0);
1729dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1730dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1731dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_count);
1732dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 780, test_init_start);
1733dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 12, test_init_count);
1734552b7d13SSteen Hegelund KUNIT_EXPECT_EQ(test, 3072, admin.last_used_addr);
1735dccc30ccSSteen Hegelund }
1736dccc30ccSSteen Hegelund
vcap_api_rule_remove_in_middle_test(struct kunit * test)1737dccc30ccSSteen Hegelund static void vcap_api_rule_remove_in_middle_test(struct kunit *test)
1738dccc30ccSSteen Hegelund {
1739dccc30ccSSteen Hegelund /* Data used by VCAP Library callback */
1740dccc30ccSSteen Hegelund static u32 keydata[32] = {};
1741dccc30ccSSteen Hegelund static u32 mskdata[32] = {};
1742dccc30ccSSteen Hegelund static u32 actdata[32] = {};
1743dccc30ccSSteen Hegelund
1744dccc30ccSSteen Hegelund struct vcap_admin admin = {
1745dccc30ccSSteen Hegelund .vtype = VCAP_TYPE_IS0,
1746dccc30ccSSteen Hegelund .first_cid = 10000,
1747dccc30ccSSteen Hegelund .last_cid = 19999,
1748dccc30ccSSteen Hegelund .lookups = 4,
1749dccc30ccSSteen Hegelund .first_valid_addr = 0,
1750dccc30ccSSteen Hegelund .last_used_addr = 800,
1751dccc30ccSSteen Hegelund .last_valid_addr = 800 - 1,
1752dccc30ccSSteen Hegelund .cache = {
1753dccc30ccSSteen Hegelund .keystream = keydata,
1754dccc30ccSSteen Hegelund .maskstream = mskdata,
1755dccc30ccSSteen Hegelund .actionstream = actdata,
1756dccc30ccSSteen Hegelund },
1757dccc30ccSSteen Hegelund };
1758dccc30ccSSteen Hegelund int ret;
1759dccc30ccSSteen Hegelund
1760dccc30ccSSteen Hegelund vcap_test_api_init(&admin);
1761dccc30ccSSteen Hegelund
1762dccc30ccSSteen Hegelund /* Create rules with different sizes and check that they are placed
1763dccc30ccSSteen Hegelund * at the correct address in the VCAP according to size
1764dccc30ccSSteen Hegelund */
1765dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 10, 500, 12, 780);
1766dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 400, 6, 774);
1767dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 771);
1768dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 200, 2, 768);
1769dccc30ccSSteen Hegelund
1770dccc30ccSSteen Hegelund /* Remove rules in the middle */
1771dccc30ccSSteen Hegelund test_init_rule_deletion();
1772dccc30ccSSteen Hegelund ret = vcap_del_rule(&test_vctrl, &test_netdev, 400);
1773dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1774dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 768, test_move_addr);
1775dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, -6, test_move_offset);
1776dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 6, test_move_count);
1777dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 768, test_init_start);
1778dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 6, test_init_count);
1779dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 774, admin.last_used_addr);
1780dccc30ccSSteen Hegelund
1781dccc30ccSSteen Hegelund test_init_rule_deletion();
1782dccc30ccSSteen Hegelund ret = vcap_del_rule(&test_vctrl, &test_netdev, 300);
1783dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1784dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 774, test_move_addr);
1785dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, -4, test_move_offset);
1786dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 2, test_move_count);
1787dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 774, test_init_start);
1788dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 4, test_init_count);
1789dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 778, admin.last_used_addr);
1790dccc30ccSSteen Hegelund
1791dccc30ccSSteen Hegelund test_init_rule_deletion();
1792dccc30ccSSteen Hegelund ret = vcap_del_rule(&test_vctrl, &test_netdev, 500);
1793dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1794dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 778, test_move_addr);
1795dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, -20, test_move_offset);
1796dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 2, test_move_count);
1797dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 778, test_init_start);
1798dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 20, test_init_count);
1799dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 798, admin.last_used_addr);
1800dccc30ccSSteen Hegelund
1801dccc30ccSSteen Hegelund test_init_rule_deletion();
1802dccc30ccSSteen Hegelund ret = vcap_del_rule(&test_vctrl, &test_netdev, 200);
1803dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1804dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1805dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1806dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_count);
1807dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 798, test_init_start);
1808dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 2, test_init_count);
1809552b7d13SSteen Hegelund KUNIT_EXPECT_EQ(test, 800, admin.last_used_addr);
1810dccc30ccSSteen Hegelund }
1811dccc30ccSSteen Hegelund
vcap_api_rule_remove_in_front_test(struct kunit * test)1812dccc30ccSSteen Hegelund static void vcap_api_rule_remove_in_front_test(struct kunit *test)
1813dccc30ccSSteen Hegelund {
1814dccc30ccSSteen Hegelund /* Data used by VCAP Library callback */
1815dccc30ccSSteen Hegelund static u32 keydata[32] = {};
1816dccc30ccSSteen Hegelund static u32 mskdata[32] = {};
1817dccc30ccSSteen Hegelund static u32 actdata[32] = {};
1818dccc30ccSSteen Hegelund
1819dccc30ccSSteen Hegelund struct vcap_admin admin = {
1820dccc30ccSSteen Hegelund .vtype = VCAP_TYPE_IS0,
1821dccc30ccSSteen Hegelund .first_cid = 10000,
1822dccc30ccSSteen Hegelund .last_cid = 19999,
1823dccc30ccSSteen Hegelund .lookups = 4,
1824dccc30ccSSteen Hegelund .first_valid_addr = 0,
1825dccc30ccSSteen Hegelund .last_used_addr = 800,
1826dccc30ccSSteen Hegelund .last_valid_addr = 800 - 1,
1827dccc30ccSSteen Hegelund .cache = {
1828dccc30ccSSteen Hegelund .keystream = keydata,
1829dccc30ccSSteen Hegelund .maskstream = mskdata,
1830dccc30ccSSteen Hegelund .actionstream = actdata,
1831dccc30ccSSteen Hegelund },
1832dccc30ccSSteen Hegelund };
1833dccc30ccSSteen Hegelund int ret;
1834dccc30ccSSteen Hegelund
1835dccc30ccSSteen Hegelund vcap_test_api_init(&admin);
1836dccc30ccSSteen Hegelund
1837dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 10, 500, 12, 780);
1838dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 780, admin.last_used_addr);
1839dccc30ccSSteen Hegelund
1840dccc30ccSSteen Hegelund test_init_rule_deletion();
1841dccc30ccSSteen Hegelund ret = vcap_del_rule(&test_vctrl, &test_netdev, 500);
1842dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1843dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1844dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1845dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, test_move_count);
1846dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 780, test_init_start);
1847dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 12, test_init_count);
1848552b7d13SSteen Hegelund KUNIT_EXPECT_EQ(test, 800, admin.last_used_addr);
1849dccc30ccSSteen Hegelund
1850dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 400, 6, 792);
1851dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 789);
1852dccc30ccSSteen Hegelund test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 200, 2, 786);
1853dccc30ccSSteen Hegelund
1854dccc30ccSSteen Hegelund test_init_rule_deletion();
1855dccc30ccSSteen Hegelund ret = vcap_del_rule(&test_vctrl, &test_netdev, 400);
1856dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
1857dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 786, test_move_addr);
1858dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, -8, test_move_offset);
1859dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 6, test_move_count);
1860dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 786, test_init_start);
1861dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 8, test_init_count);
1862dccc30ccSSteen Hegelund KUNIT_EXPECT_EQ(test, 794, admin.last_used_addr);
18632a2dffd9SJinjie Ruan
18642a2dffd9SJinjie Ruan vcap_del_rule(&test_vctrl, &test_netdev, 200);
18652a2dffd9SJinjie Ruan vcap_del_rule(&test_vctrl, &test_netdev, 300);
1866dccc30ccSSteen Hegelund }
1867dccc30ccSSteen Hegelund
1868dccc30ccSSteen Hegelund static struct kunit_case vcap_api_rule_remove_test_cases[] = {
1869dccc30ccSSteen Hegelund KUNIT_CASE(vcap_api_rule_remove_at_end_test),
1870dccc30ccSSteen Hegelund KUNIT_CASE(vcap_api_rule_remove_in_middle_test),
1871dccc30ccSSteen Hegelund KUNIT_CASE(vcap_api_rule_remove_in_front_test),
1872dccc30ccSSteen Hegelund {}
1873dccc30ccSSteen Hegelund };
1874dccc30ccSSteen Hegelund
vcap_api_next_lookup_basic_test(struct kunit * test)1875c956b9b3SSteen Hegelund static void vcap_api_next_lookup_basic_test(struct kunit *test)
1876c956b9b3SSteen Hegelund {
1877c956b9b3SSteen Hegelund struct vcap_admin admin1 = {
1878c956b9b3SSteen Hegelund .vtype = VCAP_TYPE_IS2,
1879c956b9b3SSteen Hegelund .vinst = 0,
1880c956b9b3SSteen Hegelund .first_cid = 8000000,
1881c956b9b3SSteen Hegelund .last_cid = 8199999,
1882c956b9b3SSteen Hegelund .lookups = 4,
1883c956b9b3SSteen Hegelund .lookups_per_instance = 2,
1884c956b9b3SSteen Hegelund };
1885c956b9b3SSteen Hegelund struct vcap_admin admin2 = {
1886c956b9b3SSteen Hegelund .vtype = VCAP_TYPE_IS2,
1887c956b9b3SSteen Hegelund .vinst = 1,
1888c956b9b3SSteen Hegelund .first_cid = 8200000,
1889c956b9b3SSteen Hegelund .last_cid = 8399999,
1890c956b9b3SSteen Hegelund .lookups = 4,
1891c956b9b3SSteen Hegelund .lookups_per_instance = 2,
1892c956b9b3SSteen Hegelund };
1893c956b9b3SSteen Hegelund bool ret;
1894c956b9b3SSteen Hegelund
1895c956b9b3SSteen Hegelund vcap_test_api_init(&admin1);
1896c956b9b3SSteen Hegelund list_add_tail(&admin2.list, &test_vctrl.list);
1897c956b9b3SSteen Hegelund
1898c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 8000000, 1001000);
1899c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1900c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 8000000, 8001000);
1901c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1902c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 8000000, 8101000);
1903c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, true, ret);
1904c956b9b3SSteen Hegelund
1905c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 8100000, 8101000);
1906c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1907c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 8100000, 8201000);
1908c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, true, ret);
1909c956b9b3SSteen Hegelund
1910c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 8200000, 8201000);
1911c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1912c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 8200000, 8301000);
1913c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, true, ret);
1914c956b9b3SSteen Hegelund
1915c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 8300000, 8301000);
1916c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1917c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 8300000, 8401000);
1918784c3067SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1919c956b9b3SSteen Hegelund }
1920c956b9b3SSteen Hegelund
vcap_api_next_lookup_advanced_test(struct kunit * test)1921c956b9b3SSteen Hegelund static void vcap_api_next_lookup_advanced_test(struct kunit *test)
1922c956b9b3SSteen Hegelund {
1923129ff4deSArnd Bergmann struct vcap_admin admin[] = {
1924129ff4deSArnd Bergmann {
1925c956b9b3SSteen Hegelund .vtype = VCAP_TYPE_IS0,
1926c956b9b3SSteen Hegelund .vinst = 0,
1927c956b9b3SSteen Hegelund .first_cid = 1000000,
1928c956b9b3SSteen Hegelund .last_cid = 1199999,
1929c956b9b3SSteen Hegelund .lookups = 6,
1930c956b9b3SSteen Hegelund .lookups_per_instance = 2,
1931129ff4deSArnd Bergmann }, {
1932c956b9b3SSteen Hegelund .vtype = VCAP_TYPE_IS0,
1933c956b9b3SSteen Hegelund .vinst = 1,
1934c956b9b3SSteen Hegelund .first_cid = 1200000,
1935c956b9b3SSteen Hegelund .last_cid = 1399999,
1936c956b9b3SSteen Hegelund .lookups = 6,
1937c956b9b3SSteen Hegelund .lookups_per_instance = 2,
1938129ff4deSArnd Bergmann }, {
1939c956b9b3SSteen Hegelund .vtype = VCAP_TYPE_IS0,
1940c956b9b3SSteen Hegelund .vinst = 2,
1941c956b9b3SSteen Hegelund .first_cid = 1400000,
1942c956b9b3SSteen Hegelund .last_cid = 1599999,
1943c956b9b3SSteen Hegelund .lookups = 6,
1944c956b9b3SSteen Hegelund .lookups_per_instance = 2,
1945129ff4deSArnd Bergmann }, {
1946c956b9b3SSteen Hegelund .vtype = VCAP_TYPE_IS2,
1947c956b9b3SSteen Hegelund .vinst = 0,
1948c956b9b3SSteen Hegelund .first_cid = 8000000,
1949c956b9b3SSteen Hegelund .last_cid = 8199999,
1950c956b9b3SSteen Hegelund .lookups = 4,
1951c956b9b3SSteen Hegelund .lookups_per_instance = 2,
1952129ff4deSArnd Bergmann }, {
1953c956b9b3SSteen Hegelund .vtype = VCAP_TYPE_IS2,
1954c956b9b3SSteen Hegelund .vinst = 1,
1955c956b9b3SSteen Hegelund .first_cid = 8200000,
1956c956b9b3SSteen Hegelund .last_cid = 8399999,
1957c956b9b3SSteen Hegelund .lookups = 4,
1958c956b9b3SSteen Hegelund .lookups_per_instance = 2,
1959129ff4deSArnd Bergmann }
1960c956b9b3SSteen Hegelund };
1961c956b9b3SSteen Hegelund bool ret;
1962c956b9b3SSteen Hegelund
1963129ff4deSArnd Bergmann vcap_test_api_init(&admin[0]);
1964129ff4deSArnd Bergmann list_add_tail(&admin[1].list, &test_vctrl.list);
1965129ff4deSArnd Bergmann list_add_tail(&admin[2].list, &test_vctrl.list);
1966129ff4deSArnd Bergmann list_add_tail(&admin[3].list, &test_vctrl.list);
1967129ff4deSArnd Bergmann list_add_tail(&admin[4].list, &test_vctrl.list);
1968c956b9b3SSteen Hegelund
1969c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 1000000, 1001000);
1970c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1971c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 1000000, 1101000);
1972c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, true, ret);
1973c956b9b3SSteen Hegelund
1974c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 1100000, 1201000);
1975c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, true, ret);
1976c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 1100000, 1301000);
1977784c3067SSteen Hegelund KUNIT_EXPECT_EQ(test, true, ret);
1978c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 1100000, 8101000);
1979784c3067SSteen Hegelund KUNIT_EXPECT_EQ(test, true, ret);
1980c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 1300000, 1401000);
1981c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, true, ret);
1982c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 1400000, 1501000);
1983c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, true, ret);
1984c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 1500000, 8001000);
1985c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, true, ret);
1986c956b9b3SSteen Hegelund
1987c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 8000000, 8001000);
1988c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1989c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 8000000, 8101000);
1990c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, true, ret);
1991c956b9b3SSteen Hegelund
1992c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 8300000, 8301000);
1993c956b9b3SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1994c956b9b3SSteen Hegelund ret = vcap_is_next_lookup(&test_vctrl, 8300000, 8401000);
1995784c3067SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
1996c956b9b3SSteen Hegelund }
1997c956b9b3SSteen Hegelund
vcap_api_filter_unsupported_keys_test(struct kunit * test)199822f3c325SSteen Hegelund static void vcap_api_filter_unsupported_keys_test(struct kunit *test)
199922f3c325SSteen Hegelund {
200022f3c325SSteen Hegelund struct vcap_admin admin = {
200122f3c325SSteen Hegelund .vtype = VCAP_TYPE_IS2,
200222f3c325SSteen Hegelund };
200322f3c325SSteen Hegelund struct vcap_rule_internal ri = {
200422f3c325SSteen Hegelund .admin = &admin,
200522f3c325SSteen Hegelund .vctrl = &test_vctrl,
200622f3c325SSteen Hegelund .data.keyset = VCAP_KFS_MAC_ETYPE,
200722f3c325SSteen Hegelund };
200822f3c325SSteen Hegelund enum vcap_key_field keylist[] = {
200922f3c325SSteen Hegelund VCAP_KF_TYPE,
201022f3c325SSteen Hegelund VCAP_KF_LOOKUP_FIRST_IS,
201122f3c325SSteen Hegelund VCAP_KF_ARP_ADDR_SPACE_OK_IS, /* arp keys are not in keyset */
201222f3c325SSteen Hegelund VCAP_KF_ARP_PROTO_SPACE_OK_IS,
201322f3c325SSteen Hegelund VCAP_KF_ARP_LEN_OK_IS,
201422f3c325SSteen Hegelund VCAP_KF_ARP_TGT_MATCH_IS,
201522f3c325SSteen Hegelund VCAP_KF_ARP_SENDER_MATCH_IS,
201622f3c325SSteen Hegelund VCAP_KF_ARP_OPCODE_UNKNOWN_IS,
201722f3c325SSteen Hegelund VCAP_KF_ARP_OPCODE,
201822f3c325SSteen Hegelund VCAP_KF_8021Q_DEI_CLS,
201922f3c325SSteen Hegelund VCAP_KF_8021Q_PCP_CLS,
202022f3c325SSteen Hegelund VCAP_KF_8021Q_VID_CLS,
202122f3c325SSteen Hegelund VCAP_KF_L2_MC_IS,
202222f3c325SSteen Hegelund VCAP_KF_L2_BC_IS,
202322f3c325SSteen Hegelund };
202422f3c325SSteen Hegelund enum vcap_key_field expected[] = {
202522f3c325SSteen Hegelund VCAP_KF_TYPE,
202622f3c325SSteen Hegelund VCAP_KF_LOOKUP_FIRST_IS,
202722f3c325SSteen Hegelund VCAP_KF_8021Q_DEI_CLS,
202822f3c325SSteen Hegelund VCAP_KF_8021Q_PCP_CLS,
202922f3c325SSteen Hegelund VCAP_KF_8021Q_VID_CLS,
203022f3c325SSteen Hegelund VCAP_KF_L2_MC_IS,
203122f3c325SSteen Hegelund VCAP_KF_L2_BC_IS,
203222f3c325SSteen Hegelund };
203322f3c325SSteen Hegelund struct vcap_client_keyfield *ckf, *next;
203422f3c325SSteen Hegelund bool ret;
203522f3c325SSteen Hegelund int idx;
203622f3c325SSteen Hegelund
203722f3c325SSteen Hegelund /* Add all keys to the rule */
203822f3c325SSteen Hegelund INIT_LIST_HEAD(&ri.data.keyfields);
203922f3c325SSteen Hegelund for (idx = 0; idx < ARRAY_SIZE(keylist); idx++) {
204022f3c325SSteen Hegelund ckf = kzalloc(sizeof(*ckf), GFP_KERNEL);
204122f3c325SSteen Hegelund if (ckf) {
204222f3c325SSteen Hegelund ckf->ctrl.key = keylist[idx];
204322f3c325SSteen Hegelund list_add_tail(&ckf->ctrl.list, &ri.data.keyfields);
204422f3c325SSteen Hegelund }
204522f3c325SSteen Hegelund }
204622f3c325SSteen Hegelund
204722f3c325SSteen Hegelund KUNIT_EXPECT_EQ(test, 14, ARRAY_SIZE(keylist));
204822f3c325SSteen Hegelund
204922f3c325SSteen Hegelund /* Drop unsupported keys from the rule */
205022f3c325SSteen Hegelund ret = vcap_filter_rule_keys(&ri.data, NULL, 0, true);
205122f3c325SSteen Hegelund
205222f3c325SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
205322f3c325SSteen Hegelund
205422f3c325SSteen Hegelund /* Check remaining keys in the rule */
205522f3c325SSteen Hegelund idx = 0;
205622f3c325SSteen Hegelund list_for_each_entry_safe(ckf, next, &ri.data.keyfields, ctrl.list) {
205722f3c325SSteen Hegelund KUNIT_EXPECT_EQ(test, expected[idx], ckf->ctrl.key);
205822f3c325SSteen Hegelund list_del(&ckf->ctrl.list);
205922f3c325SSteen Hegelund kfree(ckf);
206022f3c325SSteen Hegelund ++idx;
206122f3c325SSteen Hegelund }
206222f3c325SSteen Hegelund KUNIT_EXPECT_EQ(test, 7, idx);
206322f3c325SSteen Hegelund }
206422f3c325SSteen Hegelund
vcap_api_filter_keylist_test(struct kunit * test)206522f3c325SSteen Hegelund static void vcap_api_filter_keylist_test(struct kunit *test)
206622f3c325SSteen Hegelund {
206722f3c325SSteen Hegelund struct vcap_admin admin = {
206822f3c325SSteen Hegelund .vtype = VCAP_TYPE_IS0,
206922f3c325SSteen Hegelund };
207022f3c325SSteen Hegelund struct vcap_rule_internal ri = {
207122f3c325SSteen Hegelund .admin = &admin,
207222f3c325SSteen Hegelund .vctrl = &test_vctrl,
207322f3c325SSteen Hegelund .data.keyset = VCAP_KFS_NORMAL_7TUPLE,
207422f3c325SSteen Hegelund };
207522f3c325SSteen Hegelund enum vcap_key_field keylist[] = {
207622f3c325SSteen Hegelund VCAP_KF_TYPE,
207722f3c325SSteen Hegelund VCAP_KF_LOOKUP_FIRST_IS,
207822f3c325SSteen Hegelund VCAP_KF_LOOKUP_GEN_IDX_SEL,
207922f3c325SSteen Hegelund VCAP_KF_LOOKUP_GEN_IDX,
208022f3c325SSteen Hegelund VCAP_KF_IF_IGR_PORT_MASK_SEL,
208122f3c325SSteen Hegelund VCAP_KF_IF_IGR_PORT_MASK,
208222f3c325SSteen Hegelund VCAP_KF_L2_MC_IS,
208322f3c325SSteen Hegelund VCAP_KF_L2_BC_IS,
208422f3c325SSteen Hegelund VCAP_KF_8021Q_VLAN_TAGS,
208522f3c325SSteen Hegelund VCAP_KF_8021Q_TPID0,
208622f3c325SSteen Hegelund VCAP_KF_8021Q_PCP0,
208722f3c325SSteen Hegelund VCAP_KF_8021Q_DEI0,
208822f3c325SSteen Hegelund VCAP_KF_8021Q_VID0,
208922f3c325SSteen Hegelund VCAP_KF_8021Q_TPID1,
209022f3c325SSteen Hegelund VCAP_KF_8021Q_PCP1,
209122f3c325SSteen Hegelund VCAP_KF_8021Q_DEI1,
209222f3c325SSteen Hegelund VCAP_KF_8021Q_VID1,
209322f3c325SSteen Hegelund VCAP_KF_8021Q_TPID2,
209422f3c325SSteen Hegelund VCAP_KF_8021Q_PCP2,
209522f3c325SSteen Hegelund VCAP_KF_8021Q_DEI2,
209622f3c325SSteen Hegelund VCAP_KF_8021Q_VID2,
209722f3c325SSteen Hegelund VCAP_KF_L2_DMAC,
209822f3c325SSteen Hegelund VCAP_KF_L2_SMAC,
209922f3c325SSteen Hegelund VCAP_KF_IP_MC_IS,
210022f3c325SSteen Hegelund VCAP_KF_ETYPE_LEN_IS,
210122f3c325SSteen Hegelund VCAP_KF_ETYPE,
210222f3c325SSteen Hegelund VCAP_KF_IP_SNAP_IS,
210322f3c325SSteen Hegelund VCAP_KF_IP4_IS,
210422f3c325SSteen Hegelund VCAP_KF_L3_FRAGMENT_TYPE,
210522f3c325SSteen Hegelund VCAP_KF_L3_FRAG_INVLD_L4_LEN,
210622f3c325SSteen Hegelund VCAP_KF_L3_OPTIONS_IS,
210722f3c325SSteen Hegelund VCAP_KF_L3_DSCP,
210822f3c325SSteen Hegelund VCAP_KF_L3_IP6_DIP,
210922f3c325SSteen Hegelund VCAP_KF_L3_IP6_SIP,
211022f3c325SSteen Hegelund VCAP_KF_TCP_UDP_IS,
211122f3c325SSteen Hegelund VCAP_KF_TCP_IS,
211222f3c325SSteen Hegelund VCAP_KF_L4_SPORT,
211322f3c325SSteen Hegelund VCAP_KF_L4_RNG,
211422f3c325SSteen Hegelund };
211522f3c325SSteen Hegelund enum vcap_key_field droplist[] = {
211622f3c325SSteen Hegelund VCAP_KF_8021Q_TPID1,
211722f3c325SSteen Hegelund VCAP_KF_8021Q_PCP1,
211822f3c325SSteen Hegelund VCAP_KF_8021Q_DEI1,
211922f3c325SSteen Hegelund VCAP_KF_8021Q_VID1,
212022f3c325SSteen Hegelund VCAP_KF_8021Q_TPID2,
212122f3c325SSteen Hegelund VCAP_KF_8021Q_PCP2,
212222f3c325SSteen Hegelund VCAP_KF_8021Q_DEI2,
212322f3c325SSteen Hegelund VCAP_KF_8021Q_VID2,
212422f3c325SSteen Hegelund VCAP_KF_L3_IP6_DIP,
212522f3c325SSteen Hegelund VCAP_KF_L3_IP6_SIP,
212622f3c325SSteen Hegelund VCAP_KF_L4_SPORT,
212722f3c325SSteen Hegelund VCAP_KF_L4_RNG,
212822f3c325SSteen Hegelund };
212922f3c325SSteen Hegelund enum vcap_key_field expected[] = {
213022f3c325SSteen Hegelund VCAP_KF_TYPE,
213122f3c325SSteen Hegelund VCAP_KF_LOOKUP_FIRST_IS,
213222f3c325SSteen Hegelund VCAP_KF_LOOKUP_GEN_IDX_SEL,
213322f3c325SSteen Hegelund VCAP_KF_LOOKUP_GEN_IDX,
213422f3c325SSteen Hegelund VCAP_KF_IF_IGR_PORT_MASK_SEL,
213522f3c325SSteen Hegelund VCAP_KF_IF_IGR_PORT_MASK,
213622f3c325SSteen Hegelund VCAP_KF_L2_MC_IS,
213722f3c325SSteen Hegelund VCAP_KF_L2_BC_IS,
213822f3c325SSteen Hegelund VCAP_KF_8021Q_VLAN_TAGS,
213922f3c325SSteen Hegelund VCAP_KF_8021Q_TPID0,
214022f3c325SSteen Hegelund VCAP_KF_8021Q_PCP0,
214122f3c325SSteen Hegelund VCAP_KF_8021Q_DEI0,
214222f3c325SSteen Hegelund VCAP_KF_8021Q_VID0,
214322f3c325SSteen Hegelund VCAP_KF_L2_DMAC,
214422f3c325SSteen Hegelund VCAP_KF_L2_SMAC,
214522f3c325SSteen Hegelund VCAP_KF_IP_MC_IS,
214622f3c325SSteen Hegelund VCAP_KF_ETYPE_LEN_IS,
214722f3c325SSteen Hegelund VCAP_KF_ETYPE,
214822f3c325SSteen Hegelund VCAP_KF_IP_SNAP_IS,
214922f3c325SSteen Hegelund VCAP_KF_IP4_IS,
215022f3c325SSteen Hegelund VCAP_KF_L3_FRAGMENT_TYPE,
215122f3c325SSteen Hegelund VCAP_KF_L3_FRAG_INVLD_L4_LEN,
215222f3c325SSteen Hegelund VCAP_KF_L3_OPTIONS_IS,
215322f3c325SSteen Hegelund VCAP_KF_L3_DSCP,
215422f3c325SSteen Hegelund VCAP_KF_TCP_UDP_IS,
215522f3c325SSteen Hegelund VCAP_KF_TCP_IS,
215622f3c325SSteen Hegelund };
215722f3c325SSteen Hegelund struct vcap_client_keyfield *ckf, *next;
215822f3c325SSteen Hegelund bool ret;
215922f3c325SSteen Hegelund int idx;
216022f3c325SSteen Hegelund
216122f3c325SSteen Hegelund /* Add all keys to the rule */
216222f3c325SSteen Hegelund INIT_LIST_HEAD(&ri.data.keyfields);
216322f3c325SSteen Hegelund for (idx = 0; idx < ARRAY_SIZE(keylist); idx++) {
216422f3c325SSteen Hegelund ckf = kzalloc(sizeof(*ckf), GFP_KERNEL);
216522f3c325SSteen Hegelund if (ckf) {
216622f3c325SSteen Hegelund ckf->ctrl.key = keylist[idx];
216722f3c325SSteen Hegelund list_add_tail(&ckf->ctrl.list, &ri.data.keyfields);
216822f3c325SSteen Hegelund }
216922f3c325SSteen Hegelund }
217022f3c325SSteen Hegelund
217122f3c325SSteen Hegelund KUNIT_EXPECT_EQ(test, 38, ARRAY_SIZE(keylist));
217222f3c325SSteen Hegelund
217322f3c325SSteen Hegelund /* Drop listed keys from the rule */
217422f3c325SSteen Hegelund ret = vcap_filter_rule_keys(&ri.data, droplist, ARRAY_SIZE(droplist),
217522f3c325SSteen Hegelund false);
217622f3c325SSteen Hegelund
217722f3c325SSteen Hegelund KUNIT_EXPECT_EQ(test, 0, ret);
217822f3c325SSteen Hegelund
217922f3c325SSteen Hegelund /* Check remaining keys in the rule */
218022f3c325SSteen Hegelund idx = 0;
218122f3c325SSteen Hegelund list_for_each_entry_safe(ckf, next, &ri.data.keyfields, ctrl.list) {
218222f3c325SSteen Hegelund KUNIT_EXPECT_EQ(test, expected[idx], ckf->ctrl.key);
218322f3c325SSteen Hegelund list_del(&ckf->ctrl.list);
218422f3c325SSteen Hegelund kfree(ckf);
218522f3c325SSteen Hegelund ++idx;
218622f3c325SSteen Hegelund }
218722f3c325SSteen Hegelund KUNIT_EXPECT_EQ(test, 26, idx);
218822f3c325SSteen Hegelund }
218922f3c325SSteen Hegelund
vcap_api_rule_chain_path_test(struct kunit * test)21901f741f00SSteen Hegelund static void vcap_api_rule_chain_path_test(struct kunit *test)
21911f741f00SSteen Hegelund {
21921f741f00SSteen Hegelund struct vcap_admin admin1 = {
21931f741f00SSteen Hegelund .vtype = VCAP_TYPE_IS0,
21941f741f00SSteen Hegelund .vinst = 0,
21951f741f00SSteen Hegelund .first_cid = 1000000,
21961f741f00SSteen Hegelund .last_cid = 1199999,
21971f741f00SSteen Hegelund .lookups = 6,
21981f741f00SSteen Hegelund .lookups_per_instance = 2,
21991f741f00SSteen Hegelund };
22001f741f00SSteen Hegelund struct vcap_enabled_port eport3 = {
22011f741f00SSteen Hegelund .ndev = &test_netdev,
22021f741f00SSteen Hegelund .cookie = 0x100,
22031f741f00SSteen Hegelund .src_cid = 0,
22041f741f00SSteen Hegelund .dst_cid = 1000000,
22051f741f00SSteen Hegelund };
22061f741f00SSteen Hegelund struct vcap_enabled_port eport2 = {
22071f741f00SSteen Hegelund .ndev = &test_netdev,
22081f741f00SSteen Hegelund .cookie = 0x200,
22091f741f00SSteen Hegelund .src_cid = 1000000,
22101f741f00SSteen Hegelund .dst_cid = 1100000,
22111f741f00SSteen Hegelund };
22121f741f00SSteen Hegelund struct vcap_enabled_port eport1 = {
22131f741f00SSteen Hegelund .ndev = &test_netdev,
22141f741f00SSteen Hegelund .cookie = 0x300,
22151f741f00SSteen Hegelund .src_cid = 1100000,
22161f741f00SSteen Hegelund .dst_cid = 8000000,
22171f741f00SSteen Hegelund };
22181f741f00SSteen Hegelund bool ret;
22191f741f00SSteen Hegelund int chain;
22201f741f00SSteen Hegelund
22211f741f00SSteen Hegelund vcap_test_api_init(&admin1);
22221f741f00SSteen Hegelund list_add_tail(&eport1.list, &admin1.enabled);
22231f741f00SSteen Hegelund list_add_tail(&eport2.list, &admin1.enabled);
22241f741f00SSteen Hegelund list_add_tail(&eport3.list, &admin1.enabled);
22251f741f00SSteen Hegelund
22261f741f00SSteen Hegelund ret = vcap_path_exist(&test_vctrl, &test_netdev, 1000000);
22271f741f00SSteen Hegelund KUNIT_EXPECT_EQ(test, true, ret);
22281f741f00SSteen Hegelund
22291f741f00SSteen Hegelund ret = vcap_path_exist(&test_vctrl, &test_netdev, 1100000);
22301f741f00SSteen Hegelund KUNIT_EXPECT_EQ(test, true, ret);
22311f741f00SSteen Hegelund
22321f741f00SSteen Hegelund ret = vcap_path_exist(&test_vctrl, &test_netdev, 1200000);
22331f741f00SSteen Hegelund KUNIT_EXPECT_EQ(test, false, ret);
22341f741f00SSteen Hegelund
22351f741f00SSteen Hegelund chain = vcap_get_next_chain(&test_vctrl, &test_netdev, 0);
22361f741f00SSteen Hegelund KUNIT_EXPECT_EQ(test, 1000000, chain);
22371f741f00SSteen Hegelund
22381f741f00SSteen Hegelund chain = vcap_get_next_chain(&test_vctrl, &test_netdev, 1000000);
22391f741f00SSteen Hegelund KUNIT_EXPECT_EQ(test, 1100000, chain);
22401f741f00SSteen Hegelund
22411f741f00SSteen Hegelund chain = vcap_get_next_chain(&test_vctrl, &test_netdev, 1100000);
22421f741f00SSteen Hegelund KUNIT_EXPECT_EQ(test, 8000000, chain);
22431f741f00SSteen Hegelund }
22441f741f00SSteen Hegelund
22451f741f00SSteen Hegelund static struct kunit_case vcap_api_rule_enable_test_cases[] = {
22461f741f00SSteen Hegelund KUNIT_CASE(vcap_api_rule_chain_path_test),
22471f741f00SSteen Hegelund {}
22481f741f00SSteen Hegelund };
22491f741f00SSteen Hegelund
22501f741f00SSteen Hegelund static struct kunit_suite vcap_api_rule_enable_test_suite = {
22511f741f00SSteen Hegelund .name = "VCAP_API_Rule_Enable_Testsuite",
22521f741f00SSteen Hegelund .test_cases = vcap_api_rule_enable_test_cases,
22531f741f00SSteen Hegelund };
22541f741f00SSteen Hegelund
2255dccc30ccSSteen Hegelund static struct kunit_suite vcap_api_rule_remove_test_suite = {
2256dccc30ccSSteen Hegelund .name = "VCAP_API_Rule_Remove_Testsuite",
2257dccc30ccSSteen Hegelund .test_cases = vcap_api_rule_remove_test_cases,
2258dccc30ccSSteen Hegelund };
2259dccc30ccSSteen Hegelund
2260dccc30ccSSteen Hegelund static struct kunit_case vcap_api_rule_insert_test_cases[] = {
2261dccc30ccSSteen Hegelund KUNIT_CASE(vcap_api_rule_insert_in_order_test),
2262dccc30ccSSteen Hegelund KUNIT_CASE(vcap_api_rule_insert_reverse_order_test),
2263dccc30ccSSteen Hegelund {}
2264dccc30ccSSteen Hegelund };
2265dccc30ccSSteen Hegelund
2266dccc30ccSSteen Hegelund static struct kunit_suite vcap_api_rule_insert_test_suite = {
2267dccc30ccSSteen Hegelund .name = "VCAP_API_Rule_Insert_Testsuite",
2268dccc30ccSSteen Hegelund .test_cases = vcap_api_rule_insert_test_cases,
2269dccc30ccSSteen Hegelund };
2270dccc30ccSSteen Hegelund
2271dccc30ccSSteen Hegelund static struct kunit_case vcap_api_rule_counter_test_cases[] = {
2272dccc30ccSSteen Hegelund KUNIT_CASE(vcap_api_set_rule_counter_test),
2273dccc30ccSSteen Hegelund KUNIT_CASE(vcap_api_get_rule_counter_test),
2274dccc30ccSSteen Hegelund {}
2275dccc30ccSSteen Hegelund };
2276dccc30ccSSteen Hegelund
2277dccc30ccSSteen Hegelund static struct kunit_suite vcap_api_rule_counter_test_suite = {
2278dccc30ccSSteen Hegelund .name = "VCAP_API_Rule_Counter_Testsuite",
2279dccc30ccSSteen Hegelund .test_cases = vcap_api_rule_counter_test_cases,
2280dccc30ccSSteen Hegelund };
2281dccc30ccSSteen Hegelund
2282c956b9b3SSteen Hegelund static struct kunit_case vcap_api_support_test_cases[] = {
2283c956b9b3SSteen Hegelund KUNIT_CASE(vcap_api_next_lookup_basic_test),
2284c956b9b3SSteen Hegelund KUNIT_CASE(vcap_api_next_lookup_advanced_test),
228522f3c325SSteen Hegelund KUNIT_CASE(vcap_api_filter_unsupported_keys_test),
228622f3c325SSteen Hegelund KUNIT_CASE(vcap_api_filter_keylist_test),
2287c956b9b3SSteen Hegelund {}
2288c956b9b3SSteen Hegelund };
2289c956b9b3SSteen Hegelund
2290c956b9b3SSteen Hegelund static struct kunit_suite vcap_api_support_test_suite = {
2291c956b9b3SSteen Hegelund .name = "VCAP_API_Support_Testsuite",
2292c956b9b3SSteen Hegelund .test_cases = vcap_api_support_test_cases,
2293c956b9b3SSteen Hegelund };
2294c956b9b3SSteen Hegelund
2295c956b9b3SSteen Hegelund static struct kunit_case vcap_api_full_rule_test_cases[] = {
2296c956b9b3SSteen Hegelund KUNIT_CASE(vcap_api_rule_find_keyset_basic_test),
2297c956b9b3SSteen Hegelund KUNIT_CASE(vcap_api_rule_find_keyset_failed_test),
2298c956b9b3SSteen Hegelund KUNIT_CASE(vcap_api_rule_find_keyset_many_test),
2299c956b9b3SSteen Hegelund KUNIT_CASE(vcap_api_encode_rule_test),
2300c956b9b3SSteen Hegelund {}
2301c956b9b3SSteen Hegelund };
2302c956b9b3SSteen Hegelund
2303c956b9b3SSteen Hegelund static struct kunit_suite vcap_api_full_rule_test_suite = {
2304c956b9b3SSteen Hegelund .name = "VCAP_API_Full_Rule_Testsuite",
2305c956b9b3SSteen Hegelund .test_cases = vcap_api_full_rule_test_cases,
2306c956b9b3SSteen Hegelund };
2307c956b9b3SSteen Hegelund
2308c956b9b3SSteen Hegelund static struct kunit_case vcap_api_rule_value_test_cases[] = {
2309c956b9b3SSteen Hegelund KUNIT_CASE(vcap_api_rule_add_keyvalue_test),
2310c956b9b3SSteen Hegelund KUNIT_CASE(vcap_api_rule_add_actionvalue_test),
2311c956b9b3SSteen Hegelund {}
2312c956b9b3SSteen Hegelund };
2313c956b9b3SSteen Hegelund
2314c956b9b3SSteen Hegelund static struct kunit_suite vcap_api_rule_value_test_suite = {
2315c956b9b3SSteen Hegelund .name = "VCAP_API_Rule_Value_Testsuite",
2316c956b9b3SSteen Hegelund .test_cases = vcap_api_rule_value_test_cases,
2317c956b9b3SSteen Hegelund };
2318c956b9b3SSteen Hegelund
231967d63751SSteen Hegelund static struct kunit_case vcap_api_encoding_test_cases[] = {
232067d63751SSteen Hegelund KUNIT_CASE(vcap_api_set_bit_1_test),
232167d63751SSteen Hegelund KUNIT_CASE(vcap_api_set_bit_0_test),
232267d63751SSteen Hegelund KUNIT_CASE(vcap_api_iterator_init_test),
232367d63751SSteen Hegelund KUNIT_CASE(vcap_api_iterator_next_test),
232467d63751SSteen Hegelund KUNIT_CASE(vcap_api_encode_typegroups_test),
232567d63751SSteen Hegelund KUNIT_CASE(vcap_api_encode_bit_test),
232667d63751SSteen Hegelund KUNIT_CASE(vcap_api_encode_field_test),
232767d63751SSteen Hegelund KUNIT_CASE(vcap_api_encode_short_field_test),
232867d63751SSteen Hegelund KUNIT_CASE(vcap_api_encode_keyfield_test),
232967d63751SSteen Hegelund KUNIT_CASE(vcap_api_encode_max_keyfield_test),
233067d63751SSteen Hegelund KUNIT_CASE(vcap_api_encode_actionfield_test),
233167d63751SSteen Hegelund KUNIT_CASE(vcap_api_keyfield_typegroup_test),
233267d63751SSteen Hegelund KUNIT_CASE(vcap_api_actionfield_typegroup_test),
233367d63751SSteen Hegelund KUNIT_CASE(vcap_api_vcap_keyfields_test),
233467d63751SSteen Hegelund KUNIT_CASE(vcap_api_vcap_actionfields_test),
233567d63751SSteen Hegelund KUNIT_CASE(vcap_api_encode_rule_keyset_test),
233667d63751SSteen Hegelund KUNIT_CASE(vcap_api_encode_rule_actionset_test),
233767d63751SSteen Hegelund {}
233867d63751SSteen Hegelund };
233967d63751SSteen Hegelund
234067d63751SSteen Hegelund static struct kunit_suite vcap_api_encoding_test_suite = {
234167d63751SSteen Hegelund .name = "VCAP_API_Encoding_Testsuite",
234267d63751SSteen Hegelund .test_cases = vcap_api_encoding_test_cases,
234367d63751SSteen Hegelund };
234467d63751SSteen Hegelund
23451f741f00SSteen Hegelund kunit_test_suite(vcap_api_rule_enable_test_suite);
2346dccc30ccSSteen Hegelund kunit_test_suite(vcap_api_rule_remove_test_suite);
2347dccc30ccSSteen Hegelund kunit_test_suite(vcap_api_rule_insert_test_suite);
2348dccc30ccSSteen Hegelund kunit_test_suite(vcap_api_rule_counter_test_suite);
2349c956b9b3SSteen Hegelund kunit_test_suite(vcap_api_support_test_suite);
2350c956b9b3SSteen Hegelund kunit_test_suite(vcap_api_full_rule_test_suite);
2351c956b9b3SSteen Hegelund kunit_test_suite(vcap_api_rule_value_test_suite);
235267d63751SSteen Hegelund kunit_test_suite(vcap_api_encoding_test_suite);
2353