Linux Audio

Check our new training course

Yocto / OpenEmbedded training

Mar 24-27, 2025, special US time zones
Register
Loading...
v6.13.7
   1// SPDX-License-Identifier: BSD-3-Clause
   2/* Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries.
   3 * Microchip VCAP API kunit test suite
   4 */
   5
   6#include <kunit/test.h>
   7#include "vcap_api.h"
   8#include "vcap_api_client.h"
   9#include "vcap_model_kunit.h"
  10
  11/* First we have the test infrastructure that emulates the platform
  12 * implementation
  13 */
  14#define TEST_BUF_CNT 100
  15#define TEST_BUF_SZ  350
  16#define STREAMWSIZE 64
  17
  18static u32 test_updateaddr[STREAMWSIZE] = {};
  19static int test_updateaddridx;
  20static int test_cache_erase_count;
  21static u32 test_init_start;
  22static u32 test_init_count;
  23static u32 test_hw_counter_id;
  24static struct vcap_cache_data test_hw_cache;
  25static struct net_device test_netdev = {};
  26static int test_move_addr;
  27static int test_move_offset;
  28static int test_move_count;
  29
  30/* Callback used by the VCAP API */
  31static enum vcap_keyfield_set test_val_keyset(struct net_device *ndev,
  32					      struct vcap_admin *admin,
  33					      struct vcap_rule *rule,
  34					      struct vcap_keyset_list *kslist,
  35					      u16 l3_proto)
  36{
  37	int idx;
  38
  39	if (kslist->cnt > 0) {
  40		switch (admin->vtype) {
  41		case VCAP_TYPE_IS0:
  42			for (idx = 0; idx < kslist->cnt; idx++) {
  43				if (kslist->keysets[idx] == VCAP_KFS_ETAG)
  44					return kslist->keysets[idx];
  45				if (kslist->keysets[idx] == VCAP_KFS_PURE_5TUPLE_IP4)
  46					return kslist->keysets[idx];
  47				if (kslist->keysets[idx] == VCAP_KFS_NORMAL_5TUPLE_IP4)
  48					return kslist->keysets[idx];
  49				if (kslist->keysets[idx] == VCAP_KFS_NORMAL_7TUPLE)
  50					return kslist->keysets[idx];
  51			}
  52			break;
  53		case VCAP_TYPE_IS2:
  54			for (idx = 0; idx < kslist->cnt; idx++) {
  55				if (kslist->keysets[idx] == VCAP_KFS_MAC_ETYPE)
  56					return kslist->keysets[idx];
  57				if (kslist->keysets[idx] == VCAP_KFS_ARP)
  58					return kslist->keysets[idx];
  59				if (kslist->keysets[idx] == VCAP_KFS_IP_7TUPLE)
  60					return kslist->keysets[idx];
  61			}
  62			break;
  63		default:
  64			pr_info("%s:%d: no validation for VCAP %d\n",
  65				__func__, __LINE__, admin->vtype);
  66			break;
  67		}
  68	}
  69	return -EINVAL;
  70}
  71
  72/* Callback used by the VCAP API */
  73static void test_add_def_fields(struct net_device *ndev,
  74				struct vcap_admin *admin,
  75				struct vcap_rule *rule)
  76{
  77	if (admin->vinst == 0 || admin->vinst == 2)
  78		vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS, VCAP_BIT_1);
  79	else
  80		vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS, VCAP_BIT_0);
  81}
  82
  83/* Callback used by the VCAP API */
  84static void test_cache_erase(struct vcap_admin *admin)
  85{
  86	if (test_cache_erase_count) {
  87		memset(admin->cache.keystream, 0, test_cache_erase_count);
  88		memset(admin->cache.maskstream, 0, test_cache_erase_count);
  89		memset(admin->cache.actionstream, 0, test_cache_erase_count);
  90		test_cache_erase_count = 0;
  91	}
  92}
  93
  94/* Callback used by the VCAP API */
  95static void test_cache_init(struct net_device *ndev, struct vcap_admin *admin,
  96			    u32 start, u32 count)
  97{
  98	test_init_start = start;
  99	test_init_count = count;
 100}
 101
 102/* Callback used by the VCAP API */
 103static void test_cache_read(struct net_device *ndev, struct vcap_admin *admin,
 104			    enum vcap_selection sel, u32 start, u32 count)
 105{
 106	u32 *keystr, *mskstr, *actstr;
 107	int idx;
 108
 109	pr_debug("%s:%d: %d %d\n", __func__, __LINE__, start, count);
 110	switch (sel) {
 111	case VCAP_SEL_ENTRY:
 112		keystr = &admin->cache.keystream[start];
 113		mskstr = &admin->cache.maskstream[start];
 114		for (idx = 0; idx < count; ++idx) {
 115			pr_debug("%s:%d: keydata[%02d]: 0x%08x\n", __func__,
 116				 __LINE__, start + idx, keystr[idx]);
 117		}
 118		for (idx = 0; idx < count; ++idx) {
 119			/* Invert the mask before decoding starts */
 120			mskstr[idx] = ~mskstr[idx];
 121			pr_debug("%s:%d: mskdata[%02d]: 0x%08x\n", __func__,
 122				 __LINE__, start + idx, mskstr[idx]);
 123		}
 124		break;
 125	case VCAP_SEL_ACTION:
 126		actstr = &admin->cache.actionstream[start];
 127		for (idx = 0; idx < count; ++idx) {
 128			pr_debug("%s:%d: actdata[%02d]: 0x%08x\n", __func__,
 129				 __LINE__, start + idx, actstr[idx]);
 130		}
 131		break;
 132	case VCAP_SEL_COUNTER:
 133		pr_debug("%s:%d\n", __func__, __LINE__);
 134		test_hw_counter_id = start;
 135		admin->cache.counter = test_hw_cache.counter;
 136		admin->cache.sticky = test_hw_cache.sticky;
 137		break;
 138	case VCAP_SEL_ALL:
 139		pr_debug("%s:%d\n", __func__, __LINE__);
 140		break;
 141	}
 142}
 143
 144/* Callback used by the VCAP API */
 145static void test_cache_write(struct net_device *ndev, struct vcap_admin *admin,
 146			     enum vcap_selection sel, u32 start, u32 count)
 147{
 148	u32 *keystr, *mskstr, *actstr;
 149	int idx;
 150
 151	switch (sel) {
 152	case VCAP_SEL_ENTRY:
 153		keystr = &admin->cache.keystream[start];
 154		mskstr = &admin->cache.maskstream[start];
 155		for (idx = 0; idx < count; ++idx) {
 156			pr_debug("%s:%d: keydata[%02d]: 0x%08x\n", __func__,
 157				 __LINE__, start + idx, keystr[idx]);
 158		}
 159		for (idx = 0; idx < count; ++idx) {
 160			/* Invert the mask before encoding starts */
 161			mskstr[idx] = ~mskstr[idx];
 162			pr_debug("%s:%d: mskdata[%02d]: 0x%08x\n", __func__,
 163				 __LINE__, start + idx, mskstr[idx]);
 164		}
 165		break;
 166	case VCAP_SEL_ACTION:
 167		actstr = &admin->cache.actionstream[start];
 168		for (idx = 0; idx < count; ++idx) {
 169			pr_debug("%s:%d: actdata[%02d]: 0x%08x\n", __func__,
 170				 __LINE__, start + idx, actstr[idx]);
 171		}
 172		break;
 173	case VCAP_SEL_COUNTER:
 174		pr_debug("%s:%d\n", __func__, __LINE__);
 175		test_hw_counter_id = start;
 176		test_hw_cache.counter = admin->cache.counter;
 177		test_hw_cache.sticky = admin->cache.sticky;
 178		break;
 179	case VCAP_SEL_ALL:
 180		pr_err("%s:%d: cannot write all streams at once\n",
 181		       __func__, __LINE__);
 182		break;
 183	}
 184}
 185
 186/* Callback used by the VCAP API */
 187static void test_cache_update(struct net_device *ndev, struct vcap_admin *admin,
 188			      enum vcap_command cmd,
 189			      enum vcap_selection sel, u32 addr)
 190{
 191	if (test_updateaddridx < ARRAY_SIZE(test_updateaddr))
 192		test_updateaddr[test_updateaddridx] = addr;
 193	else
 194		pr_err("%s:%d: overflow: %d\n", __func__, __LINE__, test_updateaddridx);
 195	test_updateaddridx++;
 196}
 197
 198static void test_cache_move(struct net_device *ndev, struct vcap_admin *admin,
 199			    u32 addr, int offset, int count)
 200{
 201	test_move_addr = addr;
 202	test_move_offset = offset;
 203	test_move_count = count;
 204}
 205
 206/* Provide port information via a callback interface */
 207static int vcap_test_port_info(struct net_device *ndev,
 208			       struct vcap_admin *admin,
 209			       struct vcap_output_print *out)
 210{
 211	return 0;
 212}
 213
 214static const struct vcap_operations test_callbacks = {
 
 
 
 
 
 
 
 215	.validate_keyset = test_val_keyset,
 216	.add_default_fields = test_add_def_fields,
 217	.cache_erase = test_cache_erase,
 218	.cache_write = test_cache_write,
 219	.cache_read = test_cache_read,
 220	.init = test_cache_init,
 221	.update = test_cache_update,
 222	.move = test_cache_move,
 223	.port_info = vcap_test_port_info,
 
 224};
 225
 226static struct vcap_control test_vctrl = {
 227	.vcaps = kunit_test_vcaps,
 228	.stats = &kunit_test_vcap_stats,
 229	.ops = &test_callbacks,
 230};
 231
 232static void vcap_test_api_init(struct vcap_admin *admin)
 233{
 234	/* Initialize the shared objects */
 235	INIT_LIST_HEAD(&test_vctrl.list);
 236	INIT_LIST_HEAD(&admin->list);
 237	INIT_LIST_HEAD(&admin->rules);
 238	INIT_LIST_HEAD(&admin->enabled);
 239	mutex_init(&admin->lock);
 240	list_add_tail(&admin->list, &test_vctrl.list);
 241	memset(test_updateaddr, 0, sizeof(test_updateaddr));
 242	test_updateaddridx = 0;
 243}
 244
 245/* Helper function to create a rule of a specific size */
 246static void test_vcap_xn_rule_creator(struct kunit *test, int cid,
 247				      enum vcap_user user, u16 priority,
 248				      int id, int size, int expected_addr)
 
 249{
 250	struct vcap_rule *rule;
 251	struct vcap_rule_internal *ri;
 252	enum vcap_keyfield_set keyset = VCAP_KFS_NO_VALUE;
 253	enum vcap_actionfield_set actionset = VCAP_AFS_NO_VALUE;
 254	int ret;
 255
 256	/* init before testing */
 257	memset(test_updateaddr, 0, sizeof(test_updateaddr));
 258	test_updateaddridx = 0;
 259	test_move_addr = 0;
 260	test_move_offset = 0;
 261	test_move_count = 0;
 262
 263	switch (size) {
 264	case 2:
 265		keyset = VCAP_KFS_ETAG;
 266		actionset = VCAP_AFS_CLASS_REDUCED;
 267		break;
 268	case 3:
 269		keyset = VCAP_KFS_PURE_5TUPLE_IP4;
 270		actionset = VCAP_AFS_CLASSIFICATION;
 271		break;
 272	case 6:
 273		keyset = VCAP_KFS_NORMAL_5TUPLE_IP4;
 274		actionset = VCAP_AFS_CLASSIFICATION;
 275		break;
 276	case 12:
 277		keyset = VCAP_KFS_NORMAL_7TUPLE;
 278		actionset = VCAP_AFS_FULL;
 279		break;
 280	default:
 281		break;
 282	}
 283
 284	/* Check that a valid size was used */
 285	KUNIT_ASSERT_NE(test, VCAP_KFS_NO_VALUE, keyset);
 286
 287	/* Allocate the rule */
 288	rule = vcap_alloc_rule(&test_vctrl, &test_netdev, cid, user, priority,
 289			       id);
 290	KUNIT_EXPECT_PTR_NE(test, NULL, rule);
 291
 292	ri = (struct vcap_rule_internal *)rule;
 293
 294	/* Override rule keyset */
 295	ret = vcap_set_rule_set_keyset(rule, keyset);
 296
 297	/* Add rule actions : there must be at least one action */
 298	ret = vcap_rule_add_action_u32(rule, VCAP_AF_ISDX_VAL, 0);
 299
 300	/* Override rule actionset */
 301	ret = vcap_set_rule_set_actionset(rule, actionset);
 302
 303	ret = vcap_val_rule(rule, ETH_P_ALL);
 304	KUNIT_EXPECT_EQ(test, 0, ret);
 305	KUNIT_EXPECT_EQ(test, keyset, rule->keyset);
 306	KUNIT_EXPECT_EQ(test, actionset, rule->actionset);
 307	KUNIT_EXPECT_EQ(test, size, ri->size);
 308
 309	/* Add rule with write callback */
 310	ret = vcap_add_rule(rule);
 311	KUNIT_EXPECT_EQ(test, 0, ret);
 312	KUNIT_EXPECT_EQ(test, expected_addr, ri->addr);
 313	vcap_free_rule(rule);
 314}
 315
 316/* Prepare testing rule deletion */
 317static void test_init_rule_deletion(void)
 318{
 319	test_move_addr = 0;
 320	test_move_offset = 0;
 321	test_move_count = 0;
 322	test_init_start = 0;
 323	test_init_count = 0;
 324}
 325
 326/* Define the test cases. */
 327
 328static void vcap_api_set_bit_1_test(struct kunit *test)
 329{
 330	struct vcap_stream_iter iter = {
 331		.offset = 35,
 332		.sw_width = 52,
 333		.reg_idx = 1,
 334		.reg_bitpos = 20,
 335		.tg = NULL,
 336	};
 337	u32 stream[2] = {0};
 338
 339	vcap_set_bit(stream, &iter, 1);
 340
 341	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[0]);
 342	KUNIT_EXPECT_EQ(test, (u32)BIT(20), stream[1]);
 343}
 344
 345static void vcap_api_set_bit_0_test(struct kunit *test)
 346{
 347	struct vcap_stream_iter iter = {
 348		.offset = 35,
 349		.sw_width = 52,
 350		.reg_idx = 2,
 351		.reg_bitpos = 11,
 352		.tg = NULL,
 353	};
 354	u32 stream[3] = {~0, ~0, ~0};
 355
 356	vcap_set_bit(stream, &iter, 0);
 357
 358	KUNIT_EXPECT_EQ(test, (u32)~0, stream[0]);
 359	KUNIT_EXPECT_EQ(test, (u32)~0, stream[1]);
 360	KUNIT_EXPECT_EQ(test, (u32)~BIT(11), stream[2]);
 361}
 362
 363static void vcap_api_iterator_init_test(struct kunit *test)
 364{
 365	struct vcap_stream_iter iter;
 366	struct vcap_typegroup typegroups[] = {
 367		{ .offset = 0, .width = 2, .value = 2, },
 368		{ .offset = 156, .width = 1, .value = 0, },
 369		{ }
 370	};
 371	struct vcap_typegroup typegroups2[] = {
 372		{ .offset = 0, .width = 3, .value = 4, },
 373		{ .offset = 49, .width = 2, .value = 0, },
 374		{ .offset = 98, .width = 2, .value = 0, },
 375		{ }
 376	};
 377
 378	vcap_iter_init(&iter, 52, typegroups, 86);
 379
 380	KUNIT_EXPECT_EQ(test, 52, iter.sw_width);
 381	KUNIT_EXPECT_EQ(test, 86 + 2, iter.offset);
 382	KUNIT_EXPECT_EQ(test, 3, iter.reg_idx);
 383	KUNIT_EXPECT_EQ(test, 4, iter.reg_bitpos);
 384
 385	vcap_iter_init(&iter, 49, typegroups2, 134);
 386
 387	KUNIT_EXPECT_EQ(test, 49, iter.sw_width);
 388	KUNIT_EXPECT_EQ(test, 134 + 7, iter.offset);
 389	KUNIT_EXPECT_EQ(test, 5, iter.reg_idx);
 390	KUNIT_EXPECT_EQ(test, 11, iter.reg_bitpos);
 391}
 392
 393static void vcap_api_iterator_next_test(struct kunit *test)
 394{
 395	struct vcap_stream_iter iter;
 396	struct vcap_typegroup typegroups[] = {
 397		{ .offset = 0, .width = 4, .value = 8, },
 398		{ .offset = 49, .width = 1, .value = 0, },
 399		{ .offset = 98, .width = 2, .value = 0, },
 400		{ .offset = 147, .width = 3, .value = 0, },
 401		{ .offset = 196, .width = 2, .value = 0, },
 402		{ .offset = 245, .width = 1, .value = 0, },
 403		{ }
 404	};
 405	int idx;
 406
 407	vcap_iter_init(&iter, 49, typegroups, 86);
 408
 409	KUNIT_EXPECT_EQ(test, 49, iter.sw_width);
 410	KUNIT_EXPECT_EQ(test, 86 + 5, iter.offset);
 411	KUNIT_EXPECT_EQ(test, 3, iter.reg_idx);
 412	KUNIT_EXPECT_EQ(test, 10, iter.reg_bitpos);
 413
 414	vcap_iter_next(&iter);
 415
 416	KUNIT_EXPECT_EQ(test, 91 + 1, iter.offset);
 417	KUNIT_EXPECT_EQ(test, 3, iter.reg_idx);
 418	KUNIT_EXPECT_EQ(test, 11, iter.reg_bitpos);
 419
 420	for (idx = 0; idx < 6; idx++)
 421		vcap_iter_next(&iter);
 422
 423	KUNIT_EXPECT_EQ(test, 92 + 6 + 2, iter.offset);
 424	KUNIT_EXPECT_EQ(test, 4, iter.reg_idx);
 425	KUNIT_EXPECT_EQ(test, 2, iter.reg_bitpos);
 426}
 427
 428static void vcap_api_encode_typegroups_test(struct kunit *test)
 429{
 430	u32 stream[12] = {0};
 431	struct vcap_typegroup typegroups[] = {
 432		{ .offset = 0, .width = 4, .value = 8, },
 433		{ .offset = 49, .width = 1, .value = 1, },
 434		{ .offset = 98, .width = 2, .value = 3, },
 435		{ .offset = 147, .width = 3, .value = 5, },
 436		{ .offset = 196, .width = 2, .value = 2, },
 437		{ .offset = 245, .width = 5, .value = 27, },
 438		{ }
 439	};
 440
 441	vcap_encode_typegroups(stream, 49, typegroups, false);
 442
 443	KUNIT_EXPECT_EQ(test, (u32)0x8, stream[0]);
 444	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[1]);
 445	KUNIT_EXPECT_EQ(test, (u32)0x1, stream[2]);
 446	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[3]);
 447	KUNIT_EXPECT_EQ(test, (u32)0x3, stream[4]);
 448	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[5]);
 449	KUNIT_EXPECT_EQ(test, (u32)0x5, stream[6]);
 450	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[7]);
 451	KUNIT_EXPECT_EQ(test, (u32)0x2, stream[8]);
 452	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[9]);
 453	KUNIT_EXPECT_EQ(test, (u32)27, stream[10]);
 454	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[11]);
 455}
 456
 457static void vcap_api_encode_bit_test(struct kunit *test)
 458{
 459	struct vcap_stream_iter iter;
 460	u32 stream[4] = {0};
 461	struct vcap_typegroup typegroups[] = {
 462		{ .offset = 0, .width = 4, .value = 8, },
 463		{ .offset = 49, .width = 1, .value = 1, },
 464		{ .offset = 98, .width = 2, .value = 3, },
 465		{ .offset = 147, .width = 3, .value = 5, },
 466		{ .offset = 196, .width = 2, .value = 2, },
 467		{ .offset = 245, .width = 1, .value = 0, },
 468		{ }
 469	};
 470
 471	vcap_iter_init(&iter, 49, typegroups, 44);
 472
 473	KUNIT_EXPECT_EQ(test, 48, iter.offset);
 474	KUNIT_EXPECT_EQ(test, 1, iter.reg_idx);
 475	KUNIT_EXPECT_EQ(test, 16, iter.reg_bitpos);
 476
 477	vcap_encode_bit(stream, &iter, 1);
 478
 479	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[0]);
 480	KUNIT_EXPECT_EQ(test, (u32)BIT(16), stream[1]);
 481	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[2]);
 482}
 483
 484static void vcap_api_encode_field_test(struct kunit *test)
 485{
 486	struct vcap_stream_iter iter;
 487	u32 stream[16] = {0};
 488	struct vcap_typegroup typegroups[] = {
 489		{ .offset = 0, .width = 4, .value = 8, },
 490		{ .offset = 49, .width = 1, .value = 1, },
 491		{ .offset = 98, .width = 2, .value = 3, },
 492		{ .offset = 147, .width = 3, .value = 5, },
 493		{ .offset = 196, .width = 2, .value = 2, },
 494		{ .offset = 245, .width = 5, .value = 27, },
 495		{ }
 496	};
 497	struct vcap_field rf = {
 498		.type = VCAP_FIELD_U32,
 499		.offset = 86,
 500		.width = 4,
 501	};
 502	u8 value[] = {0x5};
 503
 504	vcap_iter_init(&iter, 49, typegroups, rf.offset);
 505
 506	KUNIT_EXPECT_EQ(test, 91, iter.offset);
 507	KUNIT_EXPECT_EQ(test, 3, iter.reg_idx);
 508	KUNIT_EXPECT_EQ(test, 10, iter.reg_bitpos);
 509
 510	vcap_encode_field(stream, &iter, rf.width, value);
 511
 512	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[0]);
 513	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[1]);
 514	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[2]);
 515	KUNIT_EXPECT_EQ(test, (u32)(0x5 << 10), stream[3]);
 516	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[4]);
 517
 518	vcap_encode_typegroups(stream, 49, typegroups, false);
 519
 520	KUNIT_EXPECT_EQ(test, (u32)0x8, stream[0]);
 521	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[1]);
 522	KUNIT_EXPECT_EQ(test, (u32)0x1, stream[2]);
 523	KUNIT_EXPECT_EQ(test, (u32)(0x5 << 10), stream[3]);
 524	KUNIT_EXPECT_EQ(test, (u32)0x3, stream[4]);
 525	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[5]);
 526	KUNIT_EXPECT_EQ(test, (u32)0x5, stream[6]);
 527	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[7]);
 528	KUNIT_EXPECT_EQ(test, (u32)0x2, stream[8]);
 529	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[9]);
 530	KUNIT_EXPECT_EQ(test, (u32)27, stream[10]);
 531	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[11]);
 532}
 533
 534/* In this testcase the subword is smaller than a register */
 535static void vcap_api_encode_short_field_test(struct kunit *test)
 536{
 537	struct vcap_stream_iter iter;
 538	int sw_width = 21;
 539	u32 stream[6] = {0};
 540	struct vcap_typegroup tgt[] = {
 541		{ .offset = 0, .width = 3, .value = 7, },
 542		{ .offset = 21, .width = 2, .value = 3, },
 543		{ .offset = 42, .width = 1, .value = 1, },
 544		{ }
 545	};
 546	struct vcap_field rf = {
 547		.type = VCAP_FIELD_U32,
 548		.offset = 25,
 549		.width = 4,
 550	};
 551	u8 value[] = {0x5};
 552
 553	vcap_iter_init(&iter, sw_width, tgt, rf.offset);
 554
 555	KUNIT_EXPECT_EQ(test, 1, iter.regs_per_sw);
 556	KUNIT_EXPECT_EQ(test, 21, iter.sw_width);
 557	KUNIT_EXPECT_EQ(test, 25 + 3 + 2, iter.offset);
 558	KUNIT_EXPECT_EQ(test, 1, iter.reg_idx);
 559	KUNIT_EXPECT_EQ(test, 25 + 3 + 2 - sw_width, iter.reg_bitpos);
 560
 561	vcap_encode_field(stream, &iter, rf.width, value);
 562
 563	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[0]);
 564	KUNIT_EXPECT_EQ(test, (u32)(0x5 << (25 + 3 + 2 - sw_width)), stream[1]);
 565	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[2]);
 566	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[3]);
 567	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[4]);
 568	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[5]);
 569
 570	vcap_encode_typegroups(stream, sw_width, tgt, false);
 571
 572	KUNIT_EXPECT_EQ(test, (u32)7, stream[0]);
 573	KUNIT_EXPECT_EQ(test, (u32)((0x5 << (25 + 3 + 2 - sw_width)) + 3), stream[1]);
 574	KUNIT_EXPECT_EQ(test, (u32)1, stream[2]);
 575	KUNIT_EXPECT_EQ(test, (u32)0, stream[3]);
 576	KUNIT_EXPECT_EQ(test, (u32)0, stream[4]);
 577	KUNIT_EXPECT_EQ(test, (u32)0, stream[5]);
 578}
 579
 580static void vcap_api_encode_keyfield_test(struct kunit *test)
 581{
 582	u32 keywords[16] = {0};
 583	u32 maskwords[16] = {0};
 584	struct vcap_admin admin = {
 585		.vtype = VCAP_TYPE_IS2,
 586		.cache = {
 587			.keystream = keywords,
 588			.maskstream = maskwords,
 589			.actionstream = keywords,
 590		},
 591	};
 592	struct vcap_rule_internal rule = {
 593		.admin = &admin,
 594		.data = {
 595			.keyset = VCAP_KFS_MAC_ETYPE,
 596		},
 597		.vctrl = &test_vctrl,
 598	};
 599	struct vcap_client_keyfield ckf = {
 600		.ctrl.list = {},
 601		.ctrl.key = VCAP_KF_ISDX_CLS,
 602		.ctrl.type = VCAP_FIELD_U32,
 603		.data.u32.value = 0xeef014a1,
 604		.data.u32.mask = 0xfff,
 605	};
 606	struct vcap_field rf = {
 607		.type = VCAP_FIELD_U32,
 608		.offset = 56,
 609		.width = 12,
 610	};
 611	struct vcap_typegroup tgt[] = {
 612		{ .offset = 0, .width = 2, .value = 2, },
 613		{ .offset = 156, .width = 1, .value = 1, },
 614		{ }
 615	};
 616
 617	vcap_test_api_init(&admin);
 618	vcap_encode_keyfield(&rule, &ckf, &rf, tgt);
 619
 620	/* Key */
 621	KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[0]);
 622	KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[1]);
 623	KUNIT_EXPECT_EQ(test, (u32)(0x04a1 << 6), keywords[2]);
 624	KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[3]);
 625	KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[4]);
 626	KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[5]);
 627	KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[6]);
 628
 629	/* Mask */
 630	KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[0]);
 631	KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[1]);
 632	KUNIT_EXPECT_EQ(test, (u32)(0x0fff << 6), maskwords[2]);
 633	KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[3]);
 634	KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[4]);
 635	KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[5]);
 636	KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[6]);
 637}
 638
 639static void vcap_api_encode_max_keyfield_test(struct kunit *test)
 640{
 641	int idx;
 642	u32 keywords[6] = {0};
 643	u32 maskwords[6] = {0};
 644	struct vcap_admin admin = {
 645		.vtype = VCAP_TYPE_IS2,
 646		/* IS2 sw_width = 52 bit */
 647		.cache = {
 648			.keystream = keywords,
 649			.maskstream = maskwords,
 650			.actionstream = keywords,
 651		},
 652	};
 653	struct vcap_rule_internal rule = {
 654		.admin = &admin,
 655		.data = {
 656			.keyset = VCAP_KFS_IP_7TUPLE,
 657		},
 658		.vctrl = &test_vctrl,
 659	};
 660	struct vcap_client_keyfield ckf = {
 661		.ctrl.list = {},
 662		.ctrl.key = VCAP_KF_L3_IP6_DIP,
 663		.ctrl.type = VCAP_FIELD_U128,
 664		.data.u128.value = { 0xa1, 0xa2, 0xa3, 0xa4, 0, 0, 0x43, 0,
 665			0, 0, 0, 0, 0, 0, 0x78, 0x8e, },
 666		.data.u128.mask =  { 0xff, 0xff, 0xff, 0xff, 0, 0, 0xff, 0,
 667			0, 0, 0, 0, 0, 0, 0xff, 0xff },
 668	};
 669	struct vcap_field rf = {
 670		.type = VCAP_FIELD_U128,
 671		.offset = 0,
 672		.width = 128,
 673	};
 674	struct vcap_typegroup tgt[] = {
 675		{ .offset = 0, .width = 2, .value = 2, },
 676		{ .offset = 156, .width = 1, .value = 1, },
 677		{ }
 678	};
 679	u32 keyres[] = {
 680		0x928e8a84,
 681		0x000c0002,
 682		0x00000010,
 683		0x00000000,
 684		0x0239e000,
 685		0x00000000,
 686	};
 687	u32 mskres[] = {
 688		0xfffffffc,
 689		0x000c0003,
 690		0x0000003f,
 691		0x00000000,
 692		0x03fffc00,
 693		0x00000000,
 694	};
 695
 696	vcap_encode_keyfield(&rule, &ckf, &rf, tgt);
 697
 698	/* Key */
 699	for (idx = 0; idx < ARRAY_SIZE(keyres); ++idx)
 700		KUNIT_EXPECT_EQ(test, keyres[idx], keywords[idx]);
 701	/* Mask */
 702	for (idx = 0; idx < ARRAY_SIZE(mskres); ++idx)
 703		KUNIT_EXPECT_EQ(test, mskres[idx], maskwords[idx]);
 704}
 705
 706static void vcap_api_encode_actionfield_test(struct kunit *test)
 707{
 708	u32 actwords[16] = {0};
 709	int sw_width = 21;
 710	struct vcap_admin admin = {
 711		.vtype = VCAP_TYPE_ES2, /* act_width = 21 */
 712		.cache = {
 713			.actionstream = actwords,
 714		},
 715	};
 716	struct vcap_rule_internal rule = {
 717		.admin = &admin,
 718		.data = {
 719			.actionset = VCAP_AFS_BASE_TYPE,
 720		},
 721		.vctrl = &test_vctrl,
 722	};
 723	struct vcap_client_actionfield caf = {
 724		.ctrl.list = {},
 725		.ctrl.action = VCAP_AF_POLICE_IDX,
 726		.ctrl.type = VCAP_FIELD_U32,
 727		.data.u32.value = 0x67908032,
 728	};
 729	struct vcap_field rf = {
 730		.type = VCAP_FIELD_U32,
 731		.offset = 35,
 732		.width = 6,
 733	};
 734	struct vcap_typegroup tgt[] = {
 735		{ .offset = 0, .width = 2, .value = 2, },
 736		{ .offset = 21, .width = 1, .value = 1, },
 737		{ .offset = 42, .width = 1, .value = 0, },
 738		{ }
 739	};
 740
 741	vcap_encode_actionfield(&rule, &caf, &rf, tgt);
 742
 743	/* Action */
 744	KUNIT_EXPECT_EQ(test, (u32)0x0, actwords[0]);
 745	KUNIT_EXPECT_EQ(test, (u32)((0x32 << (35 + 2 + 1 - sw_width)) & 0x1fffff), actwords[1]);
 746	KUNIT_EXPECT_EQ(test, (u32)((0x32 >> ((2 * sw_width) - 38 - 1))), actwords[2]);
 747	KUNIT_EXPECT_EQ(test, (u32)0x0, actwords[3]);
 748	KUNIT_EXPECT_EQ(test, (u32)0x0, actwords[4]);
 749	KUNIT_EXPECT_EQ(test, (u32)0x0, actwords[5]);
 750	KUNIT_EXPECT_EQ(test, (u32)0x0, actwords[6]);
 751}
 752
 753static void vcap_api_keyfield_typegroup_test(struct kunit *test)
 754{
 755	const struct vcap_typegroup *tg;
 756
 757	tg = vcap_keyfield_typegroup(&test_vctrl, VCAP_TYPE_IS2, VCAP_KFS_MAC_ETYPE);
 758	KUNIT_EXPECT_PTR_NE(test, NULL, tg);
 759	KUNIT_EXPECT_EQ(test, 0, tg[0].offset);
 760	KUNIT_EXPECT_EQ(test, 2, tg[0].width);
 761	KUNIT_EXPECT_EQ(test, 2, tg[0].value);
 762	KUNIT_EXPECT_EQ(test, 156, tg[1].offset);
 763	KUNIT_EXPECT_EQ(test, 1, tg[1].width);
 764	KUNIT_EXPECT_EQ(test, 0, tg[1].value);
 765	KUNIT_EXPECT_EQ(test, 0, tg[2].offset);
 766	KUNIT_EXPECT_EQ(test, 0, tg[2].width);
 767	KUNIT_EXPECT_EQ(test, 0, tg[2].value);
 768
 769	tg = vcap_keyfield_typegroup(&test_vctrl, VCAP_TYPE_ES2, VCAP_KFS_LL_FULL);
 770	KUNIT_EXPECT_PTR_EQ(test, NULL, tg);
 771}
 772
 773static void vcap_api_actionfield_typegroup_test(struct kunit *test)
 774{
 775	const struct vcap_typegroup *tg;
 776
 777	tg = vcap_actionfield_typegroup(&test_vctrl, VCAP_TYPE_IS0, VCAP_AFS_FULL);
 778	KUNIT_EXPECT_PTR_NE(test, NULL, tg);
 779	KUNIT_EXPECT_EQ(test, 0, tg[0].offset);
 780	KUNIT_EXPECT_EQ(test, 3, tg[0].width);
 781	KUNIT_EXPECT_EQ(test, 4, tg[0].value);
 782	KUNIT_EXPECT_EQ(test, 110, tg[1].offset);
 783	KUNIT_EXPECT_EQ(test, 2, tg[1].width);
 784	KUNIT_EXPECT_EQ(test, 0, tg[1].value);
 785	KUNIT_EXPECT_EQ(test, 220, tg[2].offset);
 786	KUNIT_EXPECT_EQ(test, 2, tg[2].width);
 787	KUNIT_EXPECT_EQ(test, 0, tg[2].value);
 788	KUNIT_EXPECT_EQ(test, 0, tg[3].offset);
 789	KUNIT_EXPECT_EQ(test, 0, tg[3].width);
 790	KUNIT_EXPECT_EQ(test, 0, tg[3].value);
 791
 792	tg = vcap_actionfield_typegroup(&test_vctrl, VCAP_TYPE_IS2, VCAP_AFS_CLASSIFICATION);
 793	KUNIT_EXPECT_PTR_EQ(test, NULL, tg);
 794}
 795
 796static void vcap_api_vcap_keyfields_test(struct kunit *test)
 797{
 798	const struct vcap_field *ft;
 799
 800	ft = vcap_keyfields(&test_vctrl, VCAP_TYPE_IS2, VCAP_KFS_MAC_ETYPE);
 801	KUNIT_EXPECT_PTR_NE(test, NULL, ft);
 802
 803	/* Keyset that is not available and within the maximum keyset enum value */
 804	ft = vcap_keyfields(&test_vctrl, VCAP_TYPE_ES2, VCAP_KFS_PURE_5TUPLE_IP4);
 805	KUNIT_EXPECT_PTR_EQ(test, NULL, ft);
 806
 807	/* Keyset that is not available and beyond the maximum keyset enum value */
 808	ft = vcap_keyfields(&test_vctrl, VCAP_TYPE_ES2, VCAP_KFS_LL_FULL);
 809	KUNIT_EXPECT_PTR_EQ(test, NULL, ft);
 810}
 811
 812static void vcap_api_vcap_actionfields_test(struct kunit *test)
 813{
 814	const struct vcap_field *ft;
 815
 816	ft = vcap_actionfields(&test_vctrl, VCAP_TYPE_IS0, VCAP_AFS_FULL);
 817	KUNIT_EXPECT_PTR_NE(test, NULL, ft);
 818
 819	ft = vcap_actionfields(&test_vctrl, VCAP_TYPE_IS2, VCAP_AFS_FULL);
 820	KUNIT_EXPECT_PTR_EQ(test, NULL, ft);
 821
 822	ft = vcap_actionfields(&test_vctrl, VCAP_TYPE_IS2, VCAP_AFS_CLASSIFICATION);
 823	KUNIT_EXPECT_PTR_EQ(test, NULL, ft);
 824}
 825
 826static void vcap_api_encode_rule_keyset_test(struct kunit *test)
 827{
 828	u32 keywords[16] = {0};
 829	u32 maskwords[16] = {0};
 830	struct vcap_admin admin = {
 831		.vtype = VCAP_TYPE_IS2,
 832		.cache = {
 833			.keystream = keywords,
 834			.maskstream = maskwords,
 835		},
 836	};
 837	struct vcap_rule_internal rule = {
 838		.admin = &admin,
 839		.data = {
 840			.keyset = VCAP_KFS_MAC_ETYPE,
 841		},
 842		.vctrl = &test_vctrl,
 843	};
 844	struct vcap_client_keyfield ckf[] = {
 845		{
 846			.ctrl.key = VCAP_KF_TYPE,
 847			.ctrl.type = VCAP_FIELD_U32,
 848			.data.u32.value = 0x00,
 849			.data.u32.mask = 0x0f,
 850		},
 851		{
 852			.ctrl.key = VCAP_KF_LOOKUP_FIRST_IS,
 853			.ctrl.type = VCAP_FIELD_BIT,
 854			.data.u1.value = 0x01,
 855			.data.u1.mask = 0x01,
 856		},
 857		{
 858			.ctrl.key = VCAP_KF_IF_IGR_PORT_MASK_L3,
 859			.ctrl.type = VCAP_FIELD_BIT,
 860			.data.u1.value = 0x00,
 861			.data.u1.mask = 0x01,
 862		},
 863		{
 864			.ctrl.key = VCAP_KF_IF_IGR_PORT_MASK_RNG,
 865			.ctrl.type = VCAP_FIELD_U32,
 866			.data.u32.value = 0x00,
 867			.data.u32.mask = 0x0f,
 868		},
 869		{
 870			.ctrl.key = VCAP_KF_IF_IGR_PORT_MASK,
 871			.ctrl.type = VCAP_FIELD_U72,
 872			.data.u72.value = {0x0, 0x00, 0x00, 0x00},
 873			.data.u72.mask = {0xfd, 0xff, 0xff, 0xff},
 874		},
 875		{
 876			.ctrl.key = VCAP_KF_L2_DMAC,
 877			.ctrl.type = VCAP_FIELD_U48,
 878			/* Opposite endianness */
 879			.data.u48.value = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06},
 880			.data.u48.mask = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
 881		},
 882		{
 883			.ctrl.key = VCAP_KF_ETYPE_LEN_IS,
 884			.ctrl.type = VCAP_FIELD_BIT,
 885			.data.u1.value = 0x01,
 886			.data.u1.mask = 0x01,
 887		},
 888		{
 889			.ctrl.key = VCAP_KF_ETYPE,
 890			.ctrl.type = VCAP_FIELD_U32,
 891			.data.u32.value = 0xaabb,
 892			.data.u32.mask = 0xffff,
 893		},
 894	};
 895	int idx;
 896	int ret;
 897
 898	/* Empty entry list */
 899	INIT_LIST_HEAD(&rule.data.keyfields);
 900	ret = vcap_encode_rule_keyset(&rule);
 901	KUNIT_EXPECT_EQ(test, -EINVAL, ret);
 902
 903	for (idx = 0; idx < ARRAY_SIZE(ckf); idx++)
 904		list_add_tail(&ckf[idx].ctrl.list, &rule.data.keyfields);
 905	ret = vcap_encode_rule_keyset(&rule);
 906	KUNIT_EXPECT_EQ(test, 0, ret);
 907
 908	/* The key and mask values below are from an actual Sparx5 rule config */
 909	/* Key */
 910	KUNIT_EXPECT_EQ(test, (u32)0x00000042, keywords[0]);
 911	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[1]);
 912	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[2]);
 913	KUNIT_EXPECT_EQ(test, (u32)0x00020100, keywords[3]);
 914	KUNIT_EXPECT_EQ(test, (u32)0x60504030, keywords[4]);
 915	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[5]);
 916	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[6]);
 917	KUNIT_EXPECT_EQ(test, (u32)0x0002aaee, keywords[7]);
 918	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[8]);
 919	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[9]);
 920	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[10]);
 921	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[11]);
 922
 923	/* Mask: they will be inverted when applied to the register */
 924	KUNIT_EXPECT_EQ(test, (u32)~0x00b07f80, maskwords[0]);
 925	KUNIT_EXPECT_EQ(test, (u32)~0xfff00000, maskwords[1]);
 926	KUNIT_EXPECT_EQ(test, (u32)~0xfffffffc, maskwords[2]);
 927	KUNIT_EXPECT_EQ(test, (u32)~0xfff000ff, maskwords[3]);
 928	KUNIT_EXPECT_EQ(test, (u32)~0x00000000, maskwords[4]);
 929	KUNIT_EXPECT_EQ(test, (u32)~0xfffffff0, maskwords[5]);
 930	KUNIT_EXPECT_EQ(test, (u32)~0xfffffffe, maskwords[6]);
 931	KUNIT_EXPECT_EQ(test, (u32)~0xfffc0001, maskwords[7]);
 932	KUNIT_EXPECT_EQ(test, (u32)~0xffffffff, maskwords[8]);
 933	KUNIT_EXPECT_EQ(test, (u32)~0xffffffff, maskwords[9]);
 934	KUNIT_EXPECT_EQ(test, (u32)~0xffffffff, maskwords[10]);
 935	KUNIT_EXPECT_EQ(test, (u32)~0xffffffff, maskwords[11]);
 936}
 937
 938static void vcap_api_encode_rule_actionset_test(struct kunit *test)
 939{
 940	u32 actwords[16] = {0};
 941	struct vcap_admin admin = {
 942		.vtype = VCAP_TYPE_IS2,
 943		.cache = {
 944			.actionstream = actwords,
 945		},
 946	};
 947	struct vcap_rule_internal rule = {
 948		.admin = &admin,
 949		.data = {
 950			.actionset = VCAP_AFS_BASE_TYPE,
 951		},
 952		.vctrl = &test_vctrl,
 953	};
 954	struct vcap_client_actionfield caf[] = {
 955		{
 956			.ctrl.action = VCAP_AF_MATCH_ID,
 957			.ctrl.type = VCAP_FIELD_U32,
 958			.data.u32.value = 0x01,
 959		},
 960		{
 961			.ctrl.action = VCAP_AF_MATCH_ID_MASK,
 962			.ctrl.type = VCAP_FIELD_U32,
 963			.data.u32.value = 0x01,
 964		},
 965		{
 966			.ctrl.action = VCAP_AF_CNT_ID,
 967			.ctrl.type = VCAP_FIELD_U32,
 968			.data.u32.value = 0x64,
 969		},
 970	};
 971	int idx;
 972	int ret;
 973
 974	/* Empty entry list */
 975	INIT_LIST_HEAD(&rule.data.actionfields);
 976	ret = vcap_encode_rule_actionset(&rule);
 977	/* We allow rules with no actions */
 978	KUNIT_EXPECT_EQ(test, 0, ret);
 979
 980	for (idx = 0; idx < ARRAY_SIZE(caf); idx++)
 981		list_add_tail(&caf[idx].ctrl.list, &rule.data.actionfields);
 982	ret = vcap_encode_rule_actionset(&rule);
 983	KUNIT_EXPECT_EQ(test, 0, ret);
 984
 985	/* The action values below are from an actual Sparx5 rule config */
 986	KUNIT_EXPECT_EQ(test, (u32)0x00000002, actwords[0]);
 987	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[1]);
 988	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[2]);
 989	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[3]);
 990	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[4]);
 991	KUNIT_EXPECT_EQ(test, (u32)0x00100000, actwords[5]);
 992	KUNIT_EXPECT_EQ(test, (u32)0x06400010, actwords[6]);
 993	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[7]);
 994	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[8]);
 995	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[9]);
 996	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[10]);
 997	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[11]);
 998}
 999
1000static void vcap_free_ckf(struct vcap_rule *rule)
1001{
1002	struct vcap_client_keyfield *ckf, *next_ckf;
1003
1004	list_for_each_entry_safe(ckf, next_ckf, &rule->keyfields, ctrl.list) {
1005		list_del(&ckf->ctrl.list);
1006		kfree(ckf);
1007	}
1008}
1009
1010static void vcap_api_rule_add_keyvalue_test(struct kunit *test)
1011{
1012	struct vcap_admin admin = {
1013		.vtype = VCAP_TYPE_IS2,
1014	};
1015	struct vcap_rule_internal ri = {
1016		.admin = &admin,
1017		.data = {
1018			.keyset = VCAP_KFS_NO_VALUE,
1019		},
1020		.vctrl = &test_vctrl,
1021	};
1022	struct vcap_rule *rule = (struct vcap_rule *)&ri;
1023	struct vcap_client_keyfield *kf;
1024	int ret;
1025	struct vcap_u128_key dip = {
1026		.value = {0x17, 0x26, 0x35, 0x44, 0x63, 0x62, 0x71},
1027		.mask = {0xf1, 0xf2, 0xf3, 0xf4, 0x4f, 0x3f, 0x2f, 0x1f},
1028	};
1029	int idx;
1030
1031	INIT_LIST_HEAD(&rule->keyfields);
1032	ret = vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS, VCAP_BIT_0);
1033	KUNIT_EXPECT_EQ(test, 0, ret);
1034	ret = list_empty(&rule->keyfields);
1035	KUNIT_EXPECT_EQ(test, false, ret);
1036	kf = list_first_entry(&rule->keyfields, struct vcap_client_keyfield,
1037			      ctrl.list);
1038	KUNIT_EXPECT_EQ(test, VCAP_KF_LOOKUP_FIRST_IS, kf->ctrl.key);
1039	KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, kf->ctrl.type);
1040	KUNIT_EXPECT_EQ(test, 0x0, kf->data.u1.value);
1041	KUNIT_EXPECT_EQ(test, 0x1, kf->data.u1.mask);
1042	vcap_free_ckf(rule);
1043
1044	INIT_LIST_HEAD(&rule->keyfields);
1045	ret = vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS, VCAP_BIT_1);
1046	KUNIT_EXPECT_EQ(test, 0, ret);
1047	ret = list_empty(&rule->keyfields);
1048	KUNIT_EXPECT_EQ(test, false, ret);
1049	kf = list_first_entry(&rule->keyfields, struct vcap_client_keyfield,
1050			      ctrl.list);
1051	KUNIT_EXPECT_EQ(test, VCAP_KF_LOOKUP_FIRST_IS, kf->ctrl.key);
1052	KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, kf->ctrl.type);
1053	KUNIT_EXPECT_EQ(test, 0x1, kf->data.u1.value);
1054	KUNIT_EXPECT_EQ(test, 0x1, kf->data.u1.mask);
1055	vcap_free_ckf(rule);
1056
1057	INIT_LIST_HEAD(&rule->keyfields);
1058	ret = vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS,
1059				    VCAP_BIT_ANY);
1060	KUNIT_EXPECT_EQ(test, 0, ret);
1061	ret = list_empty(&rule->keyfields);
1062	KUNIT_EXPECT_EQ(test, false, ret);
1063	kf = list_first_entry(&rule->keyfields, struct vcap_client_keyfield,
1064			      ctrl.list);
1065	KUNIT_EXPECT_EQ(test, VCAP_KF_LOOKUP_FIRST_IS, kf->ctrl.key);
1066	KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, kf->ctrl.type);
1067	KUNIT_EXPECT_EQ(test, 0x0, kf->data.u1.value);
1068	KUNIT_EXPECT_EQ(test, 0x0, kf->data.u1.mask);
1069	vcap_free_ckf(rule);
1070
1071	INIT_LIST_HEAD(&rule->keyfields);
1072	ret = vcap_rule_add_key_u32(rule, VCAP_KF_TYPE, 0x98765432, 0xff00ffab);
1073	KUNIT_EXPECT_EQ(test, 0, ret);
1074	ret = list_empty(&rule->keyfields);
1075	KUNIT_EXPECT_EQ(test, false, ret);
1076	kf = list_first_entry(&rule->keyfields, struct vcap_client_keyfield,
1077			      ctrl.list);
1078	KUNIT_EXPECT_EQ(test, VCAP_KF_TYPE, kf->ctrl.key);
1079	KUNIT_EXPECT_EQ(test, VCAP_FIELD_U32, kf->ctrl.type);
1080	KUNIT_EXPECT_EQ(test, 0x98765432, kf->data.u32.value);
1081	KUNIT_EXPECT_EQ(test, 0xff00ffab, kf->data.u32.mask);
1082	vcap_free_ckf(rule);
1083
1084	INIT_LIST_HEAD(&rule->keyfields);
1085	ret = vcap_rule_add_key_u128(rule, VCAP_KF_L3_IP6_SIP, &dip);
1086	KUNIT_EXPECT_EQ(test, 0, ret);
1087	ret = list_empty(&rule->keyfields);
1088	KUNIT_EXPECT_EQ(test, false, ret);
1089	kf = list_first_entry(&rule->keyfields, struct vcap_client_keyfield,
1090			      ctrl.list);
1091	KUNIT_EXPECT_EQ(test, VCAP_KF_L3_IP6_SIP, kf->ctrl.key);
1092	KUNIT_EXPECT_EQ(test, VCAP_FIELD_U128, kf->ctrl.type);
1093	for (idx = 0; idx < ARRAY_SIZE(dip.value); ++idx)
1094		KUNIT_EXPECT_EQ(test, dip.value[idx], kf->data.u128.value[idx]);
1095	for (idx = 0; idx < ARRAY_SIZE(dip.mask); ++idx)
1096		KUNIT_EXPECT_EQ(test, dip.mask[idx], kf->data.u128.mask[idx]);
1097	vcap_free_ckf(rule);
1098}
1099
1100static void vcap_free_caf(struct vcap_rule *rule)
1101{
1102	struct vcap_client_actionfield *caf, *next_caf;
1103
1104	list_for_each_entry_safe(caf, next_caf,
1105				 &rule->actionfields, ctrl.list) {
1106		list_del(&caf->ctrl.list);
1107		kfree(caf);
1108	}
1109}
1110
1111static void vcap_api_rule_add_actionvalue_test(struct kunit *test)
1112{
1113	struct vcap_admin admin = {
1114		.vtype = VCAP_TYPE_IS2,
1115	};
1116	struct vcap_rule_internal ri = {
1117		.admin = &admin,
1118		.data = {
1119			.actionset = VCAP_AFS_NO_VALUE,
1120		},
1121	};
1122	struct vcap_rule *rule = (struct vcap_rule *)&ri;
1123	struct vcap_client_actionfield *af;
1124	int ret;
1125
1126	INIT_LIST_HEAD(&rule->actionfields);
1127	ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_0);
1128	KUNIT_EXPECT_EQ(test, 0, ret);
1129	ret = list_empty(&rule->actionfields);
1130	KUNIT_EXPECT_EQ(test, false, ret);
1131	af = list_first_entry(&rule->actionfields,
1132			      struct vcap_client_actionfield, ctrl.list);
1133	KUNIT_EXPECT_EQ(test, VCAP_AF_POLICE_ENA, af->ctrl.action);
1134	KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, af->ctrl.type);
1135	KUNIT_EXPECT_EQ(test, 0x0, af->data.u1.value);
1136	vcap_free_caf(rule);
1137
1138	INIT_LIST_HEAD(&rule->actionfields);
1139	ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_1);
1140	KUNIT_EXPECT_EQ(test, 0, ret);
1141	ret = list_empty(&rule->actionfields);
1142	KUNIT_EXPECT_EQ(test, false, ret);
1143	af = list_first_entry(&rule->actionfields,
1144			      struct vcap_client_actionfield, ctrl.list);
1145	KUNIT_EXPECT_EQ(test, VCAP_AF_POLICE_ENA, af->ctrl.action);
1146	KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, af->ctrl.type);
1147	KUNIT_EXPECT_EQ(test, 0x1, af->data.u1.value);
1148	vcap_free_caf(rule);
1149
1150	INIT_LIST_HEAD(&rule->actionfields);
1151	ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_ANY);
1152	KUNIT_EXPECT_EQ(test, 0, ret);
1153	ret = list_empty(&rule->actionfields);
1154	KUNIT_EXPECT_EQ(test, false, ret);
1155	af = list_first_entry(&rule->actionfields,
1156			      struct vcap_client_actionfield, ctrl.list);
1157	KUNIT_EXPECT_EQ(test, VCAP_AF_POLICE_ENA, af->ctrl.action);
1158	KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, af->ctrl.type);
1159	KUNIT_EXPECT_EQ(test, 0x0, af->data.u1.value);
1160	vcap_free_caf(rule);
1161
1162	INIT_LIST_HEAD(&rule->actionfields);
1163	ret = vcap_rule_add_action_u32(rule, VCAP_AF_TYPE, 0x98765432);
1164	KUNIT_EXPECT_EQ(test, 0, ret);
1165	ret = list_empty(&rule->actionfields);
1166	KUNIT_EXPECT_EQ(test, false, ret);
1167	af = list_first_entry(&rule->actionfields,
1168			      struct vcap_client_actionfield, ctrl.list);
1169	KUNIT_EXPECT_EQ(test, VCAP_AF_TYPE, af->ctrl.action);
1170	KUNIT_EXPECT_EQ(test, VCAP_FIELD_U32, af->ctrl.type);
1171	KUNIT_EXPECT_EQ(test, 0x98765432, af->data.u32.value);
1172	vcap_free_caf(rule);
1173
1174	INIT_LIST_HEAD(&rule->actionfields);
1175	ret = vcap_rule_add_action_u32(rule, VCAP_AF_MASK_MODE, 0xaabbccdd);
1176	KUNIT_EXPECT_EQ(test, 0, ret);
1177	ret = list_empty(&rule->actionfields);
1178	KUNIT_EXPECT_EQ(test, false, ret);
1179	af = list_first_entry(&rule->actionfields,
1180			      struct vcap_client_actionfield, ctrl.list);
1181	KUNIT_EXPECT_EQ(test, VCAP_AF_MASK_MODE, af->ctrl.action);
1182	KUNIT_EXPECT_EQ(test, VCAP_FIELD_U32, af->ctrl.type);
1183	KUNIT_EXPECT_EQ(test, 0xaabbccdd, af->data.u32.value);
1184	vcap_free_caf(rule);
1185}
1186
1187static void vcap_api_rule_find_keyset_basic_test(struct kunit *test)
1188{
1189	struct vcap_keyset_list matches = {};
1190	struct vcap_admin admin = {
1191		.vtype = VCAP_TYPE_IS2,
1192	};
1193	struct vcap_rule_internal ri = {
1194		.admin = &admin,
1195		.vctrl = &test_vctrl,
1196	};
1197	struct vcap_client_keyfield ckf[] = {
1198		{
1199			.ctrl.key = VCAP_KF_TYPE,
1200		}, {
1201			.ctrl.key = VCAP_KF_LOOKUP_FIRST_IS,
1202		}, {
1203			.ctrl.key = VCAP_KF_IF_IGR_PORT_MASK_L3,
1204		}, {
1205			.ctrl.key = VCAP_KF_IF_IGR_PORT_MASK_RNG,
1206		}, {
1207			.ctrl.key = VCAP_KF_IF_IGR_PORT_MASK,
1208		}, {
1209			.ctrl.key = VCAP_KF_L2_DMAC,
1210		}, {
1211			.ctrl.key = VCAP_KF_ETYPE_LEN_IS,
1212		}, {
1213			.ctrl.key = VCAP_KF_ETYPE,
1214		},
1215	};
1216	int idx;
1217	bool ret;
1218	enum vcap_keyfield_set keysets[10] = {};
1219
1220	matches.keysets = keysets;
1221	matches.max = ARRAY_SIZE(keysets);
1222
1223	INIT_LIST_HEAD(&ri.data.keyfields);
1224	for (idx = 0; idx < ARRAY_SIZE(ckf); idx++)
1225		list_add_tail(&ckf[idx].ctrl.list, &ri.data.keyfields);
1226
1227	ret = vcap_rule_find_keysets(&ri.data, &matches);
1228
1229	KUNIT_EXPECT_EQ(test, true, ret);
1230	KUNIT_EXPECT_EQ(test, 1, matches.cnt);
1231	KUNIT_EXPECT_EQ(test, VCAP_KFS_MAC_ETYPE, matches.keysets[0]);
1232}
1233
1234static void vcap_api_rule_find_keyset_failed_test(struct kunit *test)
1235{
1236	struct vcap_keyset_list matches = {};
1237	struct vcap_admin admin = {
1238		.vtype = VCAP_TYPE_IS2,
1239	};
1240	struct vcap_rule_internal ri = {
1241		.admin = &admin,
1242		.vctrl = &test_vctrl,
1243	};
1244	struct vcap_client_keyfield ckf[] = {
1245		{
1246			.ctrl.key = VCAP_KF_TYPE,
1247		}, {
1248			.ctrl.key = VCAP_KF_LOOKUP_FIRST_IS,
1249		}, {
1250			.ctrl.key = VCAP_KF_ARP_OPCODE,
1251		}, {
1252			.ctrl.key = VCAP_KF_L3_IP4_SIP,
1253		}, {
1254			.ctrl.key = VCAP_KF_L3_IP4_DIP,
1255		}, {
1256			.ctrl.key = VCAP_KF_8021Q_PCP_CLS,
1257		}, {
1258			.ctrl.key = VCAP_KF_ETYPE_LEN_IS, /* Not with ARP */
1259		}, {
1260			.ctrl.key = VCAP_KF_ETYPE, /* Not with ARP */
1261		},
1262	};
1263	int idx;
1264	bool ret;
1265	enum vcap_keyfield_set keysets[10] = {};
1266
1267	matches.keysets = keysets;
1268	matches.max = ARRAY_SIZE(keysets);
1269
1270	INIT_LIST_HEAD(&ri.data.keyfields);
1271	for (idx = 0; idx < ARRAY_SIZE(ckf); idx++)
1272		list_add_tail(&ckf[idx].ctrl.list, &ri.data.keyfields);
1273
1274	ret = vcap_rule_find_keysets(&ri.data, &matches);
1275
1276	KUNIT_EXPECT_EQ(test, false, ret);
1277	KUNIT_EXPECT_EQ(test, 0, matches.cnt);
1278	KUNIT_EXPECT_EQ(test, VCAP_KFS_NO_VALUE, matches.keysets[0]);
1279}
1280
1281static void vcap_api_rule_find_keyset_many_test(struct kunit *test)
1282{
1283	struct vcap_keyset_list matches = {};
1284	struct vcap_admin admin = {
1285		.vtype = VCAP_TYPE_IS2,
1286	};
1287	struct vcap_rule_internal ri = {
1288		.admin = &admin,
1289		.vctrl = &test_vctrl,
1290	};
1291	struct vcap_client_keyfield ckf[] = {
1292		{
1293			.ctrl.key = VCAP_KF_TYPE,
1294		}, {
1295			.ctrl.key = VCAP_KF_LOOKUP_FIRST_IS,
1296		}, {
1297			.ctrl.key = VCAP_KF_8021Q_DEI_CLS,
1298		}, {
1299			.ctrl.key = VCAP_KF_8021Q_PCP_CLS,
1300		}, {
1301			.ctrl.key = VCAP_KF_8021Q_VID_CLS,
1302		}, {
1303			.ctrl.key = VCAP_KF_ISDX_CLS,
1304		}, {
1305			.ctrl.key = VCAP_KF_L2_MC_IS,
1306		}, {
1307			.ctrl.key = VCAP_KF_L2_BC_IS,
1308		},
1309	};
1310	int idx;
1311	bool ret;
1312	enum vcap_keyfield_set keysets[10] = {};
1313
1314	matches.keysets = keysets;
1315	matches.max = ARRAY_SIZE(keysets);
1316
1317	INIT_LIST_HEAD(&ri.data.keyfields);
1318	for (idx = 0; idx < ARRAY_SIZE(ckf); idx++)
1319		list_add_tail(&ckf[idx].ctrl.list, &ri.data.keyfields);
1320
1321	ret = vcap_rule_find_keysets(&ri.data, &matches);
1322
1323	KUNIT_EXPECT_EQ(test, true, ret);
1324	KUNIT_EXPECT_EQ(test, 6, matches.cnt);
1325	KUNIT_EXPECT_EQ(test, VCAP_KFS_ARP, matches.keysets[0]);
1326	KUNIT_EXPECT_EQ(test, VCAP_KFS_IP4_OTHER, matches.keysets[1]);
1327	KUNIT_EXPECT_EQ(test, VCAP_KFS_IP4_TCP_UDP, matches.keysets[2]);
1328	KUNIT_EXPECT_EQ(test, VCAP_KFS_IP6_STD, matches.keysets[3]);
1329	KUNIT_EXPECT_EQ(test, VCAP_KFS_IP_7TUPLE, matches.keysets[4]);
1330	KUNIT_EXPECT_EQ(test, VCAP_KFS_MAC_ETYPE, matches.keysets[5]);
1331}
1332
1333static void vcap_api_encode_rule_test(struct kunit *test)
1334{
1335	/* Data used by VCAP Library callback */
1336	static u32 keydata[32] = {};
1337	static u32 mskdata[32] = {};
1338	static u32 actdata[32] = {};
1339
1340	struct vcap_admin is2_admin = {
1341		.vtype = VCAP_TYPE_IS2,
1342		.first_cid = 8000000,
1343		.last_cid = 8099999,
1344		.lookups = 4,
1345		.last_valid_addr = 3071,
1346		.first_valid_addr = 0,
1347		.last_used_addr = 800,
1348		.cache = {
1349			.keystream = keydata,
1350			.maskstream = mskdata,
1351			.actionstream = actdata,
1352		},
1353	};
1354	struct vcap_rule *rule;
1355	struct vcap_rule_internal *ri;
1356	int vcap_chain_id = 8000000;
1357	enum vcap_user user = VCAP_USER_VCAP_UTIL;
1358	u16 priority = 10;
1359	int id = 100;
1360	int ret;
1361	struct vcap_u48_key smac = {
1362		.value = { 0x88, 0x75, 0x32, 0x34, 0x9e, 0xb1 },
1363		.mask = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }
1364	};
1365	struct vcap_u48_key dmac = {
1366		.value = { 0x06, 0x05, 0x04, 0x03, 0x02, 0x01 },
1367		.mask = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }
1368	};
1369	u32 port_mask_rng_value = 0x05;
1370	u32 port_mask_rng_mask = 0x0f;
1371	u32 igr_port_mask_value = 0xffabcd01;
1372	u32 igr_port_mask_mask = ~0;
1373	/* counter is written as the first operation */
1374	u32 expwriteaddr[] = {792, 792, 793, 794, 795, 796, 797};
1375	int idx;
1376
1377	vcap_test_api_init(&is2_admin);
1378
1379	/* Allocate the rule */
1380	rule = vcap_alloc_rule(&test_vctrl, &test_netdev, vcap_chain_id, user,
1381			       priority, id);
1382	KUNIT_EXPECT_PTR_NE(test, NULL, rule);
1383	ri = (struct vcap_rule_internal *)rule;
1384
1385	/* Add rule keys */
1386	ret = vcap_rule_add_key_u48(rule, VCAP_KF_L2_DMAC, &dmac);
1387	KUNIT_EXPECT_EQ(test, 0, ret);
1388	ret = vcap_rule_add_key_u48(rule, VCAP_KF_L2_SMAC, &smac);
1389	KUNIT_EXPECT_EQ(test, 0, ret);
1390	ret = vcap_rule_add_key_bit(rule, VCAP_KF_ETYPE_LEN_IS, VCAP_BIT_1);
1391	KUNIT_EXPECT_EQ(test, 0, ret);
1392	/* Cannot add the same field twice */
1393	ret = vcap_rule_add_key_bit(rule, VCAP_KF_ETYPE_LEN_IS, VCAP_BIT_1);
1394	KUNIT_EXPECT_EQ(test, -EINVAL, ret);
1395	ret = vcap_rule_add_key_bit(rule, VCAP_KF_IF_IGR_PORT_MASK_L3,
1396				    VCAP_BIT_ANY);
1397	KUNIT_EXPECT_EQ(test, 0, ret);
1398	ret = vcap_rule_add_key_u32(rule, VCAP_KF_IF_IGR_PORT_MASK_RNG,
1399				    port_mask_rng_value, port_mask_rng_mask);
1400	KUNIT_EXPECT_EQ(test, 0, ret);
1401	ret = vcap_rule_add_key_u32(rule, VCAP_KF_IF_IGR_PORT_MASK,
1402				    igr_port_mask_value, igr_port_mask_mask);
1403	KUNIT_EXPECT_EQ(test, 0, ret);
1404
1405	/* Add rule actions */
1406	ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_1);
1407	KUNIT_EXPECT_EQ(test, 0, ret);
1408	ret = vcap_rule_add_action_u32(rule, VCAP_AF_CNT_ID, id);
1409	KUNIT_EXPECT_EQ(test, 0, ret);
1410	ret = vcap_rule_add_action_u32(rule, VCAP_AF_MATCH_ID, 1);
1411	KUNIT_EXPECT_EQ(test, 0, ret);
1412	ret = vcap_rule_add_action_u32(rule, VCAP_AF_MATCH_ID_MASK, 1);
1413	KUNIT_EXPECT_EQ(test, 0, ret);
1414
1415	/* For now the actionset is hardcoded */
1416	ret = vcap_set_rule_set_actionset(rule, VCAP_AFS_BASE_TYPE);
1417	KUNIT_EXPECT_EQ(test, 0, ret);
1418
1419	/* Validation with validate keyset callback */
1420	ret = vcap_val_rule(rule, ETH_P_ALL);
1421	KUNIT_EXPECT_EQ(test, 0, ret);
1422	KUNIT_EXPECT_EQ(test, VCAP_KFS_MAC_ETYPE, rule->keyset);
1423	KUNIT_EXPECT_EQ(test, VCAP_AFS_BASE_TYPE, rule->actionset);
1424	KUNIT_EXPECT_EQ(test, 6, ri->size);
1425	KUNIT_EXPECT_EQ(test, 2, ri->keyset_sw_regs);
1426	KUNIT_EXPECT_EQ(test, 4, ri->actionset_sw_regs);
1427
1428	/* Enable lookup, so the rule will be written */
1429	ret = vcap_enable_lookups(&test_vctrl, &test_netdev, 0,
1430				  rule->vcap_chain_id, rule->cookie, true);
1431	KUNIT_EXPECT_EQ(test, 0, ret);
1432
1433	/* Add rule with write callback */
1434	ret = vcap_add_rule(rule);
1435	KUNIT_EXPECT_EQ(test, 0, ret);
1436	KUNIT_EXPECT_EQ(test, 792, is2_admin.last_used_addr);
1437	for (idx = 0; idx < ARRAY_SIZE(expwriteaddr); ++idx)
1438		KUNIT_EXPECT_EQ(test, expwriteaddr[idx], test_updateaddr[idx]);
1439
1440	/* Check that the rule has been added */
1441	ret = list_empty(&is2_admin.rules);
1442	KUNIT_EXPECT_EQ(test, false, ret);
1443	KUNIT_EXPECT_EQ(test, 0, ret);
1444
1445	vcap_enable_lookups(&test_vctrl, &test_netdev, 0, 0,
1446			    rule->cookie, false);
1447
1448	ret = vcap_del_rule(&test_vctrl, &test_netdev, id);
1449	KUNIT_EXPECT_EQ(test, 0, ret);
1450
1451	vcap_free_rule(rule);
 
 
 
 
 
 
 
 
 
1452}
1453
1454static void vcap_api_set_rule_counter_test(struct kunit *test)
1455{
1456	struct vcap_admin is2_admin = {
1457		.cache = {
1458			.counter = 100,
1459			.sticky = true,
1460		},
1461	};
1462	struct vcap_rule_internal ri = {
1463		.data = {
1464			.id = 1001,
1465		},
1466		.addr = 600,
1467		.admin = &is2_admin,
1468		.counter_id = 1002,
1469		.vctrl = &test_vctrl,
1470	};
1471	struct vcap_rule_internal ri2 = {
1472		.data = {
1473			.id = 2001,
1474		},
1475		.addr = 700,
1476		.admin = &is2_admin,
1477		.counter_id = 2002,
1478		.vctrl = &test_vctrl,
1479	};
1480	struct vcap_counter ctr = { .value = 0, .sticky = false};
1481	struct vcap_counter ctr2 = { .value = 101, .sticky = true};
1482	int ret;
1483
1484	vcap_test_api_init(&is2_admin);
1485	list_add_tail(&ri.list, &is2_admin.rules);
1486	list_add_tail(&ri2.list, &is2_admin.rules);
1487
1488	pr_info("%s:%d\n", __func__, __LINE__);
1489	ret = vcap_rule_set_counter(&ri.data, &ctr);
1490	pr_info("%s:%d\n", __func__, __LINE__);
1491	KUNIT_EXPECT_EQ(test, 0, ret);
1492
1493	KUNIT_EXPECT_EQ(test, 1002, test_hw_counter_id);
1494	KUNIT_EXPECT_EQ(test, 0, test_hw_cache.counter);
1495	KUNIT_EXPECT_EQ(test, false, test_hw_cache.sticky);
1496	KUNIT_EXPECT_EQ(test, 600, test_updateaddr[0]);
1497
1498	ret = vcap_rule_set_counter(&ri2.data, &ctr2);
1499	KUNIT_EXPECT_EQ(test, 0, ret);
1500
1501	KUNIT_EXPECT_EQ(test, 2002, test_hw_counter_id);
1502	KUNIT_EXPECT_EQ(test, 101, test_hw_cache.counter);
1503	KUNIT_EXPECT_EQ(test, true, test_hw_cache.sticky);
1504	KUNIT_EXPECT_EQ(test, 700, test_updateaddr[1]);
1505}
1506
1507static void vcap_api_get_rule_counter_test(struct kunit *test)
1508{
1509	struct vcap_admin is2_admin = {
1510		.cache = {
1511			.counter = 100,
1512			.sticky = true,
1513		},
1514	};
1515	struct vcap_rule_internal ri = {
1516		.data = {
1517			.id = 1010,
1518		},
1519		.addr = 400,
1520		.admin = &is2_admin,
1521		.counter_id = 1011,
1522		.vctrl = &test_vctrl,
1523	};
1524	struct vcap_rule_internal ri2 = {
1525		.data = {
1526			.id = 2011,
1527		},
1528		.addr = 300,
1529		.admin = &is2_admin,
1530		.counter_id = 2012,
1531		.vctrl = &test_vctrl,
1532	};
1533	struct vcap_counter ctr = {};
1534	struct vcap_counter ctr2 = {};
1535	int ret;
1536
1537	vcap_test_api_init(&is2_admin);
1538	test_hw_cache.counter = 55;
1539	test_hw_cache.sticky = true;
1540
1541	list_add_tail(&ri.list, &is2_admin.rules);
1542	list_add_tail(&ri2.list, &is2_admin.rules);
1543
1544	ret = vcap_rule_get_counter(&ri.data, &ctr);
1545	KUNIT_EXPECT_EQ(test, 0, ret);
1546
1547	KUNIT_EXPECT_EQ(test, 1011, test_hw_counter_id);
1548	KUNIT_EXPECT_EQ(test, 55, ctr.value);
1549	KUNIT_EXPECT_EQ(test, true, ctr.sticky);
1550	KUNIT_EXPECT_EQ(test, 400, test_updateaddr[0]);
1551
1552	test_hw_cache.counter = 22;
1553	test_hw_cache.sticky = false;
1554
1555	ret = vcap_rule_get_counter(&ri2.data, &ctr2);
1556	KUNIT_EXPECT_EQ(test, 0, ret);
1557
1558	KUNIT_EXPECT_EQ(test, 2012, test_hw_counter_id);
1559	KUNIT_EXPECT_EQ(test, 22, ctr2.value);
1560	KUNIT_EXPECT_EQ(test, false, ctr2.sticky);
1561	KUNIT_EXPECT_EQ(test, 300, test_updateaddr[1]);
1562}
1563
1564static void vcap_api_rule_insert_in_order_test(struct kunit *test)
1565{
1566	/* Data used by VCAP Library callback */
1567	static u32 keydata[32] = {};
1568	static u32 mskdata[32] = {};
1569	static u32 actdata[32] = {};
1570
1571	struct vcap_admin admin = {
1572		.vtype = VCAP_TYPE_IS0,
1573		.first_cid = 10000,
1574		.last_cid = 19999,
1575		.lookups = 4,
1576		.last_valid_addr = 3071,
1577		.first_valid_addr = 0,
1578		.last_used_addr = 800,
1579		.cache = {
1580			.keystream = keydata,
1581			.maskstream = mskdata,
1582			.actionstream = actdata,
1583		},
1584	};
1585
1586	vcap_test_api_init(&admin);
1587
1588	/* Create rules with different sizes and check that they are placed
1589	 * at the correct address in the VCAP according to size
1590	 */
1591	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 10, 500, 12, 780);
1592	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 400, 6, 774);
1593	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 771);
1594	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 200, 2, 768);
1595
1596	vcap_del_rule(&test_vctrl, &test_netdev, 200);
1597	vcap_del_rule(&test_vctrl, &test_netdev, 300);
1598	vcap_del_rule(&test_vctrl, &test_netdev, 400);
1599	vcap_del_rule(&test_vctrl, &test_netdev, 500);
1600}
1601
1602static void vcap_api_rule_insert_reverse_order_test(struct kunit *test)
1603{
1604	/* Data used by VCAP Library callback */
1605	static u32 keydata[32] = {};
1606	static u32 mskdata[32] = {};
1607	static u32 actdata[32] = {};
1608
1609	struct vcap_admin admin = {
1610		.vtype = VCAP_TYPE_IS0,
1611		.first_cid = 10000,
1612		.last_cid = 19999,
1613		.lookups = 4,
1614		.last_valid_addr = 3071,
1615		.first_valid_addr = 0,
1616		.last_used_addr = 800,
1617		.cache = {
1618			.keystream = keydata,
1619			.maskstream = mskdata,
1620			.actionstream = actdata,
1621		},
1622	};
1623	struct vcap_rule_internal *elem;
1624	u32 exp_addr[] = {780, 774, 771, 768, 767};
1625	int idx;
1626
1627	vcap_test_api_init(&admin);
1628
1629	/* Create rules with different sizes and check that they are placed
1630	 * at the correct address in the VCAP according to size
1631	 */
1632	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 200, 2, 798);
1633	KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1634	KUNIT_EXPECT_EQ(test, 0, test_move_count);
1635	KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1636
1637	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 795);
1638	KUNIT_EXPECT_EQ(test, 6, test_move_offset);
1639	KUNIT_EXPECT_EQ(test, 3, test_move_count);
1640	KUNIT_EXPECT_EQ(test, 798, test_move_addr);
1641
1642	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 400, 6, 792);
1643	KUNIT_EXPECT_EQ(test, 6, test_move_offset);
1644	KUNIT_EXPECT_EQ(test, 6, test_move_count);
1645	KUNIT_EXPECT_EQ(test, 792, test_move_addr);
1646
1647	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 50, 500, 12, 780);
1648	KUNIT_EXPECT_EQ(test, 18, test_move_offset);
1649	KUNIT_EXPECT_EQ(test, 12, test_move_count);
1650	KUNIT_EXPECT_EQ(test, 786, test_move_addr);
1651
1652	idx = 0;
1653	list_for_each_entry(elem, &admin.rules, list) {
1654		KUNIT_EXPECT_EQ(test, exp_addr[idx], elem->addr);
1655		++idx;
1656	}
1657	KUNIT_EXPECT_EQ(test, 768, admin.last_used_addr);
1658
1659	vcap_del_rule(&test_vctrl, &test_netdev, 500);
1660	vcap_del_rule(&test_vctrl, &test_netdev, 400);
1661	vcap_del_rule(&test_vctrl, &test_netdev, 300);
1662	vcap_del_rule(&test_vctrl, &test_netdev, 200);
1663}
1664
1665static void vcap_api_rule_remove_at_end_test(struct kunit *test)
1666{
1667	/* Data used by VCAP Library callback */
1668	static u32 keydata[32] = {};
1669	static u32 mskdata[32] = {};
1670	static u32 actdata[32] = {};
1671
1672	struct vcap_admin admin = {
1673		.vtype = VCAP_TYPE_IS0,
1674		.first_cid = 10000,
1675		.last_cid = 19999,
1676		.lookups = 4,
1677		.last_valid_addr = 3071,
1678		.first_valid_addr = 0,
1679		.last_used_addr = 800,
1680		.cache = {
1681			.keystream = keydata,
1682			.maskstream = mskdata,
1683			.actionstream = actdata,
1684		},
1685	};
1686	int ret;
1687
1688	vcap_test_api_init(&admin);
1689	test_init_rule_deletion();
1690
1691	/* Create rules with different sizes and check that they are placed
1692	 * at the correct address in the VCAP according to size
1693	 */
1694	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 10, 500, 12, 780);
1695	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 400, 6, 774);
1696	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 771);
1697	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 200, 2, 768);
1698
1699	/* Remove rules again from the end */
1700	ret = vcap_del_rule(&test_vctrl, &test_netdev, 200);
1701	KUNIT_EXPECT_EQ(test, 0, ret);
1702	KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1703	KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1704	KUNIT_EXPECT_EQ(test, 0, test_move_count);
1705	KUNIT_EXPECT_EQ(test, 768, test_init_start);
1706	KUNIT_EXPECT_EQ(test, 2, test_init_count);
1707	KUNIT_EXPECT_EQ(test, 771, admin.last_used_addr);
1708
1709	ret = vcap_del_rule(&test_vctrl, &test_netdev, 300);
1710	KUNIT_EXPECT_EQ(test, ret, 0);
1711	KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1712	KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1713	KUNIT_EXPECT_EQ(test, 0, test_move_count);
1714	KUNIT_EXPECT_EQ(test, 771, test_init_start);
1715	KUNIT_EXPECT_EQ(test, 3, test_init_count);
1716	KUNIT_EXPECT_EQ(test, 774, admin.last_used_addr);
1717
1718	ret = vcap_del_rule(&test_vctrl, &test_netdev, 400);
1719	KUNIT_EXPECT_EQ(test, ret, 0);
1720	KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1721	KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1722	KUNIT_EXPECT_EQ(test, 0, test_move_count);
1723	KUNIT_EXPECT_EQ(test, 774, test_init_start);
1724	KUNIT_EXPECT_EQ(test, 6, test_init_count);
1725	KUNIT_EXPECT_EQ(test, 780, admin.last_used_addr);
1726
1727	ret = vcap_del_rule(&test_vctrl, &test_netdev, 500);
1728	KUNIT_EXPECT_EQ(test, ret, 0);
1729	KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1730	KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1731	KUNIT_EXPECT_EQ(test, 0, test_move_count);
1732	KUNIT_EXPECT_EQ(test, 780, test_init_start);
1733	KUNIT_EXPECT_EQ(test, 12, test_init_count);
1734	KUNIT_EXPECT_EQ(test, 3072, admin.last_used_addr);
1735}
1736
1737static void vcap_api_rule_remove_in_middle_test(struct kunit *test)
1738{
1739	/* Data used by VCAP Library callback */
1740	static u32 keydata[32] = {};
1741	static u32 mskdata[32] = {};
1742	static u32 actdata[32] = {};
1743
1744	struct vcap_admin admin = {
1745		.vtype = VCAP_TYPE_IS0,
1746		.first_cid = 10000,
1747		.last_cid = 19999,
1748		.lookups = 4,
1749		.first_valid_addr = 0,
1750		.last_used_addr = 800,
1751		.last_valid_addr = 800 - 1,
1752		.cache = {
1753			.keystream = keydata,
1754			.maskstream = mskdata,
1755			.actionstream = actdata,
1756		},
1757	};
1758	int ret;
1759
1760	vcap_test_api_init(&admin);
1761
1762	/* Create rules with different sizes and check that they are placed
1763	 * at the correct address in the VCAP according to size
1764	 */
1765	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 10, 500, 12, 780);
1766	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 400, 6, 774);
1767	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 771);
1768	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 200, 2, 768);
1769
1770	/* Remove rules in the middle */
1771	test_init_rule_deletion();
1772	ret = vcap_del_rule(&test_vctrl, &test_netdev, 400);
1773	KUNIT_EXPECT_EQ(test, 0, ret);
1774	KUNIT_EXPECT_EQ(test, 768, test_move_addr);
1775	KUNIT_EXPECT_EQ(test, -6, test_move_offset);
1776	KUNIT_EXPECT_EQ(test, 6, test_move_count);
1777	KUNIT_EXPECT_EQ(test, 768, test_init_start);
1778	KUNIT_EXPECT_EQ(test, 6, test_init_count);
1779	KUNIT_EXPECT_EQ(test, 774, admin.last_used_addr);
1780
1781	test_init_rule_deletion();
1782	ret = vcap_del_rule(&test_vctrl, &test_netdev, 300);
1783	KUNIT_EXPECT_EQ(test, 0, ret);
1784	KUNIT_EXPECT_EQ(test, 774, test_move_addr);
1785	KUNIT_EXPECT_EQ(test, -4, test_move_offset);
1786	KUNIT_EXPECT_EQ(test, 2, test_move_count);
1787	KUNIT_EXPECT_EQ(test, 774, test_init_start);
1788	KUNIT_EXPECT_EQ(test, 4, test_init_count);
1789	KUNIT_EXPECT_EQ(test, 778, admin.last_used_addr);
1790
1791	test_init_rule_deletion();
1792	ret = vcap_del_rule(&test_vctrl, &test_netdev, 500);
1793	KUNIT_EXPECT_EQ(test, 0, ret);
1794	KUNIT_EXPECT_EQ(test, 778, test_move_addr);
1795	KUNIT_EXPECT_EQ(test, -20, test_move_offset);
1796	KUNIT_EXPECT_EQ(test, 2, test_move_count);
1797	KUNIT_EXPECT_EQ(test, 778, test_init_start);
1798	KUNIT_EXPECT_EQ(test, 20, test_init_count);
1799	KUNIT_EXPECT_EQ(test, 798, admin.last_used_addr);
1800
1801	test_init_rule_deletion();
1802	ret = vcap_del_rule(&test_vctrl, &test_netdev, 200);
1803	KUNIT_EXPECT_EQ(test, 0, ret);
1804	KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1805	KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1806	KUNIT_EXPECT_EQ(test, 0, test_move_count);
1807	KUNIT_EXPECT_EQ(test, 798, test_init_start);
1808	KUNIT_EXPECT_EQ(test, 2, test_init_count);
1809	KUNIT_EXPECT_EQ(test, 800, admin.last_used_addr);
1810}
1811
1812static void vcap_api_rule_remove_in_front_test(struct kunit *test)
1813{
1814	/* Data used by VCAP Library callback */
1815	static u32 keydata[32] = {};
1816	static u32 mskdata[32] = {};
1817	static u32 actdata[32] = {};
1818
1819	struct vcap_admin admin = {
1820		.vtype = VCAP_TYPE_IS0,
1821		.first_cid = 10000,
1822		.last_cid = 19999,
1823		.lookups = 4,
1824		.first_valid_addr = 0,
1825		.last_used_addr = 800,
1826		.last_valid_addr = 800 - 1,
1827		.cache = {
1828			.keystream = keydata,
1829			.maskstream = mskdata,
1830			.actionstream = actdata,
1831		},
1832	};
1833	int ret;
1834
1835	vcap_test_api_init(&admin);
1836
1837	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 10, 500, 12, 780);
1838	KUNIT_EXPECT_EQ(test, 780, admin.last_used_addr);
1839
1840	test_init_rule_deletion();
1841	ret = vcap_del_rule(&test_vctrl, &test_netdev, 500);
1842	KUNIT_EXPECT_EQ(test, 0, ret);
1843	KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1844	KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1845	KUNIT_EXPECT_EQ(test, 0, test_move_count);
1846	KUNIT_EXPECT_EQ(test, 780, test_init_start);
1847	KUNIT_EXPECT_EQ(test, 12, test_init_count);
1848	KUNIT_EXPECT_EQ(test, 800, admin.last_used_addr);
1849
1850	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 400, 6, 792);
1851	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 789);
1852	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 200, 2, 786);
1853
1854	test_init_rule_deletion();
1855	ret = vcap_del_rule(&test_vctrl, &test_netdev, 400);
1856	KUNIT_EXPECT_EQ(test, 0, ret);
1857	KUNIT_EXPECT_EQ(test, 786, test_move_addr);
1858	KUNIT_EXPECT_EQ(test, -8, test_move_offset);
1859	KUNIT_EXPECT_EQ(test, 6, test_move_count);
1860	KUNIT_EXPECT_EQ(test, 786, test_init_start);
1861	KUNIT_EXPECT_EQ(test, 8, test_init_count);
1862	KUNIT_EXPECT_EQ(test, 794, admin.last_used_addr);
1863
1864	vcap_del_rule(&test_vctrl, &test_netdev, 200);
1865	vcap_del_rule(&test_vctrl, &test_netdev, 300);
1866}
1867
1868static struct kunit_case vcap_api_rule_remove_test_cases[] = {
1869	KUNIT_CASE(vcap_api_rule_remove_at_end_test),
1870	KUNIT_CASE(vcap_api_rule_remove_in_middle_test),
1871	KUNIT_CASE(vcap_api_rule_remove_in_front_test),
1872	{}
1873};
1874
1875static void vcap_api_next_lookup_basic_test(struct kunit *test)
1876{
1877	struct vcap_admin admin1 = {
1878		.vtype = VCAP_TYPE_IS2,
1879		.vinst = 0,
1880		.first_cid = 8000000,
1881		.last_cid = 8199999,
1882		.lookups = 4,
1883		.lookups_per_instance = 2,
1884	};
1885	struct vcap_admin admin2 = {
1886		.vtype = VCAP_TYPE_IS2,
1887		.vinst = 1,
1888		.first_cid = 8200000,
1889		.last_cid = 8399999,
1890		.lookups = 4,
1891		.lookups_per_instance = 2,
1892	};
1893	bool ret;
1894
1895	vcap_test_api_init(&admin1);
1896	list_add_tail(&admin2.list, &test_vctrl.list);
1897
1898	ret = vcap_is_next_lookup(&test_vctrl, 8000000, 1001000);
1899	KUNIT_EXPECT_EQ(test, false, ret);
1900	ret = vcap_is_next_lookup(&test_vctrl, 8000000, 8001000);
1901	KUNIT_EXPECT_EQ(test, false, ret);
1902	ret = vcap_is_next_lookup(&test_vctrl, 8000000, 8101000);
1903	KUNIT_EXPECT_EQ(test, true, ret);
1904
1905	ret = vcap_is_next_lookup(&test_vctrl, 8100000, 8101000);
1906	KUNIT_EXPECT_EQ(test, false, ret);
1907	ret = vcap_is_next_lookup(&test_vctrl, 8100000, 8201000);
1908	KUNIT_EXPECT_EQ(test, true, ret);
1909
1910	ret = vcap_is_next_lookup(&test_vctrl, 8200000, 8201000);
1911	KUNIT_EXPECT_EQ(test, false, ret);
1912	ret = vcap_is_next_lookup(&test_vctrl, 8200000, 8301000);
1913	KUNIT_EXPECT_EQ(test, true, ret);
1914
1915	ret = vcap_is_next_lookup(&test_vctrl, 8300000, 8301000);
1916	KUNIT_EXPECT_EQ(test, false, ret);
1917	ret = vcap_is_next_lookup(&test_vctrl, 8300000, 8401000);
1918	KUNIT_EXPECT_EQ(test, false, ret);
1919}
1920
1921static void vcap_api_next_lookup_advanced_test(struct kunit *test)
1922{
1923	struct vcap_admin admin[] = {
1924	{
1925		.vtype = VCAP_TYPE_IS0,
1926		.vinst = 0,
1927		.first_cid = 1000000,
1928		.last_cid =  1199999,
1929		.lookups = 6,
1930		.lookups_per_instance = 2,
1931	}, {
 
1932		.vtype = VCAP_TYPE_IS0,
1933		.vinst = 1,
1934		.first_cid = 1200000,
1935		.last_cid =  1399999,
1936		.lookups = 6,
1937		.lookups_per_instance = 2,
1938	}, {
 
1939		.vtype = VCAP_TYPE_IS0,
1940		.vinst = 2,
1941		.first_cid = 1400000,
1942		.last_cid =  1599999,
1943		.lookups = 6,
1944		.lookups_per_instance = 2,
1945	}, {
 
1946		.vtype = VCAP_TYPE_IS2,
1947		.vinst = 0,
1948		.first_cid = 8000000,
1949		.last_cid = 8199999,
1950		.lookups = 4,
1951		.lookups_per_instance = 2,
1952	}, {
 
1953		.vtype = VCAP_TYPE_IS2,
1954		.vinst = 1,
1955		.first_cid = 8200000,
1956		.last_cid = 8399999,
1957		.lookups = 4,
1958		.lookups_per_instance = 2,
1959	}
1960	};
1961	bool ret;
1962
1963	vcap_test_api_init(&admin[0]);
1964	list_add_tail(&admin[1].list, &test_vctrl.list);
1965	list_add_tail(&admin[2].list, &test_vctrl.list);
1966	list_add_tail(&admin[3].list, &test_vctrl.list);
1967	list_add_tail(&admin[4].list, &test_vctrl.list);
1968
1969	ret = vcap_is_next_lookup(&test_vctrl, 1000000, 1001000);
1970	KUNIT_EXPECT_EQ(test, false, ret);
1971	ret = vcap_is_next_lookup(&test_vctrl, 1000000, 1101000);
1972	KUNIT_EXPECT_EQ(test, true, ret);
1973
1974	ret = vcap_is_next_lookup(&test_vctrl, 1100000, 1201000);
1975	KUNIT_EXPECT_EQ(test, true, ret);
1976	ret = vcap_is_next_lookup(&test_vctrl, 1100000, 1301000);
1977	KUNIT_EXPECT_EQ(test, true, ret);
1978	ret = vcap_is_next_lookup(&test_vctrl, 1100000, 8101000);
1979	KUNIT_EXPECT_EQ(test, true, ret);
1980	ret = vcap_is_next_lookup(&test_vctrl, 1300000, 1401000);
1981	KUNIT_EXPECT_EQ(test, true, ret);
1982	ret = vcap_is_next_lookup(&test_vctrl, 1400000, 1501000);
1983	KUNIT_EXPECT_EQ(test, true, ret);
1984	ret = vcap_is_next_lookup(&test_vctrl, 1500000, 8001000);
1985	KUNIT_EXPECT_EQ(test, true, ret);
1986
1987	ret = vcap_is_next_lookup(&test_vctrl, 8000000, 8001000);
1988	KUNIT_EXPECT_EQ(test, false, ret);
1989	ret = vcap_is_next_lookup(&test_vctrl, 8000000, 8101000);
1990	KUNIT_EXPECT_EQ(test, true, ret);
1991
1992	ret = vcap_is_next_lookup(&test_vctrl, 8300000, 8301000);
1993	KUNIT_EXPECT_EQ(test, false, ret);
1994	ret = vcap_is_next_lookup(&test_vctrl, 8300000, 8401000);
1995	KUNIT_EXPECT_EQ(test, false, ret);
1996}
1997
1998static void vcap_api_filter_unsupported_keys_test(struct kunit *test)
1999{
2000	struct vcap_admin admin = {
2001		.vtype = VCAP_TYPE_IS2,
2002	};
2003	struct vcap_rule_internal ri = {
2004		.admin = &admin,
2005		.vctrl = &test_vctrl,
2006		.data.keyset = VCAP_KFS_MAC_ETYPE,
2007	};
2008	enum vcap_key_field keylist[] = {
2009		VCAP_KF_TYPE,
2010		VCAP_KF_LOOKUP_FIRST_IS,
2011		VCAP_KF_ARP_ADDR_SPACE_OK_IS,  /* arp keys are not in keyset */
2012		VCAP_KF_ARP_PROTO_SPACE_OK_IS,
2013		VCAP_KF_ARP_LEN_OK_IS,
2014		VCAP_KF_ARP_TGT_MATCH_IS,
2015		VCAP_KF_ARP_SENDER_MATCH_IS,
2016		VCAP_KF_ARP_OPCODE_UNKNOWN_IS,
2017		VCAP_KF_ARP_OPCODE,
2018		VCAP_KF_8021Q_DEI_CLS,
2019		VCAP_KF_8021Q_PCP_CLS,
2020		VCAP_KF_8021Q_VID_CLS,
2021		VCAP_KF_L2_MC_IS,
2022		VCAP_KF_L2_BC_IS,
2023	};
2024	enum vcap_key_field expected[] = {
2025		VCAP_KF_TYPE,
2026		VCAP_KF_LOOKUP_FIRST_IS,
2027		VCAP_KF_8021Q_DEI_CLS,
2028		VCAP_KF_8021Q_PCP_CLS,
2029		VCAP_KF_8021Q_VID_CLS,
2030		VCAP_KF_L2_MC_IS,
2031		VCAP_KF_L2_BC_IS,
2032	};
2033	struct vcap_client_keyfield *ckf, *next;
2034	bool ret;
2035	int idx;
2036
2037	/* Add all keys to the rule */
2038	INIT_LIST_HEAD(&ri.data.keyfields);
2039	for (idx = 0; idx < ARRAY_SIZE(keylist); idx++) {
2040		ckf = kzalloc(sizeof(*ckf), GFP_KERNEL);
2041		if (ckf) {
2042			ckf->ctrl.key = keylist[idx];
2043			list_add_tail(&ckf->ctrl.list, &ri.data.keyfields);
2044		}
2045	}
2046
2047	KUNIT_EXPECT_EQ(test, 14, ARRAY_SIZE(keylist));
2048
2049	/* Drop unsupported keys from the rule */
2050	ret = vcap_filter_rule_keys(&ri.data, NULL, 0, true);
2051
2052	KUNIT_EXPECT_EQ(test, 0, ret);
2053
2054	/* Check remaining keys in the rule */
2055	idx = 0;
2056	list_for_each_entry_safe(ckf, next, &ri.data.keyfields, ctrl.list) {
2057		KUNIT_EXPECT_EQ(test, expected[idx], ckf->ctrl.key);
2058		list_del(&ckf->ctrl.list);
2059		kfree(ckf);
2060		++idx;
2061	}
2062	KUNIT_EXPECT_EQ(test, 7, idx);
2063}
2064
2065static void vcap_api_filter_keylist_test(struct kunit *test)
2066{
2067	struct vcap_admin admin = {
2068		.vtype = VCAP_TYPE_IS0,
2069	};
2070	struct vcap_rule_internal ri = {
2071		.admin = &admin,
2072		.vctrl = &test_vctrl,
2073		.data.keyset = VCAP_KFS_NORMAL_7TUPLE,
2074	};
2075	enum vcap_key_field keylist[] = {
2076		VCAP_KF_TYPE,
2077		VCAP_KF_LOOKUP_FIRST_IS,
2078		VCAP_KF_LOOKUP_GEN_IDX_SEL,
2079		VCAP_KF_LOOKUP_GEN_IDX,
2080		VCAP_KF_IF_IGR_PORT_MASK_SEL,
2081		VCAP_KF_IF_IGR_PORT_MASK,
2082		VCAP_KF_L2_MC_IS,
2083		VCAP_KF_L2_BC_IS,
2084		VCAP_KF_8021Q_VLAN_TAGS,
2085		VCAP_KF_8021Q_TPID0,
2086		VCAP_KF_8021Q_PCP0,
2087		VCAP_KF_8021Q_DEI0,
2088		VCAP_KF_8021Q_VID0,
2089		VCAP_KF_8021Q_TPID1,
2090		VCAP_KF_8021Q_PCP1,
2091		VCAP_KF_8021Q_DEI1,
2092		VCAP_KF_8021Q_VID1,
2093		VCAP_KF_8021Q_TPID2,
2094		VCAP_KF_8021Q_PCP2,
2095		VCAP_KF_8021Q_DEI2,
2096		VCAP_KF_8021Q_VID2,
2097		VCAP_KF_L2_DMAC,
2098		VCAP_KF_L2_SMAC,
2099		VCAP_KF_IP_MC_IS,
2100		VCAP_KF_ETYPE_LEN_IS,
2101		VCAP_KF_ETYPE,
2102		VCAP_KF_IP_SNAP_IS,
2103		VCAP_KF_IP4_IS,
2104		VCAP_KF_L3_FRAGMENT_TYPE,
2105		VCAP_KF_L3_FRAG_INVLD_L4_LEN,
2106		VCAP_KF_L3_OPTIONS_IS,
2107		VCAP_KF_L3_DSCP,
2108		VCAP_KF_L3_IP6_DIP,
2109		VCAP_KF_L3_IP6_SIP,
2110		VCAP_KF_TCP_UDP_IS,
2111		VCAP_KF_TCP_IS,
2112		VCAP_KF_L4_SPORT,
2113		VCAP_KF_L4_RNG,
2114	};
2115	enum vcap_key_field droplist[] = {
2116		VCAP_KF_8021Q_TPID1,
2117		VCAP_KF_8021Q_PCP1,
2118		VCAP_KF_8021Q_DEI1,
2119		VCAP_KF_8021Q_VID1,
2120		VCAP_KF_8021Q_TPID2,
2121		VCAP_KF_8021Q_PCP2,
2122		VCAP_KF_8021Q_DEI2,
2123		VCAP_KF_8021Q_VID2,
2124		VCAP_KF_L3_IP6_DIP,
2125		VCAP_KF_L3_IP6_SIP,
2126		VCAP_KF_L4_SPORT,
2127		VCAP_KF_L4_RNG,
2128	};
2129	enum vcap_key_field expected[] = {
2130		VCAP_KF_TYPE,
2131		VCAP_KF_LOOKUP_FIRST_IS,
2132		VCAP_KF_LOOKUP_GEN_IDX_SEL,
2133		VCAP_KF_LOOKUP_GEN_IDX,
2134		VCAP_KF_IF_IGR_PORT_MASK_SEL,
2135		VCAP_KF_IF_IGR_PORT_MASK,
2136		VCAP_KF_L2_MC_IS,
2137		VCAP_KF_L2_BC_IS,
2138		VCAP_KF_8021Q_VLAN_TAGS,
2139		VCAP_KF_8021Q_TPID0,
2140		VCAP_KF_8021Q_PCP0,
2141		VCAP_KF_8021Q_DEI0,
2142		VCAP_KF_8021Q_VID0,
2143		VCAP_KF_L2_DMAC,
2144		VCAP_KF_L2_SMAC,
2145		VCAP_KF_IP_MC_IS,
2146		VCAP_KF_ETYPE_LEN_IS,
2147		VCAP_KF_ETYPE,
2148		VCAP_KF_IP_SNAP_IS,
2149		VCAP_KF_IP4_IS,
2150		VCAP_KF_L3_FRAGMENT_TYPE,
2151		VCAP_KF_L3_FRAG_INVLD_L4_LEN,
2152		VCAP_KF_L3_OPTIONS_IS,
2153		VCAP_KF_L3_DSCP,
2154		VCAP_KF_TCP_UDP_IS,
2155		VCAP_KF_TCP_IS,
2156	};
2157	struct vcap_client_keyfield *ckf, *next;
2158	bool ret;
2159	int idx;
2160
2161	/* Add all keys to the rule */
2162	INIT_LIST_HEAD(&ri.data.keyfields);
2163	for (idx = 0; idx < ARRAY_SIZE(keylist); idx++) {
2164		ckf = kzalloc(sizeof(*ckf), GFP_KERNEL);
2165		if (ckf) {
2166			ckf->ctrl.key = keylist[idx];
2167			list_add_tail(&ckf->ctrl.list, &ri.data.keyfields);
2168		}
2169	}
2170
2171	KUNIT_EXPECT_EQ(test, 38, ARRAY_SIZE(keylist));
2172
2173	/* Drop listed keys from the rule */
2174	ret = vcap_filter_rule_keys(&ri.data, droplist, ARRAY_SIZE(droplist),
2175				    false);
2176
2177	KUNIT_EXPECT_EQ(test, 0, ret);
2178
2179	/* Check remaining keys in the rule */
2180	idx = 0;
2181	list_for_each_entry_safe(ckf, next, &ri.data.keyfields, ctrl.list) {
2182		KUNIT_EXPECT_EQ(test, expected[idx], ckf->ctrl.key);
2183		list_del(&ckf->ctrl.list);
2184		kfree(ckf);
2185		++idx;
2186	}
2187	KUNIT_EXPECT_EQ(test, 26, idx);
2188}
2189
2190static void vcap_api_rule_chain_path_test(struct kunit *test)
2191{
2192	struct vcap_admin admin1 = {
2193		.vtype = VCAP_TYPE_IS0,
2194		.vinst = 0,
2195		.first_cid = 1000000,
2196		.last_cid =  1199999,
2197		.lookups = 6,
2198		.lookups_per_instance = 2,
2199	};
2200	struct vcap_enabled_port eport3 = {
2201		.ndev = &test_netdev,
2202		.cookie = 0x100,
2203		.src_cid = 0,
2204		.dst_cid = 1000000,
2205	};
2206	struct vcap_enabled_port eport2 = {
2207		.ndev = &test_netdev,
2208		.cookie = 0x200,
2209		.src_cid = 1000000,
2210		.dst_cid = 1100000,
2211	};
2212	struct vcap_enabled_port eport1 = {
2213		.ndev = &test_netdev,
2214		.cookie = 0x300,
2215		.src_cid = 1100000,
2216		.dst_cid = 8000000,
2217	};
2218	bool ret;
2219	int chain;
2220
2221	vcap_test_api_init(&admin1);
2222	list_add_tail(&eport1.list, &admin1.enabled);
2223	list_add_tail(&eport2.list, &admin1.enabled);
2224	list_add_tail(&eport3.list, &admin1.enabled);
2225
2226	ret = vcap_path_exist(&test_vctrl, &test_netdev, 1000000);
2227	KUNIT_EXPECT_EQ(test, true, ret);
2228
2229	ret = vcap_path_exist(&test_vctrl, &test_netdev, 1100000);
2230	KUNIT_EXPECT_EQ(test, true, ret);
2231
2232	ret = vcap_path_exist(&test_vctrl, &test_netdev, 1200000);
2233	KUNIT_EXPECT_EQ(test, false, ret);
2234
2235	chain = vcap_get_next_chain(&test_vctrl, &test_netdev, 0);
2236	KUNIT_EXPECT_EQ(test, 1000000, chain);
2237
2238	chain = vcap_get_next_chain(&test_vctrl, &test_netdev, 1000000);
2239	KUNIT_EXPECT_EQ(test, 1100000, chain);
2240
2241	chain = vcap_get_next_chain(&test_vctrl, &test_netdev, 1100000);
2242	KUNIT_EXPECT_EQ(test, 8000000, chain);
2243}
2244
2245static struct kunit_case vcap_api_rule_enable_test_cases[] = {
2246	KUNIT_CASE(vcap_api_rule_chain_path_test),
2247	{}
2248};
2249
2250static struct kunit_suite vcap_api_rule_enable_test_suite = {
2251	.name = "VCAP_API_Rule_Enable_Testsuite",
2252	.test_cases = vcap_api_rule_enable_test_cases,
2253};
2254
2255static struct kunit_suite vcap_api_rule_remove_test_suite = {
2256	.name = "VCAP_API_Rule_Remove_Testsuite",
2257	.test_cases = vcap_api_rule_remove_test_cases,
2258};
2259
2260static struct kunit_case vcap_api_rule_insert_test_cases[] = {
2261	KUNIT_CASE(vcap_api_rule_insert_in_order_test),
2262	KUNIT_CASE(vcap_api_rule_insert_reverse_order_test),
2263	{}
2264};
2265
2266static struct kunit_suite vcap_api_rule_insert_test_suite = {
2267	.name = "VCAP_API_Rule_Insert_Testsuite",
2268	.test_cases = vcap_api_rule_insert_test_cases,
2269};
2270
2271static struct kunit_case vcap_api_rule_counter_test_cases[] = {
2272	KUNIT_CASE(vcap_api_set_rule_counter_test),
2273	KUNIT_CASE(vcap_api_get_rule_counter_test),
2274	{}
2275};
2276
2277static struct kunit_suite vcap_api_rule_counter_test_suite = {
2278	.name = "VCAP_API_Rule_Counter_Testsuite",
2279	.test_cases = vcap_api_rule_counter_test_cases,
2280};
2281
2282static struct kunit_case vcap_api_support_test_cases[] = {
2283	KUNIT_CASE(vcap_api_next_lookup_basic_test),
2284	KUNIT_CASE(vcap_api_next_lookup_advanced_test),
2285	KUNIT_CASE(vcap_api_filter_unsupported_keys_test),
2286	KUNIT_CASE(vcap_api_filter_keylist_test),
2287	{}
2288};
2289
2290static struct kunit_suite vcap_api_support_test_suite = {
2291	.name = "VCAP_API_Support_Testsuite",
2292	.test_cases = vcap_api_support_test_cases,
2293};
2294
2295static struct kunit_case vcap_api_full_rule_test_cases[] = {
2296	KUNIT_CASE(vcap_api_rule_find_keyset_basic_test),
2297	KUNIT_CASE(vcap_api_rule_find_keyset_failed_test),
2298	KUNIT_CASE(vcap_api_rule_find_keyset_many_test),
2299	KUNIT_CASE(vcap_api_encode_rule_test),
2300	{}
2301};
2302
2303static struct kunit_suite vcap_api_full_rule_test_suite = {
2304	.name = "VCAP_API_Full_Rule_Testsuite",
2305	.test_cases = vcap_api_full_rule_test_cases,
2306};
2307
2308static struct kunit_case vcap_api_rule_value_test_cases[] = {
2309	KUNIT_CASE(vcap_api_rule_add_keyvalue_test),
2310	KUNIT_CASE(vcap_api_rule_add_actionvalue_test),
2311	{}
2312};
2313
2314static struct kunit_suite vcap_api_rule_value_test_suite = {
2315	.name = "VCAP_API_Rule_Value_Testsuite",
2316	.test_cases = vcap_api_rule_value_test_cases,
2317};
2318
2319static struct kunit_case vcap_api_encoding_test_cases[] = {
2320	KUNIT_CASE(vcap_api_set_bit_1_test),
2321	KUNIT_CASE(vcap_api_set_bit_0_test),
2322	KUNIT_CASE(vcap_api_iterator_init_test),
2323	KUNIT_CASE(vcap_api_iterator_next_test),
2324	KUNIT_CASE(vcap_api_encode_typegroups_test),
2325	KUNIT_CASE(vcap_api_encode_bit_test),
2326	KUNIT_CASE(vcap_api_encode_field_test),
2327	KUNIT_CASE(vcap_api_encode_short_field_test),
2328	KUNIT_CASE(vcap_api_encode_keyfield_test),
2329	KUNIT_CASE(vcap_api_encode_max_keyfield_test),
2330	KUNIT_CASE(vcap_api_encode_actionfield_test),
2331	KUNIT_CASE(vcap_api_keyfield_typegroup_test),
2332	KUNIT_CASE(vcap_api_actionfield_typegroup_test),
2333	KUNIT_CASE(vcap_api_vcap_keyfields_test),
2334	KUNIT_CASE(vcap_api_vcap_actionfields_test),
2335	KUNIT_CASE(vcap_api_encode_rule_keyset_test),
2336	KUNIT_CASE(vcap_api_encode_rule_actionset_test),
2337	{}
2338};
2339
2340static struct kunit_suite vcap_api_encoding_test_suite = {
2341	.name = "VCAP_API_Encoding_Testsuite",
2342	.test_cases = vcap_api_encoding_test_cases,
2343};
2344
2345kunit_test_suite(vcap_api_rule_enable_test_suite);
2346kunit_test_suite(vcap_api_rule_remove_test_suite);
2347kunit_test_suite(vcap_api_rule_insert_test_suite);
2348kunit_test_suite(vcap_api_rule_counter_test_suite);
2349kunit_test_suite(vcap_api_support_test_suite);
2350kunit_test_suite(vcap_api_full_rule_test_suite);
2351kunit_test_suite(vcap_api_rule_value_test_suite);
2352kunit_test_suite(vcap_api_encoding_test_suite);
v6.2
   1// SPDX-License-Identifier: BSD-3-Clause
   2/* Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries.
   3 * Microchip VCAP API kunit test suite
   4 */
   5
   6#include <kunit/test.h>
   7#include "vcap_api.h"
   8#include "vcap_api_client.h"
   9#include "vcap_model_kunit.h"
  10
  11/* First we have the test infrastructure that emulates the platform
  12 * implementation
  13 */
  14#define TEST_BUF_CNT 100
  15#define TEST_BUF_SZ  350
  16#define STREAMWSIZE 64
  17
  18static u32 test_updateaddr[STREAMWSIZE] = {};
  19static int test_updateaddridx;
  20static int test_cache_erase_count;
  21static u32 test_init_start;
  22static u32 test_init_count;
  23static u32 test_hw_counter_id;
  24static struct vcap_cache_data test_hw_cache;
  25static struct net_device test_netdev = {};
  26static int test_move_addr;
  27static int test_move_offset;
  28static int test_move_count;
  29
  30/* Callback used by the VCAP API */
  31static enum vcap_keyfield_set test_val_keyset(struct net_device *ndev,
  32					      struct vcap_admin *admin,
  33					      struct vcap_rule *rule,
  34					      struct vcap_keyset_list *kslist,
  35					      u16 l3_proto)
  36{
  37	int idx;
  38
  39	if (kslist->cnt > 0) {
  40		switch (admin->vtype) {
  41		case VCAP_TYPE_IS0:
  42			for (idx = 0; idx < kslist->cnt; idx++) {
  43				if (kslist->keysets[idx] == VCAP_KFS_ETAG)
  44					return kslist->keysets[idx];
  45				if (kslist->keysets[idx] == VCAP_KFS_PURE_5TUPLE_IP4)
  46					return kslist->keysets[idx];
  47				if (kslist->keysets[idx] == VCAP_KFS_NORMAL_5TUPLE_IP4)
  48					return kslist->keysets[idx];
  49				if (kslist->keysets[idx] == VCAP_KFS_NORMAL_7TUPLE)
  50					return kslist->keysets[idx];
  51			}
  52			break;
  53		case VCAP_TYPE_IS2:
  54			for (idx = 0; idx < kslist->cnt; idx++) {
  55				if (kslist->keysets[idx] == VCAP_KFS_MAC_ETYPE)
  56					return kslist->keysets[idx];
  57				if (kslist->keysets[idx] == VCAP_KFS_ARP)
  58					return kslist->keysets[idx];
  59				if (kslist->keysets[idx] == VCAP_KFS_IP_7TUPLE)
  60					return kslist->keysets[idx];
  61			}
  62			break;
  63		default:
  64			pr_info("%s:%d: no validation for VCAP %d\n",
  65				__func__, __LINE__, admin->vtype);
  66			break;
  67		}
  68	}
  69	return -EINVAL;
  70}
  71
  72/* Callback used by the VCAP API */
  73static void test_add_def_fields(struct net_device *ndev,
  74				struct vcap_admin *admin,
  75				struct vcap_rule *rule)
  76{
  77	if (admin->vinst == 0 || admin->vinst == 2)
  78		vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS, VCAP_BIT_1);
  79	else
  80		vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS, VCAP_BIT_0);
  81}
  82
  83/* Callback used by the VCAP API */
  84static void test_cache_erase(struct vcap_admin *admin)
  85{
  86	if (test_cache_erase_count) {
  87		memset(admin->cache.keystream, 0, test_cache_erase_count);
  88		memset(admin->cache.maskstream, 0, test_cache_erase_count);
  89		memset(admin->cache.actionstream, 0, test_cache_erase_count);
  90		test_cache_erase_count = 0;
  91	}
  92}
  93
  94/* Callback used by the VCAP API */
  95static void test_cache_init(struct net_device *ndev, struct vcap_admin *admin,
  96			    u32 start, u32 count)
  97{
  98	test_init_start = start;
  99	test_init_count = count;
 100}
 101
 102/* Callback used by the VCAP API */
 103static void test_cache_read(struct net_device *ndev, struct vcap_admin *admin,
 104			    enum vcap_selection sel, u32 start, u32 count)
 105{
 106	u32 *keystr, *mskstr, *actstr;
 107	int idx;
 108
 109	pr_debug("%s:%d: %d %d\n", __func__, __LINE__, start, count);
 110	switch (sel) {
 111	case VCAP_SEL_ENTRY:
 112		keystr = &admin->cache.keystream[start];
 113		mskstr = &admin->cache.maskstream[start];
 114		for (idx = 0; idx < count; ++idx) {
 115			pr_debug("%s:%d: keydata[%02d]: 0x%08x\n", __func__,
 116				 __LINE__, start + idx, keystr[idx]);
 117		}
 118		for (idx = 0; idx < count; ++idx) {
 119			/* Invert the mask before decoding starts */
 120			mskstr[idx] = ~mskstr[idx];
 121			pr_debug("%s:%d: mskdata[%02d]: 0x%08x\n", __func__,
 122				 __LINE__, start + idx, mskstr[idx]);
 123		}
 124		break;
 125	case VCAP_SEL_ACTION:
 126		actstr = &admin->cache.actionstream[start];
 127		for (idx = 0; idx < count; ++idx) {
 128			pr_debug("%s:%d: actdata[%02d]: 0x%08x\n", __func__,
 129				 __LINE__, start + idx, actstr[idx]);
 130		}
 131		break;
 132	case VCAP_SEL_COUNTER:
 133		pr_debug("%s:%d\n", __func__, __LINE__);
 134		test_hw_counter_id = start;
 135		admin->cache.counter = test_hw_cache.counter;
 136		admin->cache.sticky = test_hw_cache.sticky;
 137		break;
 138	case VCAP_SEL_ALL:
 139		pr_debug("%s:%d\n", __func__, __LINE__);
 140		break;
 141	}
 142}
 143
 144/* Callback used by the VCAP API */
 145static void test_cache_write(struct net_device *ndev, struct vcap_admin *admin,
 146			     enum vcap_selection sel, u32 start, u32 count)
 147{
 148	u32 *keystr, *mskstr, *actstr;
 149	int idx;
 150
 151	switch (sel) {
 152	case VCAP_SEL_ENTRY:
 153		keystr = &admin->cache.keystream[start];
 154		mskstr = &admin->cache.maskstream[start];
 155		for (idx = 0; idx < count; ++idx) {
 156			pr_debug("%s:%d: keydata[%02d]: 0x%08x\n", __func__,
 157				 __LINE__, start + idx, keystr[idx]);
 158		}
 159		for (idx = 0; idx < count; ++idx) {
 160			/* Invert the mask before encoding starts */
 161			mskstr[idx] = ~mskstr[idx];
 162			pr_debug("%s:%d: mskdata[%02d]: 0x%08x\n", __func__,
 163				 __LINE__, start + idx, mskstr[idx]);
 164		}
 165		break;
 166	case VCAP_SEL_ACTION:
 167		actstr = &admin->cache.actionstream[start];
 168		for (idx = 0; idx < count; ++idx) {
 169			pr_debug("%s:%d: actdata[%02d]: 0x%08x\n", __func__,
 170				 __LINE__, start + idx, actstr[idx]);
 171		}
 172		break;
 173	case VCAP_SEL_COUNTER:
 174		pr_debug("%s:%d\n", __func__, __LINE__);
 175		test_hw_counter_id = start;
 176		test_hw_cache.counter = admin->cache.counter;
 177		test_hw_cache.sticky = admin->cache.sticky;
 178		break;
 179	case VCAP_SEL_ALL:
 180		pr_err("%s:%d: cannot write all streams at once\n",
 181		       __func__, __LINE__);
 182		break;
 183	}
 184}
 185
 186/* Callback used by the VCAP API */
 187static void test_cache_update(struct net_device *ndev, struct vcap_admin *admin,
 188			      enum vcap_command cmd,
 189			      enum vcap_selection sel, u32 addr)
 190{
 191	if (test_updateaddridx < ARRAY_SIZE(test_updateaddr))
 192		test_updateaddr[test_updateaddridx] = addr;
 193	else
 194		pr_err("%s:%d: overflow: %d\n", __func__, __LINE__, test_updateaddridx);
 195	test_updateaddridx++;
 196}
 197
 198static void test_cache_move(struct net_device *ndev, struct vcap_admin *admin,
 199			    u32 addr, int offset, int count)
 200{
 201	test_move_addr = addr;
 202	test_move_offset = offset;
 203	test_move_count = count;
 204}
 205
 206/* Provide port information via a callback interface */
 207static int vcap_test_port_info(struct net_device *ndev,
 208			       struct vcap_admin *admin,
 209			       struct vcap_output_print *out)
 210{
 211	return 0;
 212}
 213
 214static int vcap_test_enable(struct net_device *ndev,
 215			    struct vcap_admin *admin,
 216			    bool enable)
 217{
 218	return 0;
 219}
 220
 221static struct vcap_operations test_callbacks = {
 222	.validate_keyset = test_val_keyset,
 223	.add_default_fields = test_add_def_fields,
 224	.cache_erase = test_cache_erase,
 225	.cache_write = test_cache_write,
 226	.cache_read = test_cache_read,
 227	.init = test_cache_init,
 228	.update = test_cache_update,
 229	.move = test_cache_move,
 230	.port_info = vcap_test_port_info,
 231	.enable = vcap_test_enable,
 232};
 233
 234static struct vcap_control test_vctrl = {
 235	.vcaps = kunit_test_vcaps,
 236	.stats = &kunit_test_vcap_stats,
 237	.ops = &test_callbacks,
 238};
 239
 240static void vcap_test_api_init(struct vcap_admin *admin)
 241{
 242	/* Initialize the shared objects */
 243	INIT_LIST_HEAD(&test_vctrl.list);
 244	INIT_LIST_HEAD(&admin->list);
 245	INIT_LIST_HEAD(&admin->rules);
 
 
 246	list_add_tail(&admin->list, &test_vctrl.list);
 247	memset(test_updateaddr, 0, sizeof(test_updateaddr));
 248	test_updateaddridx = 0;
 249}
 250
 251/* Helper function to create a rule of a specific size */
 252static struct vcap_rule *
 253test_vcap_xn_rule_creator(struct kunit *test, int cid, enum vcap_user user,
 254			  u16 priority,
 255			  int id, int size, int expected_addr)
 256{
 257	struct vcap_rule *rule;
 258	struct vcap_rule_internal *ri;
 259	enum vcap_keyfield_set keyset = VCAP_KFS_NO_VALUE;
 260	enum vcap_actionfield_set actionset = VCAP_AFS_NO_VALUE;
 261	int ret;
 262
 263	/* init before testing */
 264	memset(test_updateaddr, 0, sizeof(test_updateaddr));
 265	test_updateaddridx = 0;
 266	test_move_addr = 0;
 267	test_move_offset = 0;
 268	test_move_count = 0;
 269
 270	switch (size) {
 271	case 2:
 272		keyset = VCAP_KFS_ETAG;
 273		actionset = VCAP_AFS_CLASS_REDUCED;
 274		break;
 275	case 3:
 276		keyset = VCAP_KFS_PURE_5TUPLE_IP4;
 277		actionset = VCAP_AFS_CLASSIFICATION;
 278		break;
 279	case 6:
 280		keyset = VCAP_KFS_NORMAL_5TUPLE_IP4;
 281		actionset = VCAP_AFS_CLASSIFICATION;
 282		break;
 283	case 12:
 284		keyset = VCAP_KFS_NORMAL_7TUPLE;
 285		actionset = VCAP_AFS_FULL;
 286		break;
 287	default:
 288		break;
 289	}
 290
 291	/* Check that a valid size was used */
 292	KUNIT_ASSERT_NE(test, VCAP_KFS_NO_VALUE, keyset);
 293
 294	/* Allocate the rule */
 295	rule = vcap_alloc_rule(&test_vctrl, &test_netdev, cid, user, priority,
 296			       id);
 297	KUNIT_EXPECT_PTR_NE(test, NULL, rule);
 298
 299	ri = (struct vcap_rule_internal *)rule;
 300
 301	/* Override rule keyset */
 302	ret = vcap_set_rule_set_keyset(rule, keyset);
 303
 304	/* Add rule actions : there must be at least one action */
 305	ret = vcap_rule_add_action_u32(rule, VCAP_AF_COSID_VAL, 0);
 306
 307	/* Override rule actionset */
 308	ret = vcap_set_rule_set_actionset(rule, actionset);
 309
 310	ret = vcap_val_rule(rule, ETH_P_ALL);
 311	KUNIT_EXPECT_EQ(test, 0, ret);
 312	KUNIT_EXPECT_EQ(test, keyset, rule->keyset);
 313	KUNIT_EXPECT_EQ(test, actionset, rule->actionset);
 314	KUNIT_EXPECT_EQ(test, size, ri->size);
 315
 316	/* Add rule with write callback */
 317	ret = vcap_add_rule(rule);
 318	KUNIT_EXPECT_EQ(test, 0, ret);
 319	KUNIT_EXPECT_EQ(test, expected_addr, ri->addr);
 320	return rule;
 321}
 322
 323/* Prepare testing rule deletion */
 324static void test_init_rule_deletion(void)
 325{
 326	test_move_addr = 0;
 327	test_move_offset = 0;
 328	test_move_count = 0;
 329	test_init_start = 0;
 330	test_init_count = 0;
 331}
 332
 333/* Define the test cases. */
 334
 335static void vcap_api_set_bit_1_test(struct kunit *test)
 336{
 337	struct vcap_stream_iter iter = {
 338		.offset = 35,
 339		.sw_width = 52,
 340		.reg_idx = 1,
 341		.reg_bitpos = 20,
 342		.tg = NULL,
 343	};
 344	u32 stream[2] = {0};
 345
 346	vcap_set_bit(stream, &iter, 1);
 347
 348	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[0]);
 349	KUNIT_EXPECT_EQ(test, (u32)BIT(20), stream[1]);
 350}
 351
 352static void vcap_api_set_bit_0_test(struct kunit *test)
 353{
 354	struct vcap_stream_iter iter = {
 355		.offset = 35,
 356		.sw_width = 52,
 357		.reg_idx = 2,
 358		.reg_bitpos = 11,
 359		.tg = NULL,
 360	};
 361	u32 stream[3] = {~0, ~0, ~0};
 362
 363	vcap_set_bit(stream, &iter, 0);
 364
 365	KUNIT_EXPECT_EQ(test, (u32)~0, stream[0]);
 366	KUNIT_EXPECT_EQ(test, (u32)~0, stream[1]);
 367	KUNIT_EXPECT_EQ(test, (u32)~BIT(11), stream[2]);
 368}
 369
 370static void vcap_api_iterator_init_test(struct kunit *test)
 371{
 372	struct vcap_stream_iter iter;
 373	struct vcap_typegroup typegroups[] = {
 374		{ .offset = 0, .width = 2, .value = 2, },
 375		{ .offset = 156, .width = 1, .value = 0, },
 376		{ .offset = 0, .width = 0, .value = 0, },
 377	};
 378	struct vcap_typegroup typegroups2[] = {
 379		{ .offset = 0, .width = 3, .value = 4, },
 380		{ .offset = 49, .width = 2, .value = 0, },
 381		{ .offset = 98, .width = 2, .value = 0, },
 
 382	};
 383
 384	vcap_iter_init(&iter, 52, typegroups, 86);
 385
 386	KUNIT_EXPECT_EQ(test, 52, iter.sw_width);
 387	KUNIT_EXPECT_EQ(test, 86 + 2, iter.offset);
 388	KUNIT_EXPECT_EQ(test, 3, iter.reg_idx);
 389	KUNIT_EXPECT_EQ(test, 4, iter.reg_bitpos);
 390
 391	vcap_iter_init(&iter, 49, typegroups2, 134);
 392
 393	KUNIT_EXPECT_EQ(test, 49, iter.sw_width);
 394	KUNIT_EXPECT_EQ(test, 134 + 7, iter.offset);
 395	KUNIT_EXPECT_EQ(test, 5, iter.reg_idx);
 396	KUNIT_EXPECT_EQ(test, 11, iter.reg_bitpos);
 397}
 398
 399static void vcap_api_iterator_next_test(struct kunit *test)
 400{
 401	struct vcap_stream_iter iter;
 402	struct vcap_typegroup typegroups[] = {
 403		{ .offset = 0, .width = 4, .value = 8, },
 404		{ .offset = 49, .width = 1, .value = 0, },
 405		{ .offset = 98, .width = 2, .value = 0, },
 406		{ .offset = 147, .width = 3, .value = 0, },
 407		{ .offset = 196, .width = 2, .value = 0, },
 408		{ .offset = 245, .width = 1, .value = 0, },
 
 409	};
 410	int idx;
 411
 412	vcap_iter_init(&iter, 49, typegroups, 86);
 413
 414	KUNIT_EXPECT_EQ(test, 49, iter.sw_width);
 415	KUNIT_EXPECT_EQ(test, 86 + 5, iter.offset);
 416	KUNIT_EXPECT_EQ(test, 3, iter.reg_idx);
 417	KUNIT_EXPECT_EQ(test, 10, iter.reg_bitpos);
 418
 419	vcap_iter_next(&iter);
 420
 421	KUNIT_EXPECT_EQ(test, 91 + 1, iter.offset);
 422	KUNIT_EXPECT_EQ(test, 3, iter.reg_idx);
 423	KUNIT_EXPECT_EQ(test, 11, iter.reg_bitpos);
 424
 425	for (idx = 0; idx < 6; idx++)
 426		vcap_iter_next(&iter);
 427
 428	KUNIT_EXPECT_EQ(test, 92 + 6 + 2, iter.offset);
 429	KUNIT_EXPECT_EQ(test, 4, iter.reg_idx);
 430	KUNIT_EXPECT_EQ(test, 2, iter.reg_bitpos);
 431}
 432
 433static void vcap_api_encode_typegroups_test(struct kunit *test)
 434{
 435	u32 stream[12] = {0};
 436	struct vcap_typegroup typegroups[] = {
 437		{ .offset = 0, .width = 4, .value = 8, },
 438		{ .offset = 49, .width = 1, .value = 1, },
 439		{ .offset = 98, .width = 2, .value = 3, },
 440		{ .offset = 147, .width = 3, .value = 5, },
 441		{ .offset = 196, .width = 2, .value = 2, },
 442		{ .offset = 245, .width = 5, .value = 27, },
 443		{ .offset = 0, .width = 0, .value = 0, },
 444	};
 445
 446	vcap_encode_typegroups(stream, 49, typegroups, false);
 447
 448	KUNIT_EXPECT_EQ(test, (u32)0x8, stream[0]);
 449	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[1]);
 450	KUNIT_EXPECT_EQ(test, (u32)0x1, stream[2]);
 451	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[3]);
 452	KUNIT_EXPECT_EQ(test, (u32)0x3, stream[4]);
 453	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[5]);
 454	KUNIT_EXPECT_EQ(test, (u32)0x5, stream[6]);
 455	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[7]);
 456	KUNIT_EXPECT_EQ(test, (u32)0x2, stream[8]);
 457	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[9]);
 458	KUNIT_EXPECT_EQ(test, (u32)27, stream[10]);
 459	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[11]);
 460}
 461
 462static void vcap_api_encode_bit_test(struct kunit *test)
 463{
 464	struct vcap_stream_iter iter;
 465	u32 stream[4] = {0};
 466	struct vcap_typegroup typegroups[] = {
 467		{ .offset = 0, .width = 4, .value = 8, },
 468		{ .offset = 49, .width = 1, .value = 1, },
 469		{ .offset = 98, .width = 2, .value = 3, },
 470		{ .offset = 147, .width = 3, .value = 5, },
 471		{ .offset = 196, .width = 2, .value = 2, },
 472		{ .offset = 245, .width = 1, .value = 0, },
 
 473	};
 474
 475	vcap_iter_init(&iter, 49, typegroups, 44);
 476
 477	KUNIT_EXPECT_EQ(test, 48, iter.offset);
 478	KUNIT_EXPECT_EQ(test, 1, iter.reg_idx);
 479	KUNIT_EXPECT_EQ(test, 16, iter.reg_bitpos);
 480
 481	vcap_encode_bit(stream, &iter, 1);
 482
 483	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[0]);
 484	KUNIT_EXPECT_EQ(test, (u32)BIT(16), stream[1]);
 485	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[2]);
 486}
 487
 488static void vcap_api_encode_field_test(struct kunit *test)
 489{
 490	struct vcap_stream_iter iter;
 491	u32 stream[16] = {0};
 492	struct vcap_typegroup typegroups[] = {
 493		{ .offset = 0, .width = 4, .value = 8, },
 494		{ .offset = 49, .width = 1, .value = 1, },
 495		{ .offset = 98, .width = 2, .value = 3, },
 496		{ .offset = 147, .width = 3, .value = 5, },
 497		{ .offset = 196, .width = 2, .value = 2, },
 498		{ .offset = 245, .width = 5, .value = 27, },
 499		{ .offset = 0, .width = 0, .value = 0, },
 500	};
 501	struct vcap_field rf = {
 502		.type = VCAP_FIELD_U32,
 503		.offset = 86,
 504		.width = 4,
 505	};
 506	u8 value[] = {0x5};
 507
 508	vcap_iter_init(&iter, 49, typegroups, rf.offset);
 509
 510	KUNIT_EXPECT_EQ(test, 91, iter.offset);
 511	KUNIT_EXPECT_EQ(test, 3, iter.reg_idx);
 512	KUNIT_EXPECT_EQ(test, 10, iter.reg_bitpos);
 513
 514	vcap_encode_field(stream, &iter, rf.width, value);
 515
 516	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[0]);
 517	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[1]);
 518	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[2]);
 519	KUNIT_EXPECT_EQ(test, (u32)(0x5 << 10), stream[3]);
 520	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[4]);
 521
 522	vcap_encode_typegroups(stream, 49, typegroups, false);
 523
 524	KUNIT_EXPECT_EQ(test, (u32)0x8, stream[0]);
 525	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[1]);
 526	KUNIT_EXPECT_EQ(test, (u32)0x1, stream[2]);
 527	KUNIT_EXPECT_EQ(test, (u32)(0x5 << 10), stream[3]);
 528	KUNIT_EXPECT_EQ(test, (u32)0x3, stream[4]);
 529	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[5]);
 530	KUNIT_EXPECT_EQ(test, (u32)0x5, stream[6]);
 531	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[7]);
 532	KUNIT_EXPECT_EQ(test, (u32)0x2, stream[8]);
 533	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[9]);
 534	KUNIT_EXPECT_EQ(test, (u32)27, stream[10]);
 535	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[11]);
 536}
 537
 538/* In this testcase the subword is smaller than a register */
 539static void vcap_api_encode_short_field_test(struct kunit *test)
 540{
 541	struct vcap_stream_iter iter;
 542	int sw_width = 21;
 543	u32 stream[6] = {0};
 544	struct vcap_typegroup tgt[] = {
 545		{ .offset = 0, .width = 3, .value = 7, },
 546		{ .offset = 21, .width = 2, .value = 3, },
 547		{ .offset = 42, .width = 1, .value = 1, },
 548		{ .offset = 0, .width = 0, .value = 0, },
 549	};
 550	struct vcap_field rf = {
 551		.type = VCAP_FIELD_U32,
 552		.offset = 25,
 553		.width = 4,
 554	};
 555	u8 value[] = {0x5};
 556
 557	vcap_iter_init(&iter, sw_width, tgt, rf.offset);
 558
 559	KUNIT_EXPECT_EQ(test, 1, iter.regs_per_sw);
 560	KUNIT_EXPECT_EQ(test, 21, iter.sw_width);
 561	KUNIT_EXPECT_EQ(test, 25 + 3 + 2, iter.offset);
 562	KUNIT_EXPECT_EQ(test, 1, iter.reg_idx);
 563	KUNIT_EXPECT_EQ(test, 25 + 3 + 2 - sw_width, iter.reg_bitpos);
 564
 565	vcap_encode_field(stream, &iter, rf.width, value);
 566
 567	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[0]);
 568	KUNIT_EXPECT_EQ(test, (u32)(0x5 << (25 + 3 + 2 - sw_width)), stream[1]);
 569	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[2]);
 570	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[3]);
 571	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[4]);
 572	KUNIT_EXPECT_EQ(test, (u32)0x0, stream[5]);
 573
 574	vcap_encode_typegroups(stream, sw_width, tgt, false);
 575
 576	KUNIT_EXPECT_EQ(test, (u32)7, stream[0]);
 577	KUNIT_EXPECT_EQ(test, (u32)((0x5 << (25 + 3 + 2 - sw_width)) + 3), stream[1]);
 578	KUNIT_EXPECT_EQ(test, (u32)1, stream[2]);
 579	KUNIT_EXPECT_EQ(test, (u32)0, stream[3]);
 580	KUNIT_EXPECT_EQ(test, (u32)0, stream[4]);
 581	KUNIT_EXPECT_EQ(test, (u32)0, stream[5]);
 582}
 583
 584static void vcap_api_encode_keyfield_test(struct kunit *test)
 585{
 586	u32 keywords[16] = {0};
 587	u32 maskwords[16] = {0};
 588	struct vcap_admin admin = {
 589		.vtype = VCAP_TYPE_IS2,
 590		.cache = {
 591			.keystream = keywords,
 592			.maskstream = maskwords,
 593			.actionstream = keywords,
 594		},
 595	};
 596	struct vcap_rule_internal rule = {
 597		.admin = &admin,
 598		.data = {
 599			.keyset = VCAP_KFS_MAC_ETYPE,
 600		},
 601		.vctrl = &test_vctrl,
 602	};
 603	struct vcap_client_keyfield ckf = {
 604		.ctrl.list = {},
 605		.ctrl.key = VCAP_KF_ISDX_CLS,
 606		.ctrl.type = VCAP_FIELD_U32,
 607		.data.u32.value = 0xeef014a1,
 608		.data.u32.mask = 0xfff,
 609	};
 610	struct vcap_field rf = {
 611		.type = VCAP_FIELD_U32,
 612		.offset = 56,
 613		.width = 12,
 614	};
 615	struct vcap_typegroup tgt[] = {
 616		{ .offset = 0, .width = 2, .value = 2, },
 617		{ .offset = 156, .width = 1, .value = 1, },
 618		{ .offset = 0, .width = 0, .value = 0, },
 619	};
 620
 621	vcap_test_api_init(&admin);
 622	vcap_encode_keyfield(&rule, &ckf, &rf, tgt);
 623
 624	/* Key */
 625	KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[0]);
 626	KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[1]);
 627	KUNIT_EXPECT_EQ(test, (u32)(0x04a1 << 6), keywords[2]);
 628	KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[3]);
 629	KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[4]);
 630	KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[5]);
 631	KUNIT_EXPECT_EQ(test, (u32)0x0, keywords[6]);
 632
 633	/* Mask */
 634	KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[0]);
 635	KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[1]);
 636	KUNIT_EXPECT_EQ(test, (u32)(0x0fff << 6), maskwords[2]);
 637	KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[3]);
 638	KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[4]);
 639	KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[5]);
 640	KUNIT_EXPECT_EQ(test, (u32)0x0, maskwords[6]);
 641}
 642
 643static void vcap_api_encode_max_keyfield_test(struct kunit *test)
 644{
 645	int idx;
 646	u32 keywords[6] = {0};
 647	u32 maskwords[6] = {0};
 648	struct vcap_admin admin = {
 649		.vtype = VCAP_TYPE_IS2,
 650		/* IS2 sw_width = 52 bit */
 651		.cache = {
 652			.keystream = keywords,
 653			.maskstream = maskwords,
 654			.actionstream = keywords,
 655		},
 656	};
 657	struct vcap_rule_internal rule = {
 658		.admin = &admin,
 659		.data = {
 660			.keyset = VCAP_KFS_IP_7TUPLE,
 661		},
 662		.vctrl = &test_vctrl,
 663	};
 664	struct vcap_client_keyfield ckf = {
 665		.ctrl.list = {},
 666		.ctrl.key = VCAP_KF_L3_IP6_DIP,
 667		.ctrl.type = VCAP_FIELD_U128,
 668		.data.u128.value = { 0xa1, 0xa2, 0xa3, 0xa4, 0, 0, 0x43, 0,
 669			0, 0, 0, 0, 0, 0, 0x78, 0x8e, },
 670		.data.u128.mask =  { 0xff, 0xff, 0xff, 0xff, 0, 0, 0xff, 0,
 671			0, 0, 0, 0, 0, 0, 0xff, 0xff },
 672	};
 673	struct vcap_field rf = {
 674		.type = VCAP_FIELD_U128,
 675		.offset = 0,
 676		.width = 128,
 677	};
 678	struct vcap_typegroup tgt[] = {
 679		{ .offset = 0, .width = 2, .value = 2, },
 680		{ .offset = 156, .width = 1, .value = 1, },
 681		{ .offset = 0, .width = 0, .value = 0, },
 682	};
 683	u32 keyres[] = {
 684		0x928e8a84,
 685		0x000c0002,
 686		0x00000010,
 687		0x00000000,
 688		0x0239e000,
 689		0x00000000,
 690	};
 691	u32 mskres[] = {
 692		0xfffffffc,
 693		0x000c0003,
 694		0x0000003f,
 695		0x00000000,
 696		0x03fffc00,
 697		0x00000000,
 698	};
 699
 700	vcap_encode_keyfield(&rule, &ckf, &rf, tgt);
 701
 702	/* Key */
 703	for (idx = 0; idx < ARRAY_SIZE(keyres); ++idx)
 704		KUNIT_EXPECT_EQ(test, keyres[idx], keywords[idx]);
 705	/* Mask */
 706	for (idx = 0; idx < ARRAY_SIZE(mskres); ++idx)
 707		KUNIT_EXPECT_EQ(test, mskres[idx], maskwords[idx]);
 708}
 709
 710static void vcap_api_encode_actionfield_test(struct kunit *test)
 711{
 712	u32 actwords[16] = {0};
 713	int sw_width = 21;
 714	struct vcap_admin admin = {
 715		.vtype = VCAP_TYPE_ES2, /* act_width = 21 */
 716		.cache = {
 717			.actionstream = actwords,
 718		},
 719	};
 720	struct vcap_rule_internal rule = {
 721		.admin = &admin,
 722		.data = {
 723			.actionset = VCAP_AFS_BASE_TYPE,
 724		},
 725		.vctrl = &test_vctrl,
 726	};
 727	struct vcap_client_actionfield caf = {
 728		.ctrl.list = {},
 729		.ctrl.action = VCAP_AF_POLICE_IDX,
 730		.ctrl.type = VCAP_FIELD_U32,
 731		.data.u32.value = 0x67908032,
 732	};
 733	struct vcap_field rf = {
 734		.type = VCAP_FIELD_U32,
 735		.offset = 35,
 736		.width = 6,
 737	};
 738	struct vcap_typegroup tgt[] = {
 739		{ .offset = 0, .width = 2, .value = 2, },
 740		{ .offset = 21, .width = 1, .value = 1, },
 741		{ .offset = 42, .width = 1, .value = 0, },
 742		{ .offset = 0, .width = 0, .value = 0, },
 743	};
 744
 745	vcap_encode_actionfield(&rule, &caf, &rf, tgt);
 746
 747	/* Action */
 748	KUNIT_EXPECT_EQ(test, (u32)0x0, actwords[0]);
 749	KUNIT_EXPECT_EQ(test, (u32)((0x32 << (35 + 2 + 1 - sw_width)) & 0x1fffff), actwords[1]);
 750	KUNIT_EXPECT_EQ(test, (u32)((0x32 >> ((2 * sw_width) - 38 - 1))), actwords[2]);
 751	KUNIT_EXPECT_EQ(test, (u32)0x0, actwords[3]);
 752	KUNIT_EXPECT_EQ(test, (u32)0x0, actwords[4]);
 753	KUNIT_EXPECT_EQ(test, (u32)0x0, actwords[5]);
 754	KUNIT_EXPECT_EQ(test, (u32)0x0, actwords[6]);
 755}
 756
 757static void vcap_api_keyfield_typegroup_test(struct kunit *test)
 758{
 759	const struct vcap_typegroup *tg;
 760
 761	tg = vcap_keyfield_typegroup(&test_vctrl, VCAP_TYPE_IS2, VCAP_KFS_MAC_ETYPE);
 762	KUNIT_EXPECT_PTR_NE(test, NULL, tg);
 763	KUNIT_EXPECT_EQ(test, 0, tg[0].offset);
 764	KUNIT_EXPECT_EQ(test, 2, tg[0].width);
 765	KUNIT_EXPECT_EQ(test, 2, tg[0].value);
 766	KUNIT_EXPECT_EQ(test, 156, tg[1].offset);
 767	KUNIT_EXPECT_EQ(test, 1, tg[1].width);
 768	KUNIT_EXPECT_EQ(test, 0, tg[1].value);
 769	KUNIT_EXPECT_EQ(test, 0, tg[2].offset);
 770	KUNIT_EXPECT_EQ(test, 0, tg[2].width);
 771	KUNIT_EXPECT_EQ(test, 0, tg[2].value);
 772
 773	tg = vcap_keyfield_typegroup(&test_vctrl, VCAP_TYPE_ES2, VCAP_KFS_LL_FULL);
 774	KUNIT_EXPECT_PTR_EQ(test, NULL, tg);
 775}
 776
 777static void vcap_api_actionfield_typegroup_test(struct kunit *test)
 778{
 779	const struct vcap_typegroup *tg;
 780
 781	tg = vcap_actionfield_typegroup(&test_vctrl, VCAP_TYPE_IS0, VCAP_AFS_FULL);
 782	KUNIT_EXPECT_PTR_NE(test, NULL, tg);
 783	KUNIT_EXPECT_EQ(test, 0, tg[0].offset);
 784	KUNIT_EXPECT_EQ(test, 3, tg[0].width);
 785	KUNIT_EXPECT_EQ(test, 4, tg[0].value);
 786	KUNIT_EXPECT_EQ(test, 110, tg[1].offset);
 787	KUNIT_EXPECT_EQ(test, 2, tg[1].width);
 788	KUNIT_EXPECT_EQ(test, 0, tg[1].value);
 789	KUNIT_EXPECT_EQ(test, 220, tg[2].offset);
 790	KUNIT_EXPECT_EQ(test, 2, tg[2].width);
 791	KUNIT_EXPECT_EQ(test, 0, tg[2].value);
 792	KUNIT_EXPECT_EQ(test, 0, tg[3].offset);
 793	KUNIT_EXPECT_EQ(test, 0, tg[3].width);
 794	KUNIT_EXPECT_EQ(test, 0, tg[3].value);
 795
 796	tg = vcap_actionfield_typegroup(&test_vctrl, VCAP_TYPE_IS2, VCAP_AFS_CLASSIFICATION);
 797	KUNIT_EXPECT_PTR_EQ(test, NULL, tg);
 798}
 799
 800static void vcap_api_vcap_keyfields_test(struct kunit *test)
 801{
 802	const struct vcap_field *ft;
 803
 804	ft = vcap_keyfields(&test_vctrl, VCAP_TYPE_IS2, VCAP_KFS_MAC_ETYPE);
 805	KUNIT_EXPECT_PTR_NE(test, NULL, ft);
 806
 807	/* Keyset that is not available and within the maximum keyset enum value */
 808	ft = vcap_keyfields(&test_vctrl, VCAP_TYPE_ES2, VCAP_KFS_PURE_5TUPLE_IP4);
 809	KUNIT_EXPECT_PTR_EQ(test, NULL, ft);
 810
 811	/* Keyset that is not available and beyond the maximum keyset enum value */
 812	ft = vcap_keyfields(&test_vctrl, VCAP_TYPE_ES2, VCAP_KFS_LL_FULL);
 813	KUNIT_EXPECT_PTR_EQ(test, NULL, ft);
 814}
 815
 816static void vcap_api_vcap_actionfields_test(struct kunit *test)
 817{
 818	const struct vcap_field *ft;
 819
 820	ft = vcap_actionfields(&test_vctrl, VCAP_TYPE_IS0, VCAP_AFS_FULL);
 821	KUNIT_EXPECT_PTR_NE(test, NULL, ft);
 822
 823	ft = vcap_actionfields(&test_vctrl, VCAP_TYPE_IS2, VCAP_AFS_FULL);
 824	KUNIT_EXPECT_PTR_EQ(test, NULL, ft);
 825
 826	ft = vcap_actionfields(&test_vctrl, VCAP_TYPE_IS2, VCAP_AFS_CLASSIFICATION);
 827	KUNIT_EXPECT_PTR_EQ(test, NULL, ft);
 828}
 829
 830static void vcap_api_encode_rule_keyset_test(struct kunit *test)
 831{
 832	u32 keywords[16] = {0};
 833	u32 maskwords[16] = {0};
 834	struct vcap_admin admin = {
 835		.vtype = VCAP_TYPE_IS2,
 836		.cache = {
 837			.keystream = keywords,
 838			.maskstream = maskwords,
 839		},
 840	};
 841	struct vcap_rule_internal rule = {
 842		.admin = &admin,
 843		.data = {
 844			.keyset = VCAP_KFS_MAC_ETYPE,
 845		},
 846		.vctrl = &test_vctrl,
 847	};
 848	struct vcap_client_keyfield ckf[] = {
 849		{
 850			.ctrl.key = VCAP_KF_TYPE,
 851			.ctrl.type = VCAP_FIELD_U32,
 852			.data.u32.value = 0x00,
 853			.data.u32.mask = 0x0f,
 854		},
 855		{
 856			.ctrl.key = VCAP_KF_LOOKUP_FIRST_IS,
 857			.ctrl.type = VCAP_FIELD_BIT,
 858			.data.u1.value = 0x01,
 859			.data.u1.mask = 0x01,
 860		},
 861		{
 862			.ctrl.key = VCAP_KF_IF_IGR_PORT_MASK_L3,
 863			.ctrl.type = VCAP_FIELD_BIT,
 864			.data.u1.value = 0x00,
 865			.data.u1.mask = 0x01,
 866		},
 867		{
 868			.ctrl.key = VCAP_KF_IF_IGR_PORT_MASK_RNG,
 869			.ctrl.type = VCAP_FIELD_U32,
 870			.data.u32.value = 0x00,
 871			.data.u32.mask = 0x0f,
 872		},
 873		{
 874			.ctrl.key = VCAP_KF_IF_IGR_PORT_MASK,
 875			.ctrl.type = VCAP_FIELD_U72,
 876			.data.u72.value = {0x0, 0x00, 0x00, 0x00},
 877			.data.u72.mask = {0xfd, 0xff, 0xff, 0xff},
 878		},
 879		{
 880			.ctrl.key = VCAP_KF_L2_DMAC,
 881			.ctrl.type = VCAP_FIELD_U48,
 882			/* Opposite endianness */
 883			.data.u48.value = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06},
 884			.data.u48.mask = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
 885		},
 886		{
 887			.ctrl.key = VCAP_KF_ETYPE_LEN_IS,
 888			.ctrl.type = VCAP_FIELD_BIT,
 889			.data.u1.value = 0x01,
 890			.data.u1.mask = 0x01,
 891		},
 892		{
 893			.ctrl.key = VCAP_KF_ETYPE,
 894			.ctrl.type = VCAP_FIELD_U32,
 895			.data.u32.value = 0xaabb,
 896			.data.u32.mask = 0xffff,
 897		},
 898	};
 899	int idx;
 900	int ret;
 901
 902	/* Empty entry list */
 903	INIT_LIST_HEAD(&rule.data.keyfields);
 904	ret = vcap_encode_rule_keyset(&rule);
 905	KUNIT_EXPECT_EQ(test, -EINVAL, ret);
 906
 907	for (idx = 0; idx < ARRAY_SIZE(ckf); idx++)
 908		list_add_tail(&ckf[idx].ctrl.list, &rule.data.keyfields);
 909	ret = vcap_encode_rule_keyset(&rule);
 910	KUNIT_EXPECT_EQ(test, 0, ret);
 911
 912	/* The key and mask values below are from an actual Sparx5 rule config */
 913	/* Key */
 914	KUNIT_EXPECT_EQ(test, (u32)0x00000042, keywords[0]);
 915	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[1]);
 916	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[2]);
 917	KUNIT_EXPECT_EQ(test, (u32)0x00020100, keywords[3]);
 918	KUNIT_EXPECT_EQ(test, (u32)0x60504030, keywords[4]);
 919	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[5]);
 920	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[6]);
 921	KUNIT_EXPECT_EQ(test, (u32)0x0002aaee, keywords[7]);
 922	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[8]);
 923	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[9]);
 924	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[10]);
 925	KUNIT_EXPECT_EQ(test, (u32)0x00000000, keywords[11]);
 926
 927	/* Mask: they will be inverted when applied to the register */
 928	KUNIT_EXPECT_EQ(test, (u32)~0x00b07f80, maskwords[0]);
 929	KUNIT_EXPECT_EQ(test, (u32)~0xfff00000, maskwords[1]);
 930	KUNIT_EXPECT_EQ(test, (u32)~0xfffffffc, maskwords[2]);
 931	KUNIT_EXPECT_EQ(test, (u32)~0xfff000ff, maskwords[3]);
 932	KUNIT_EXPECT_EQ(test, (u32)~0x00000000, maskwords[4]);
 933	KUNIT_EXPECT_EQ(test, (u32)~0xfffffff0, maskwords[5]);
 934	KUNIT_EXPECT_EQ(test, (u32)~0xfffffffe, maskwords[6]);
 935	KUNIT_EXPECT_EQ(test, (u32)~0xfffc0001, maskwords[7]);
 936	KUNIT_EXPECT_EQ(test, (u32)~0xffffffff, maskwords[8]);
 937	KUNIT_EXPECT_EQ(test, (u32)~0xffffffff, maskwords[9]);
 938	KUNIT_EXPECT_EQ(test, (u32)~0xffffffff, maskwords[10]);
 939	KUNIT_EXPECT_EQ(test, (u32)~0xffffffff, maskwords[11]);
 940}
 941
 942static void vcap_api_encode_rule_actionset_test(struct kunit *test)
 943{
 944	u32 actwords[16] = {0};
 945	struct vcap_admin admin = {
 946		.vtype = VCAP_TYPE_IS2,
 947		.cache = {
 948			.actionstream = actwords,
 949		},
 950	};
 951	struct vcap_rule_internal rule = {
 952		.admin = &admin,
 953		.data = {
 954			.actionset = VCAP_AFS_BASE_TYPE,
 955		},
 956		.vctrl = &test_vctrl,
 957	};
 958	struct vcap_client_actionfield caf[] = {
 959		{
 960			.ctrl.action = VCAP_AF_MATCH_ID,
 961			.ctrl.type = VCAP_FIELD_U32,
 962			.data.u32.value = 0x01,
 963		},
 964		{
 965			.ctrl.action = VCAP_AF_MATCH_ID_MASK,
 966			.ctrl.type = VCAP_FIELD_U32,
 967			.data.u32.value = 0x01,
 968		},
 969		{
 970			.ctrl.action = VCAP_AF_CNT_ID,
 971			.ctrl.type = VCAP_FIELD_U32,
 972			.data.u32.value = 0x64,
 973		},
 974	};
 975	int idx;
 976	int ret;
 977
 978	/* Empty entry list */
 979	INIT_LIST_HEAD(&rule.data.actionfields);
 980	ret = vcap_encode_rule_actionset(&rule);
 981	/* We allow rules with no actions */
 982	KUNIT_EXPECT_EQ(test, 0, ret);
 983
 984	for (idx = 0; idx < ARRAY_SIZE(caf); idx++)
 985		list_add_tail(&caf[idx].ctrl.list, &rule.data.actionfields);
 986	ret = vcap_encode_rule_actionset(&rule);
 987	KUNIT_EXPECT_EQ(test, 0, ret);
 988
 989	/* The action values below are from an actual Sparx5 rule config */
 990	KUNIT_EXPECT_EQ(test, (u32)0x00000002, actwords[0]);
 991	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[1]);
 992	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[2]);
 993	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[3]);
 994	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[4]);
 995	KUNIT_EXPECT_EQ(test, (u32)0x00100000, actwords[5]);
 996	KUNIT_EXPECT_EQ(test, (u32)0x06400010, actwords[6]);
 997	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[7]);
 998	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[8]);
 999	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[9]);
1000	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[10]);
1001	KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[11]);
1002}
1003
 
 
 
 
 
 
 
 
 
 
1004static void vcap_api_rule_add_keyvalue_test(struct kunit *test)
1005{
1006	struct vcap_admin admin = {
1007		.vtype = VCAP_TYPE_IS2,
1008	};
1009	struct vcap_rule_internal ri = {
1010		.admin = &admin,
1011		.data = {
1012			.keyset = VCAP_KFS_NO_VALUE,
1013		},
1014		.vctrl = &test_vctrl,
1015	};
1016	struct vcap_rule *rule = (struct vcap_rule *)&ri;
1017	struct vcap_client_keyfield *kf;
1018	int ret;
1019	struct vcap_u128_key dip = {
1020		.value = {0x17, 0x26, 0x35, 0x44, 0x63, 0x62, 0x71},
1021		.mask = {0xf1, 0xf2, 0xf3, 0xf4, 0x4f, 0x3f, 0x2f, 0x1f},
1022	};
1023	int idx;
1024
1025	INIT_LIST_HEAD(&rule->keyfields);
1026	ret = vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS, VCAP_BIT_0);
1027	KUNIT_EXPECT_EQ(test, 0, ret);
1028	ret = list_empty(&rule->keyfields);
1029	KUNIT_EXPECT_EQ(test, false, ret);
1030	kf = list_first_entry(&rule->keyfields, struct vcap_client_keyfield,
1031			      ctrl.list);
1032	KUNIT_EXPECT_EQ(test, VCAP_KF_LOOKUP_FIRST_IS, kf->ctrl.key);
1033	KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, kf->ctrl.type);
1034	KUNIT_EXPECT_EQ(test, 0x0, kf->data.u1.value);
1035	KUNIT_EXPECT_EQ(test, 0x1, kf->data.u1.mask);
 
1036
1037	INIT_LIST_HEAD(&rule->keyfields);
1038	ret = vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS, VCAP_BIT_1);
1039	KUNIT_EXPECT_EQ(test, 0, ret);
1040	ret = list_empty(&rule->keyfields);
1041	KUNIT_EXPECT_EQ(test, false, ret);
1042	kf = list_first_entry(&rule->keyfields, struct vcap_client_keyfield,
1043			      ctrl.list);
1044	KUNIT_EXPECT_EQ(test, VCAP_KF_LOOKUP_FIRST_IS, kf->ctrl.key);
1045	KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, kf->ctrl.type);
1046	KUNIT_EXPECT_EQ(test, 0x1, kf->data.u1.value);
1047	KUNIT_EXPECT_EQ(test, 0x1, kf->data.u1.mask);
 
1048
1049	INIT_LIST_HEAD(&rule->keyfields);
1050	ret = vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS,
1051				    VCAP_BIT_ANY);
1052	KUNIT_EXPECT_EQ(test, 0, ret);
1053	ret = list_empty(&rule->keyfields);
1054	KUNIT_EXPECT_EQ(test, false, ret);
1055	kf = list_first_entry(&rule->keyfields, struct vcap_client_keyfield,
1056			      ctrl.list);
1057	KUNIT_EXPECT_EQ(test, VCAP_KF_LOOKUP_FIRST_IS, kf->ctrl.key);
1058	KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, kf->ctrl.type);
1059	KUNIT_EXPECT_EQ(test, 0x0, kf->data.u1.value);
1060	KUNIT_EXPECT_EQ(test, 0x0, kf->data.u1.mask);
 
1061
1062	INIT_LIST_HEAD(&rule->keyfields);
1063	ret = vcap_rule_add_key_u32(rule, VCAP_KF_TYPE, 0x98765432, 0xff00ffab);
1064	KUNIT_EXPECT_EQ(test, 0, ret);
1065	ret = list_empty(&rule->keyfields);
1066	KUNIT_EXPECT_EQ(test, false, ret);
1067	kf = list_first_entry(&rule->keyfields, struct vcap_client_keyfield,
1068			      ctrl.list);
1069	KUNIT_EXPECT_EQ(test, VCAP_KF_TYPE, kf->ctrl.key);
1070	KUNIT_EXPECT_EQ(test, VCAP_FIELD_U32, kf->ctrl.type);
1071	KUNIT_EXPECT_EQ(test, 0x98765432, kf->data.u32.value);
1072	KUNIT_EXPECT_EQ(test, 0xff00ffab, kf->data.u32.mask);
 
1073
1074	INIT_LIST_HEAD(&rule->keyfields);
1075	ret = vcap_rule_add_key_u128(rule, VCAP_KF_L3_IP6_SIP, &dip);
1076	KUNIT_EXPECT_EQ(test, 0, ret);
1077	ret = list_empty(&rule->keyfields);
1078	KUNIT_EXPECT_EQ(test, false, ret);
1079	kf = list_first_entry(&rule->keyfields, struct vcap_client_keyfield,
1080			      ctrl.list);
1081	KUNIT_EXPECT_EQ(test, VCAP_KF_L3_IP6_SIP, kf->ctrl.key);
1082	KUNIT_EXPECT_EQ(test, VCAP_FIELD_U128, kf->ctrl.type);
1083	for (idx = 0; idx < ARRAY_SIZE(dip.value); ++idx)
1084		KUNIT_EXPECT_EQ(test, dip.value[idx], kf->data.u128.value[idx]);
1085	for (idx = 0; idx < ARRAY_SIZE(dip.mask); ++idx)
1086		KUNIT_EXPECT_EQ(test, dip.mask[idx], kf->data.u128.mask[idx]);
 
 
 
 
 
 
 
 
 
 
 
 
1087}
1088
1089static void vcap_api_rule_add_actionvalue_test(struct kunit *test)
1090{
1091	struct vcap_admin admin = {
1092		.vtype = VCAP_TYPE_IS2,
1093	};
1094	struct vcap_rule_internal ri = {
1095		.admin = &admin,
1096		.data = {
1097			.actionset = VCAP_AFS_NO_VALUE,
1098		},
1099	};
1100	struct vcap_rule *rule = (struct vcap_rule *)&ri;
1101	struct vcap_client_actionfield *af;
1102	int ret;
1103
1104	INIT_LIST_HEAD(&rule->actionfields);
1105	ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_0);
1106	KUNIT_EXPECT_EQ(test, 0, ret);
1107	ret = list_empty(&rule->actionfields);
1108	KUNIT_EXPECT_EQ(test, false, ret);
1109	af = list_first_entry(&rule->actionfields,
1110			      struct vcap_client_actionfield, ctrl.list);
1111	KUNIT_EXPECT_EQ(test, VCAP_AF_POLICE_ENA, af->ctrl.action);
1112	KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, af->ctrl.type);
1113	KUNIT_EXPECT_EQ(test, 0x0, af->data.u1.value);
 
1114
1115	INIT_LIST_HEAD(&rule->actionfields);
1116	ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_1);
1117	KUNIT_EXPECT_EQ(test, 0, ret);
1118	ret = list_empty(&rule->actionfields);
1119	KUNIT_EXPECT_EQ(test, false, ret);
1120	af = list_first_entry(&rule->actionfields,
1121			      struct vcap_client_actionfield, ctrl.list);
1122	KUNIT_EXPECT_EQ(test, VCAP_AF_POLICE_ENA, af->ctrl.action);
1123	KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, af->ctrl.type);
1124	KUNIT_EXPECT_EQ(test, 0x1, af->data.u1.value);
 
1125
1126	INIT_LIST_HEAD(&rule->actionfields);
1127	ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_ANY);
1128	KUNIT_EXPECT_EQ(test, 0, ret);
1129	ret = list_empty(&rule->actionfields);
1130	KUNIT_EXPECT_EQ(test, false, ret);
1131	af = list_first_entry(&rule->actionfields,
1132			      struct vcap_client_actionfield, ctrl.list);
1133	KUNIT_EXPECT_EQ(test, VCAP_AF_POLICE_ENA, af->ctrl.action);
1134	KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, af->ctrl.type);
1135	KUNIT_EXPECT_EQ(test, 0x0, af->data.u1.value);
 
1136
1137	INIT_LIST_HEAD(&rule->actionfields);
1138	ret = vcap_rule_add_action_u32(rule, VCAP_AF_TYPE, 0x98765432);
1139	KUNIT_EXPECT_EQ(test, 0, ret);
1140	ret = list_empty(&rule->actionfields);
1141	KUNIT_EXPECT_EQ(test, false, ret);
1142	af = list_first_entry(&rule->actionfields,
1143			      struct vcap_client_actionfield, ctrl.list);
1144	KUNIT_EXPECT_EQ(test, VCAP_AF_TYPE, af->ctrl.action);
1145	KUNIT_EXPECT_EQ(test, VCAP_FIELD_U32, af->ctrl.type);
1146	KUNIT_EXPECT_EQ(test, 0x98765432, af->data.u32.value);
 
1147
1148	INIT_LIST_HEAD(&rule->actionfields);
1149	ret = vcap_rule_add_action_u32(rule, VCAP_AF_MASK_MODE, 0xaabbccdd);
1150	KUNIT_EXPECT_EQ(test, 0, ret);
1151	ret = list_empty(&rule->actionfields);
1152	KUNIT_EXPECT_EQ(test, false, ret);
1153	af = list_first_entry(&rule->actionfields,
1154			      struct vcap_client_actionfield, ctrl.list);
1155	KUNIT_EXPECT_EQ(test, VCAP_AF_MASK_MODE, af->ctrl.action);
1156	KUNIT_EXPECT_EQ(test, VCAP_FIELD_U32, af->ctrl.type);
1157	KUNIT_EXPECT_EQ(test, 0xaabbccdd, af->data.u32.value);
 
1158}
1159
1160static void vcap_api_rule_find_keyset_basic_test(struct kunit *test)
1161{
1162	struct vcap_keyset_list matches = {};
1163	struct vcap_admin admin = {
1164		.vtype = VCAP_TYPE_IS2,
1165	};
1166	struct vcap_rule_internal ri = {
1167		.admin = &admin,
1168		.vctrl = &test_vctrl,
1169	};
1170	struct vcap_client_keyfield ckf[] = {
1171		{
1172			.ctrl.key = VCAP_KF_TYPE,
1173		}, {
1174			.ctrl.key = VCAP_KF_LOOKUP_FIRST_IS,
1175		}, {
1176			.ctrl.key = VCAP_KF_IF_IGR_PORT_MASK_L3,
1177		}, {
1178			.ctrl.key = VCAP_KF_IF_IGR_PORT_MASK_RNG,
1179		}, {
1180			.ctrl.key = VCAP_KF_IF_IGR_PORT_MASK,
1181		}, {
1182			.ctrl.key = VCAP_KF_L2_DMAC,
1183		}, {
1184			.ctrl.key = VCAP_KF_ETYPE_LEN_IS,
1185		}, {
1186			.ctrl.key = VCAP_KF_ETYPE,
1187		},
1188	};
1189	int idx;
1190	bool ret;
1191	enum vcap_keyfield_set keysets[10] = {};
1192
1193	matches.keysets = keysets;
1194	matches.max = ARRAY_SIZE(keysets);
1195
1196	INIT_LIST_HEAD(&ri.data.keyfields);
1197	for (idx = 0; idx < ARRAY_SIZE(ckf); idx++)
1198		list_add_tail(&ckf[idx].ctrl.list, &ri.data.keyfields);
1199
1200	ret = vcap_rule_find_keysets(&ri.data, &matches);
1201
1202	KUNIT_EXPECT_EQ(test, true, ret);
1203	KUNIT_EXPECT_EQ(test, 1, matches.cnt);
1204	KUNIT_EXPECT_EQ(test, VCAP_KFS_MAC_ETYPE, matches.keysets[0]);
1205}
1206
1207static void vcap_api_rule_find_keyset_failed_test(struct kunit *test)
1208{
1209	struct vcap_keyset_list matches = {};
1210	struct vcap_admin admin = {
1211		.vtype = VCAP_TYPE_IS2,
1212	};
1213	struct vcap_rule_internal ri = {
1214		.admin = &admin,
1215		.vctrl = &test_vctrl,
1216	};
1217	struct vcap_client_keyfield ckf[] = {
1218		{
1219			.ctrl.key = VCAP_KF_TYPE,
1220		}, {
1221			.ctrl.key = VCAP_KF_LOOKUP_FIRST_IS,
1222		}, {
1223			.ctrl.key = VCAP_KF_ARP_OPCODE,
1224		}, {
1225			.ctrl.key = VCAP_KF_L3_IP4_SIP,
1226		}, {
1227			.ctrl.key = VCAP_KF_L3_IP4_DIP,
1228		}, {
1229			.ctrl.key = VCAP_KF_8021Q_PCP_CLS,
1230		}, {
1231			.ctrl.key = VCAP_KF_ETYPE_LEN_IS, /* Not with ARP */
1232		}, {
1233			.ctrl.key = VCAP_KF_ETYPE, /* Not with ARP */
1234		},
1235	};
1236	int idx;
1237	bool ret;
1238	enum vcap_keyfield_set keysets[10] = {};
1239
1240	matches.keysets = keysets;
1241	matches.max = ARRAY_SIZE(keysets);
1242
1243	INIT_LIST_HEAD(&ri.data.keyfields);
1244	for (idx = 0; idx < ARRAY_SIZE(ckf); idx++)
1245		list_add_tail(&ckf[idx].ctrl.list, &ri.data.keyfields);
1246
1247	ret = vcap_rule_find_keysets(&ri.data, &matches);
1248
1249	KUNIT_EXPECT_EQ(test, false, ret);
1250	KUNIT_EXPECT_EQ(test, 0, matches.cnt);
1251	KUNIT_EXPECT_EQ(test, VCAP_KFS_NO_VALUE, matches.keysets[0]);
1252}
1253
1254static void vcap_api_rule_find_keyset_many_test(struct kunit *test)
1255{
1256	struct vcap_keyset_list matches = {};
1257	struct vcap_admin admin = {
1258		.vtype = VCAP_TYPE_IS2,
1259	};
1260	struct vcap_rule_internal ri = {
1261		.admin = &admin,
1262		.vctrl = &test_vctrl,
1263	};
1264	struct vcap_client_keyfield ckf[] = {
1265		{
1266			.ctrl.key = VCAP_KF_TYPE,
1267		}, {
1268			.ctrl.key = VCAP_KF_LOOKUP_FIRST_IS,
1269		}, {
1270			.ctrl.key = VCAP_KF_8021Q_DEI_CLS,
1271		}, {
1272			.ctrl.key = VCAP_KF_8021Q_PCP_CLS,
1273		}, {
1274			.ctrl.key = VCAP_KF_8021Q_VID_CLS,
1275		}, {
1276			.ctrl.key = VCAP_KF_ISDX_CLS,
1277		}, {
1278			.ctrl.key = VCAP_KF_L2_MC_IS,
1279		}, {
1280			.ctrl.key = VCAP_KF_L2_BC_IS,
1281		},
1282	};
1283	int idx;
1284	bool ret;
1285	enum vcap_keyfield_set keysets[10] = {};
1286
1287	matches.keysets = keysets;
1288	matches.max = ARRAY_SIZE(keysets);
1289
1290	INIT_LIST_HEAD(&ri.data.keyfields);
1291	for (idx = 0; idx < ARRAY_SIZE(ckf); idx++)
1292		list_add_tail(&ckf[idx].ctrl.list, &ri.data.keyfields);
1293
1294	ret = vcap_rule_find_keysets(&ri.data, &matches);
1295
1296	KUNIT_EXPECT_EQ(test, true, ret);
1297	KUNIT_EXPECT_EQ(test, 6, matches.cnt);
1298	KUNIT_EXPECT_EQ(test, VCAP_KFS_ARP, matches.keysets[0]);
1299	KUNIT_EXPECT_EQ(test, VCAP_KFS_IP4_OTHER, matches.keysets[1]);
1300	KUNIT_EXPECT_EQ(test, VCAP_KFS_IP4_TCP_UDP, matches.keysets[2]);
1301	KUNIT_EXPECT_EQ(test, VCAP_KFS_IP6_STD, matches.keysets[3]);
1302	KUNIT_EXPECT_EQ(test, VCAP_KFS_IP_7TUPLE, matches.keysets[4]);
1303	KUNIT_EXPECT_EQ(test, VCAP_KFS_MAC_ETYPE, matches.keysets[5]);
1304}
1305
1306static void vcap_api_encode_rule_test(struct kunit *test)
1307{
1308	/* Data used by VCAP Library callback */
1309	static u32 keydata[32] = {};
1310	static u32 mskdata[32] = {};
1311	static u32 actdata[32] = {};
1312
1313	struct vcap_admin is2_admin = {
1314		.vtype = VCAP_TYPE_IS2,
1315		.first_cid = 10000,
1316		.last_cid = 19999,
1317		.lookups = 4,
1318		.last_valid_addr = 3071,
1319		.first_valid_addr = 0,
1320		.last_used_addr = 800,
1321		.cache = {
1322			.keystream = keydata,
1323			.maskstream = mskdata,
1324			.actionstream = actdata,
1325		},
1326	};
1327	struct vcap_rule *rule;
1328	struct vcap_rule_internal *ri;
1329	int vcap_chain_id = 10005;
1330	enum vcap_user user = VCAP_USER_VCAP_UTIL;
1331	u16 priority = 10;
1332	int id = 100;
1333	int ret;
1334	struct vcap_u48_key smac = {
1335		.value = { 0x88, 0x75, 0x32, 0x34, 0x9e, 0xb1 },
1336		.mask = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }
1337	};
1338	struct vcap_u48_key dmac = {
1339		.value = { 0x06, 0x05, 0x04, 0x03, 0x02, 0x01 },
1340		.mask = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }
1341	};
1342	u32 port_mask_rng_value = 0x05;
1343	u32 port_mask_rng_mask = 0x0f;
1344	u32 igr_port_mask_value = 0xffabcd01;
1345	u32 igr_port_mask_mask = ~0;
1346	/* counter is not written yet, so it is not in expwriteaddr */
1347	u32 expwriteaddr[] = {792, 793, 794, 795, 796, 797, 0};
1348	int idx;
1349
1350	vcap_test_api_init(&is2_admin);
1351
1352	/* Allocate the rule */
1353	rule = vcap_alloc_rule(&test_vctrl, &test_netdev, vcap_chain_id, user,
1354			       priority, id);
1355	KUNIT_EXPECT_PTR_NE(test, NULL, rule);
1356	ri = (struct vcap_rule_internal *)rule;
1357
1358	/* Add rule keys */
1359	ret = vcap_rule_add_key_u48(rule, VCAP_KF_L2_DMAC, &dmac);
1360	KUNIT_EXPECT_EQ(test, 0, ret);
1361	ret = vcap_rule_add_key_u48(rule, VCAP_KF_L2_SMAC, &smac);
1362	KUNIT_EXPECT_EQ(test, 0, ret);
1363	ret = vcap_rule_add_key_bit(rule, VCAP_KF_ETYPE_LEN_IS, VCAP_BIT_1);
1364	KUNIT_EXPECT_EQ(test, 0, ret);
1365	/* Cannot add the same field twice */
1366	ret = vcap_rule_add_key_bit(rule, VCAP_KF_ETYPE_LEN_IS, VCAP_BIT_1);
1367	KUNIT_EXPECT_EQ(test, -EINVAL, ret);
1368	ret = vcap_rule_add_key_bit(rule, VCAP_KF_IF_IGR_PORT_MASK_L3,
1369				    VCAP_BIT_ANY);
1370	KUNIT_EXPECT_EQ(test, 0, ret);
1371	ret = vcap_rule_add_key_u32(rule, VCAP_KF_IF_IGR_PORT_MASK_RNG,
1372				    port_mask_rng_value, port_mask_rng_mask);
1373	KUNIT_EXPECT_EQ(test, 0, ret);
1374	ret = vcap_rule_add_key_u32(rule, VCAP_KF_IF_IGR_PORT_MASK,
1375				    igr_port_mask_value, igr_port_mask_mask);
1376	KUNIT_EXPECT_EQ(test, 0, ret);
1377
1378	/* Add rule actions */
1379	ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_1);
1380	KUNIT_EXPECT_EQ(test, 0, ret);
1381	ret = vcap_rule_add_action_u32(rule, VCAP_AF_CNT_ID, id);
1382	KUNIT_EXPECT_EQ(test, 0, ret);
1383	ret = vcap_rule_add_action_u32(rule, VCAP_AF_MATCH_ID, 1);
1384	KUNIT_EXPECT_EQ(test, 0, ret);
1385	ret = vcap_rule_add_action_u32(rule, VCAP_AF_MATCH_ID_MASK, 1);
1386	KUNIT_EXPECT_EQ(test, 0, ret);
1387
1388	/* For now the actionset is hardcoded */
1389	ret = vcap_set_rule_set_actionset(rule, VCAP_AFS_BASE_TYPE);
1390	KUNIT_EXPECT_EQ(test, 0, ret);
1391
1392	/* Validation with validate keyset callback */
1393	ret = vcap_val_rule(rule, ETH_P_ALL);
1394	KUNIT_EXPECT_EQ(test, 0, ret);
1395	KUNIT_EXPECT_EQ(test, VCAP_KFS_MAC_ETYPE, rule->keyset);
1396	KUNIT_EXPECT_EQ(test, VCAP_AFS_BASE_TYPE, rule->actionset);
1397	KUNIT_EXPECT_EQ(test, 6, ri->size);
1398	KUNIT_EXPECT_EQ(test, 2, ri->keyset_sw_regs);
1399	KUNIT_EXPECT_EQ(test, 4, ri->actionset_sw_regs);
1400
 
 
 
 
 
1401	/* Add rule with write callback */
1402	ret = vcap_add_rule(rule);
1403	KUNIT_EXPECT_EQ(test, 0, ret);
1404	KUNIT_EXPECT_EQ(test, 792, is2_admin.last_used_addr);
1405	for (idx = 0; idx < ARRAY_SIZE(expwriteaddr); ++idx)
1406		KUNIT_EXPECT_EQ(test, expwriteaddr[idx], test_updateaddr[idx]);
1407
1408	/* Check that the rule has been added */
1409	ret = list_empty(&is2_admin.rules);
1410	KUNIT_EXPECT_EQ(test, false, ret);
1411	KUNIT_EXPECT_EQ(test, 0, ret);
 
 
 
 
 
 
 
1412	vcap_free_rule(rule);
1413
1414	/* Check that the rule has been freed: tricky to access since this
1415	 * memory should not be accessible anymore
1416	 */
1417	KUNIT_EXPECT_PTR_NE(test, NULL, rule);
1418	ret = list_empty(&rule->keyfields);
1419	KUNIT_EXPECT_EQ(test, true, ret);
1420	ret = list_empty(&rule->actionfields);
1421	KUNIT_EXPECT_EQ(test, true, ret);
1422}
1423
1424static void vcap_api_set_rule_counter_test(struct kunit *test)
1425{
1426	struct vcap_admin is2_admin = {
1427		.cache = {
1428			.counter = 100,
1429			.sticky = true,
1430		},
1431	};
1432	struct vcap_rule_internal ri = {
1433		.data = {
1434			.id = 1001,
1435		},
1436		.addr = 600,
1437		.admin = &is2_admin,
1438		.counter_id = 1002,
1439		.vctrl = &test_vctrl,
1440	};
1441	struct vcap_rule_internal ri2 = {
1442		.data = {
1443			.id = 2001,
1444		},
1445		.addr = 700,
1446		.admin = &is2_admin,
1447		.counter_id = 2002,
1448		.vctrl = &test_vctrl,
1449	};
1450	struct vcap_counter ctr = { .value = 0, .sticky = false};
1451	struct vcap_counter ctr2 = { .value = 101, .sticky = true};
1452	int ret;
1453
1454	vcap_test_api_init(&is2_admin);
1455	list_add_tail(&ri.list, &is2_admin.rules);
1456	list_add_tail(&ri2.list, &is2_admin.rules);
1457
1458	pr_info("%s:%d\n", __func__, __LINE__);
1459	ret = vcap_rule_set_counter(&ri.data, &ctr);
1460	pr_info("%s:%d\n", __func__, __LINE__);
1461	KUNIT_EXPECT_EQ(test, 0, ret);
1462
1463	KUNIT_EXPECT_EQ(test, 1002, test_hw_counter_id);
1464	KUNIT_EXPECT_EQ(test, 0, test_hw_cache.counter);
1465	KUNIT_EXPECT_EQ(test, false, test_hw_cache.sticky);
1466	KUNIT_EXPECT_EQ(test, 600, test_updateaddr[0]);
1467
1468	ret = vcap_rule_set_counter(&ri2.data, &ctr2);
1469	KUNIT_EXPECT_EQ(test, 0, ret);
1470
1471	KUNIT_EXPECT_EQ(test, 2002, test_hw_counter_id);
1472	KUNIT_EXPECT_EQ(test, 101, test_hw_cache.counter);
1473	KUNIT_EXPECT_EQ(test, true, test_hw_cache.sticky);
1474	KUNIT_EXPECT_EQ(test, 700, test_updateaddr[1]);
1475}
1476
1477static void vcap_api_get_rule_counter_test(struct kunit *test)
1478{
1479	struct vcap_admin is2_admin = {
1480		.cache = {
1481			.counter = 100,
1482			.sticky = true,
1483		},
1484	};
1485	struct vcap_rule_internal ri = {
1486		.data = {
1487			.id = 1010,
1488		},
1489		.addr = 400,
1490		.admin = &is2_admin,
1491		.counter_id = 1011,
1492		.vctrl = &test_vctrl,
1493	};
1494	struct vcap_rule_internal ri2 = {
1495		.data = {
1496			.id = 2011,
1497		},
1498		.addr = 300,
1499		.admin = &is2_admin,
1500		.counter_id = 2012,
1501		.vctrl = &test_vctrl,
1502	};
1503	struct vcap_counter ctr = {};
1504	struct vcap_counter ctr2 = {};
1505	int ret;
1506
1507	vcap_test_api_init(&is2_admin);
1508	test_hw_cache.counter = 55;
1509	test_hw_cache.sticky = true;
1510
1511	list_add_tail(&ri.list, &is2_admin.rules);
1512	list_add_tail(&ri2.list, &is2_admin.rules);
1513
1514	ret = vcap_rule_get_counter(&ri.data, &ctr);
1515	KUNIT_EXPECT_EQ(test, 0, ret);
1516
1517	KUNIT_EXPECT_EQ(test, 1011, test_hw_counter_id);
1518	KUNIT_EXPECT_EQ(test, 55, ctr.value);
1519	KUNIT_EXPECT_EQ(test, true, ctr.sticky);
1520	KUNIT_EXPECT_EQ(test, 400, test_updateaddr[0]);
1521
1522	test_hw_cache.counter = 22;
1523	test_hw_cache.sticky = false;
1524
1525	ret = vcap_rule_get_counter(&ri2.data, &ctr2);
1526	KUNIT_EXPECT_EQ(test, 0, ret);
1527
1528	KUNIT_EXPECT_EQ(test, 2012, test_hw_counter_id);
1529	KUNIT_EXPECT_EQ(test, 22, ctr2.value);
1530	KUNIT_EXPECT_EQ(test, false, ctr2.sticky);
1531	KUNIT_EXPECT_EQ(test, 300, test_updateaddr[1]);
1532}
1533
1534static void vcap_api_rule_insert_in_order_test(struct kunit *test)
1535{
1536	/* Data used by VCAP Library callback */
1537	static u32 keydata[32] = {};
1538	static u32 mskdata[32] = {};
1539	static u32 actdata[32] = {};
1540
1541	struct vcap_admin admin = {
1542		.vtype = VCAP_TYPE_IS0,
1543		.first_cid = 10000,
1544		.last_cid = 19999,
1545		.lookups = 4,
1546		.last_valid_addr = 3071,
1547		.first_valid_addr = 0,
1548		.last_used_addr = 800,
1549		.cache = {
1550			.keystream = keydata,
1551			.maskstream = mskdata,
1552			.actionstream = actdata,
1553		},
1554	};
1555
1556	vcap_test_api_init(&admin);
1557
1558	/* Create rules with different sizes and check that they are placed
1559	 * at the correct address in the VCAP according to size
1560	 */
1561	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 10, 500, 12, 780);
1562	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 400, 6, 774);
1563	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 771);
1564	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 200, 2, 768);
 
 
 
 
 
1565}
1566
1567static void vcap_api_rule_insert_reverse_order_test(struct kunit *test)
1568{
1569	/* Data used by VCAP Library callback */
1570	static u32 keydata[32] = {};
1571	static u32 mskdata[32] = {};
1572	static u32 actdata[32] = {};
1573
1574	struct vcap_admin admin = {
1575		.vtype = VCAP_TYPE_IS0,
1576		.first_cid = 10000,
1577		.last_cid = 19999,
1578		.lookups = 4,
1579		.last_valid_addr = 3071,
1580		.first_valid_addr = 0,
1581		.last_used_addr = 800,
1582		.cache = {
1583			.keystream = keydata,
1584			.maskstream = mskdata,
1585			.actionstream = actdata,
1586		},
1587	};
1588	struct vcap_rule_internal *elem;
1589	u32 exp_addr[] = {780, 774, 771, 768, 767};
1590	int idx;
1591
1592	vcap_test_api_init(&admin);
1593
1594	/* Create rules with different sizes and check that they are placed
1595	 * at the correct address in the VCAP according to size
1596	 */
1597	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 200, 2, 798);
1598	KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1599	KUNIT_EXPECT_EQ(test, 0, test_move_count);
1600	KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1601
1602	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 795);
1603	KUNIT_EXPECT_EQ(test, 6, test_move_offset);
1604	KUNIT_EXPECT_EQ(test, 3, test_move_count);
1605	KUNIT_EXPECT_EQ(test, 798, test_move_addr);
1606
1607	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 400, 6, 792);
1608	KUNIT_EXPECT_EQ(test, 6, test_move_offset);
1609	KUNIT_EXPECT_EQ(test, 6, test_move_count);
1610	KUNIT_EXPECT_EQ(test, 792, test_move_addr);
1611
1612	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 50, 500, 12, 780);
1613	KUNIT_EXPECT_EQ(test, 18, test_move_offset);
1614	KUNIT_EXPECT_EQ(test, 12, test_move_count);
1615	KUNIT_EXPECT_EQ(test, 786, test_move_addr);
1616
1617	idx = 0;
1618	list_for_each_entry(elem, &admin.rules, list) {
1619		KUNIT_EXPECT_EQ(test, exp_addr[idx], elem->addr);
1620		++idx;
1621	}
1622	KUNIT_EXPECT_EQ(test, 768, admin.last_used_addr);
 
 
 
 
 
1623}
1624
1625static void vcap_api_rule_remove_at_end_test(struct kunit *test)
1626{
1627	/* Data used by VCAP Library callback */
1628	static u32 keydata[32] = {};
1629	static u32 mskdata[32] = {};
1630	static u32 actdata[32] = {};
1631
1632	struct vcap_admin admin = {
1633		.vtype = VCAP_TYPE_IS0,
1634		.first_cid = 10000,
1635		.last_cid = 19999,
1636		.lookups = 4,
1637		.last_valid_addr = 3071,
1638		.first_valid_addr = 0,
1639		.last_used_addr = 800,
1640		.cache = {
1641			.keystream = keydata,
1642			.maskstream = mskdata,
1643			.actionstream = actdata,
1644		},
1645	};
1646	int ret;
1647
1648	vcap_test_api_init(&admin);
1649	test_init_rule_deletion();
1650
1651	/* Create rules with different sizes and check that they are placed
1652	 * at the correct address in the VCAP according to size
1653	 */
1654	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 10, 500, 12, 780);
1655	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 400, 6, 774);
1656	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 771);
1657	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 200, 2, 768);
1658
1659	/* Remove rules again from the end */
1660	ret = vcap_del_rule(&test_vctrl, &test_netdev, 200);
1661	KUNIT_EXPECT_EQ(test, 0, ret);
1662	KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1663	KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1664	KUNIT_EXPECT_EQ(test, 0, test_move_count);
1665	KUNIT_EXPECT_EQ(test, 768, test_init_start);
1666	KUNIT_EXPECT_EQ(test, 2, test_init_count);
1667	KUNIT_EXPECT_EQ(test, 771, admin.last_used_addr);
1668
1669	ret = vcap_del_rule(&test_vctrl, &test_netdev, 300);
1670	KUNIT_EXPECT_EQ(test, ret, 0);
1671	KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1672	KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1673	KUNIT_EXPECT_EQ(test, 0, test_move_count);
1674	KUNIT_EXPECT_EQ(test, 771, test_init_start);
1675	KUNIT_EXPECT_EQ(test, 3, test_init_count);
1676	KUNIT_EXPECT_EQ(test, 774, admin.last_used_addr);
1677
1678	ret = vcap_del_rule(&test_vctrl, &test_netdev, 400);
1679	KUNIT_EXPECT_EQ(test, ret, 0);
1680	KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1681	KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1682	KUNIT_EXPECT_EQ(test, 0, test_move_count);
1683	KUNIT_EXPECT_EQ(test, 774, test_init_start);
1684	KUNIT_EXPECT_EQ(test, 6, test_init_count);
1685	KUNIT_EXPECT_EQ(test, 780, admin.last_used_addr);
1686
1687	ret = vcap_del_rule(&test_vctrl, &test_netdev, 500);
1688	KUNIT_EXPECT_EQ(test, ret, 0);
1689	KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1690	KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1691	KUNIT_EXPECT_EQ(test, 0, test_move_count);
1692	KUNIT_EXPECT_EQ(test, 780, test_init_start);
1693	KUNIT_EXPECT_EQ(test, 12, test_init_count);
1694	KUNIT_EXPECT_EQ(test, 3072, admin.last_used_addr);
1695}
1696
1697static void vcap_api_rule_remove_in_middle_test(struct kunit *test)
1698{
1699	/* Data used by VCAP Library callback */
1700	static u32 keydata[32] = {};
1701	static u32 mskdata[32] = {};
1702	static u32 actdata[32] = {};
1703
1704	struct vcap_admin admin = {
1705		.vtype = VCAP_TYPE_IS0,
1706		.first_cid = 10000,
1707		.last_cid = 19999,
1708		.lookups = 4,
1709		.first_valid_addr = 0,
1710		.last_used_addr = 800,
1711		.last_valid_addr = 800 - 1,
1712		.cache = {
1713			.keystream = keydata,
1714			.maskstream = mskdata,
1715			.actionstream = actdata,
1716		},
1717	};
1718	int ret;
1719
1720	vcap_test_api_init(&admin);
1721
1722	/* Create rules with different sizes and check that they are placed
1723	 * at the correct address in the VCAP according to size
1724	 */
1725	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 10, 500, 12, 780);
1726	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 400, 6, 774);
1727	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 771);
1728	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 200, 2, 768);
1729
1730	/* Remove rules in the middle */
1731	test_init_rule_deletion();
1732	ret = vcap_del_rule(&test_vctrl, &test_netdev, 400);
1733	KUNIT_EXPECT_EQ(test, 0, ret);
1734	KUNIT_EXPECT_EQ(test, 768, test_move_addr);
1735	KUNIT_EXPECT_EQ(test, -6, test_move_offset);
1736	KUNIT_EXPECT_EQ(test, 6, test_move_count);
1737	KUNIT_EXPECT_EQ(test, 768, test_init_start);
1738	KUNIT_EXPECT_EQ(test, 6, test_init_count);
1739	KUNIT_EXPECT_EQ(test, 774, admin.last_used_addr);
1740
1741	test_init_rule_deletion();
1742	ret = vcap_del_rule(&test_vctrl, &test_netdev, 300);
1743	KUNIT_EXPECT_EQ(test, 0, ret);
1744	KUNIT_EXPECT_EQ(test, 774, test_move_addr);
1745	KUNIT_EXPECT_EQ(test, -4, test_move_offset);
1746	KUNIT_EXPECT_EQ(test, 2, test_move_count);
1747	KUNIT_EXPECT_EQ(test, 774, test_init_start);
1748	KUNIT_EXPECT_EQ(test, 4, test_init_count);
1749	KUNIT_EXPECT_EQ(test, 778, admin.last_used_addr);
1750
1751	test_init_rule_deletion();
1752	ret = vcap_del_rule(&test_vctrl, &test_netdev, 500);
1753	KUNIT_EXPECT_EQ(test, 0, ret);
1754	KUNIT_EXPECT_EQ(test, 778, test_move_addr);
1755	KUNIT_EXPECT_EQ(test, -20, test_move_offset);
1756	KUNIT_EXPECT_EQ(test, 2, test_move_count);
1757	KUNIT_EXPECT_EQ(test, 778, test_init_start);
1758	KUNIT_EXPECT_EQ(test, 20, test_init_count);
1759	KUNIT_EXPECT_EQ(test, 798, admin.last_used_addr);
1760
1761	test_init_rule_deletion();
1762	ret = vcap_del_rule(&test_vctrl, &test_netdev, 200);
1763	KUNIT_EXPECT_EQ(test, 0, ret);
1764	KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1765	KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1766	KUNIT_EXPECT_EQ(test, 0, test_move_count);
1767	KUNIT_EXPECT_EQ(test, 798, test_init_start);
1768	KUNIT_EXPECT_EQ(test, 2, test_init_count);
1769	KUNIT_EXPECT_EQ(test, 800, admin.last_used_addr);
1770}
1771
1772static void vcap_api_rule_remove_in_front_test(struct kunit *test)
1773{
1774	/* Data used by VCAP Library callback */
1775	static u32 keydata[32] = {};
1776	static u32 mskdata[32] = {};
1777	static u32 actdata[32] = {};
1778
1779	struct vcap_admin admin = {
1780		.vtype = VCAP_TYPE_IS0,
1781		.first_cid = 10000,
1782		.last_cid = 19999,
1783		.lookups = 4,
1784		.first_valid_addr = 0,
1785		.last_used_addr = 800,
1786		.last_valid_addr = 800 - 1,
1787		.cache = {
1788			.keystream = keydata,
1789			.maskstream = mskdata,
1790			.actionstream = actdata,
1791		},
1792	};
1793	int ret;
1794
1795	vcap_test_api_init(&admin);
1796
1797	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 10, 500, 12, 780);
1798	KUNIT_EXPECT_EQ(test, 780, admin.last_used_addr);
1799
1800	test_init_rule_deletion();
1801	ret = vcap_del_rule(&test_vctrl, &test_netdev, 500);
1802	KUNIT_EXPECT_EQ(test, 0, ret);
1803	KUNIT_EXPECT_EQ(test, 0, test_move_addr);
1804	KUNIT_EXPECT_EQ(test, 0, test_move_offset);
1805	KUNIT_EXPECT_EQ(test, 0, test_move_count);
1806	KUNIT_EXPECT_EQ(test, 780, test_init_start);
1807	KUNIT_EXPECT_EQ(test, 12, test_init_count);
1808	KUNIT_EXPECT_EQ(test, 800, admin.last_used_addr);
1809
1810	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 400, 6, 792);
1811	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 789);
1812	test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 200, 2, 786);
1813
1814	test_init_rule_deletion();
1815	ret = vcap_del_rule(&test_vctrl, &test_netdev, 400);
1816	KUNIT_EXPECT_EQ(test, 0, ret);
1817	KUNIT_EXPECT_EQ(test, 786, test_move_addr);
1818	KUNIT_EXPECT_EQ(test, -8, test_move_offset);
1819	KUNIT_EXPECT_EQ(test, 6, test_move_count);
1820	KUNIT_EXPECT_EQ(test, 786, test_init_start);
1821	KUNIT_EXPECT_EQ(test, 8, test_init_count);
1822	KUNIT_EXPECT_EQ(test, 794, admin.last_used_addr);
 
 
 
1823}
1824
1825static struct kunit_case vcap_api_rule_remove_test_cases[] = {
1826	KUNIT_CASE(vcap_api_rule_remove_at_end_test),
1827	KUNIT_CASE(vcap_api_rule_remove_in_middle_test),
1828	KUNIT_CASE(vcap_api_rule_remove_in_front_test),
1829	{}
1830};
1831
1832static void vcap_api_next_lookup_basic_test(struct kunit *test)
1833{
1834	struct vcap_admin admin1 = {
1835		.vtype = VCAP_TYPE_IS2,
1836		.vinst = 0,
1837		.first_cid = 8000000,
1838		.last_cid = 8199999,
1839		.lookups = 4,
1840		.lookups_per_instance = 2,
1841	};
1842	struct vcap_admin admin2 = {
1843		.vtype = VCAP_TYPE_IS2,
1844		.vinst = 1,
1845		.first_cid = 8200000,
1846		.last_cid = 8399999,
1847		.lookups = 4,
1848		.lookups_per_instance = 2,
1849	};
1850	bool ret;
1851
1852	vcap_test_api_init(&admin1);
1853	list_add_tail(&admin2.list, &test_vctrl.list);
1854
1855	ret = vcap_is_next_lookup(&test_vctrl, 8000000, 1001000);
1856	KUNIT_EXPECT_EQ(test, false, ret);
1857	ret = vcap_is_next_lookup(&test_vctrl, 8000000, 8001000);
1858	KUNIT_EXPECT_EQ(test, false, ret);
1859	ret = vcap_is_next_lookup(&test_vctrl, 8000000, 8101000);
1860	KUNIT_EXPECT_EQ(test, true, ret);
1861
1862	ret = vcap_is_next_lookup(&test_vctrl, 8100000, 8101000);
1863	KUNIT_EXPECT_EQ(test, false, ret);
1864	ret = vcap_is_next_lookup(&test_vctrl, 8100000, 8201000);
1865	KUNIT_EXPECT_EQ(test, true, ret);
1866
1867	ret = vcap_is_next_lookup(&test_vctrl, 8200000, 8201000);
1868	KUNIT_EXPECT_EQ(test, false, ret);
1869	ret = vcap_is_next_lookup(&test_vctrl, 8200000, 8301000);
1870	KUNIT_EXPECT_EQ(test, true, ret);
1871
1872	ret = vcap_is_next_lookup(&test_vctrl, 8300000, 8301000);
1873	KUNIT_EXPECT_EQ(test, false, ret);
1874	ret = vcap_is_next_lookup(&test_vctrl, 8300000, 8401000);
1875	KUNIT_EXPECT_EQ(test, true, ret);
1876}
1877
1878static void vcap_api_next_lookup_advanced_test(struct kunit *test)
1879{
1880	struct vcap_admin admin1 = {
 
1881		.vtype = VCAP_TYPE_IS0,
1882		.vinst = 0,
1883		.first_cid = 1000000,
1884		.last_cid =  1199999,
1885		.lookups = 6,
1886		.lookups_per_instance = 2,
1887	};
1888	struct vcap_admin admin2 = {
1889		.vtype = VCAP_TYPE_IS0,
1890		.vinst = 1,
1891		.first_cid = 1200000,
1892		.last_cid =  1399999,
1893		.lookups = 6,
1894		.lookups_per_instance = 2,
1895	};
1896	struct vcap_admin admin3 = {
1897		.vtype = VCAP_TYPE_IS0,
1898		.vinst = 2,
1899		.first_cid = 1400000,
1900		.last_cid =  1599999,
1901		.lookups = 6,
1902		.lookups_per_instance = 2,
1903	};
1904	struct vcap_admin admin4 = {
1905		.vtype = VCAP_TYPE_IS2,
1906		.vinst = 0,
1907		.first_cid = 8000000,
1908		.last_cid = 8199999,
1909		.lookups = 4,
1910		.lookups_per_instance = 2,
1911	};
1912	struct vcap_admin admin5 = {
1913		.vtype = VCAP_TYPE_IS2,
1914		.vinst = 1,
1915		.first_cid = 8200000,
1916		.last_cid = 8399999,
1917		.lookups = 4,
1918		.lookups_per_instance = 2,
 
1919	};
1920	bool ret;
1921
1922	vcap_test_api_init(&admin1);
1923	list_add_tail(&admin2.list, &test_vctrl.list);
1924	list_add_tail(&admin3.list, &test_vctrl.list);
1925	list_add_tail(&admin4.list, &test_vctrl.list);
1926	list_add_tail(&admin5.list, &test_vctrl.list);
1927
1928	ret = vcap_is_next_lookup(&test_vctrl, 1000000, 1001000);
1929	KUNIT_EXPECT_EQ(test, false, ret);
1930	ret = vcap_is_next_lookup(&test_vctrl, 1000000, 1101000);
1931	KUNIT_EXPECT_EQ(test, true, ret);
1932
1933	ret = vcap_is_next_lookup(&test_vctrl, 1100000, 1201000);
1934	KUNIT_EXPECT_EQ(test, true, ret);
1935	ret = vcap_is_next_lookup(&test_vctrl, 1100000, 1301000);
1936	KUNIT_EXPECT_EQ(test, false, ret);
1937	ret = vcap_is_next_lookup(&test_vctrl, 1100000, 8101000);
1938	KUNIT_EXPECT_EQ(test, false, ret);
1939	ret = vcap_is_next_lookup(&test_vctrl, 1300000, 1401000);
1940	KUNIT_EXPECT_EQ(test, true, ret);
1941	ret = vcap_is_next_lookup(&test_vctrl, 1400000, 1501000);
1942	KUNIT_EXPECT_EQ(test, true, ret);
1943	ret = vcap_is_next_lookup(&test_vctrl, 1500000, 8001000);
1944	KUNIT_EXPECT_EQ(test, true, ret);
1945
1946	ret = vcap_is_next_lookup(&test_vctrl, 8000000, 8001000);
1947	KUNIT_EXPECT_EQ(test, false, ret);
1948	ret = vcap_is_next_lookup(&test_vctrl, 8000000, 8101000);
1949	KUNIT_EXPECT_EQ(test, true, ret);
1950
1951	ret = vcap_is_next_lookup(&test_vctrl, 8300000, 8301000);
1952	KUNIT_EXPECT_EQ(test, false, ret);
1953	ret = vcap_is_next_lookup(&test_vctrl, 8300000, 8401000);
1954	KUNIT_EXPECT_EQ(test, true, ret);
1955}
1956
1957static void vcap_api_filter_unsupported_keys_test(struct kunit *test)
1958{
1959	struct vcap_admin admin = {
1960		.vtype = VCAP_TYPE_IS2,
1961	};
1962	struct vcap_rule_internal ri = {
1963		.admin = &admin,
1964		.vctrl = &test_vctrl,
1965		.data.keyset = VCAP_KFS_MAC_ETYPE,
1966	};
1967	enum vcap_key_field keylist[] = {
1968		VCAP_KF_TYPE,
1969		VCAP_KF_LOOKUP_FIRST_IS,
1970		VCAP_KF_ARP_ADDR_SPACE_OK_IS,  /* arp keys are not in keyset */
1971		VCAP_KF_ARP_PROTO_SPACE_OK_IS,
1972		VCAP_KF_ARP_LEN_OK_IS,
1973		VCAP_KF_ARP_TGT_MATCH_IS,
1974		VCAP_KF_ARP_SENDER_MATCH_IS,
1975		VCAP_KF_ARP_OPCODE_UNKNOWN_IS,
1976		VCAP_KF_ARP_OPCODE,
1977		VCAP_KF_8021Q_DEI_CLS,
1978		VCAP_KF_8021Q_PCP_CLS,
1979		VCAP_KF_8021Q_VID_CLS,
1980		VCAP_KF_L2_MC_IS,
1981		VCAP_KF_L2_BC_IS,
1982	};
1983	enum vcap_key_field expected[] = {
1984		VCAP_KF_TYPE,
1985		VCAP_KF_LOOKUP_FIRST_IS,
1986		VCAP_KF_8021Q_DEI_CLS,
1987		VCAP_KF_8021Q_PCP_CLS,
1988		VCAP_KF_8021Q_VID_CLS,
1989		VCAP_KF_L2_MC_IS,
1990		VCAP_KF_L2_BC_IS,
1991	};
1992	struct vcap_client_keyfield *ckf, *next;
1993	bool ret;
1994	int idx;
1995
1996	/* Add all keys to the rule */
1997	INIT_LIST_HEAD(&ri.data.keyfields);
1998	for (idx = 0; idx < ARRAY_SIZE(keylist); idx++) {
1999		ckf = kzalloc(sizeof(*ckf), GFP_KERNEL);
2000		if (ckf) {
2001			ckf->ctrl.key = keylist[idx];
2002			list_add_tail(&ckf->ctrl.list, &ri.data.keyfields);
2003		}
2004	}
2005
2006	KUNIT_EXPECT_EQ(test, 14, ARRAY_SIZE(keylist));
2007
2008	/* Drop unsupported keys from the rule */
2009	ret = vcap_filter_rule_keys(&ri.data, NULL, 0, true);
2010
2011	KUNIT_EXPECT_EQ(test, 0, ret);
2012
2013	/* Check remaining keys in the rule */
2014	idx = 0;
2015	list_for_each_entry_safe(ckf, next, &ri.data.keyfields, ctrl.list) {
2016		KUNIT_EXPECT_EQ(test, expected[idx], ckf->ctrl.key);
2017		list_del(&ckf->ctrl.list);
2018		kfree(ckf);
2019		++idx;
2020	}
2021	KUNIT_EXPECT_EQ(test, 7, idx);
2022}
2023
2024static void vcap_api_filter_keylist_test(struct kunit *test)
2025{
2026	struct vcap_admin admin = {
2027		.vtype = VCAP_TYPE_IS0,
2028	};
2029	struct vcap_rule_internal ri = {
2030		.admin = &admin,
2031		.vctrl = &test_vctrl,
2032		.data.keyset = VCAP_KFS_NORMAL_7TUPLE,
2033	};
2034	enum vcap_key_field keylist[] = {
2035		VCAP_KF_TYPE,
2036		VCAP_KF_LOOKUP_FIRST_IS,
2037		VCAP_KF_LOOKUP_GEN_IDX_SEL,
2038		VCAP_KF_LOOKUP_GEN_IDX,
2039		VCAP_KF_IF_IGR_PORT_MASK_SEL,
2040		VCAP_KF_IF_IGR_PORT_MASK,
2041		VCAP_KF_L2_MC_IS,
2042		VCAP_KF_L2_BC_IS,
2043		VCAP_KF_8021Q_VLAN_TAGS,
2044		VCAP_KF_8021Q_TPID0,
2045		VCAP_KF_8021Q_PCP0,
2046		VCAP_KF_8021Q_DEI0,
2047		VCAP_KF_8021Q_VID0,
2048		VCAP_KF_8021Q_TPID1,
2049		VCAP_KF_8021Q_PCP1,
2050		VCAP_KF_8021Q_DEI1,
2051		VCAP_KF_8021Q_VID1,
2052		VCAP_KF_8021Q_TPID2,
2053		VCAP_KF_8021Q_PCP2,
2054		VCAP_KF_8021Q_DEI2,
2055		VCAP_KF_8021Q_VID2,
2056		VCAP_KF_L2_DMAC,
2057		VCAP_KF_L2_SMAC,
2058		VCAP_KF_IP_MC_IS,
2059		VCAP_KF_ETYPE_LEN_IS,
2060		VCAP_KF_ETYPE,
2061		VCAP_KF_IP_SNAP_IS,
2062		VCAP_KF_IP4_IS,
2063		VCAP_KF_L3_FRAGMENT_TYPE,
2064		VCAP_KF_L3_FRAG_INVLD_L4_LEN,
2065		VCAP_KF_L3_OPTIONS_IS,
2066		VCAP_KF_L3_DSCP,
2067		VCAP_KF_L3_IP6_DIP,
2068		VCAP_KF_L3_IP6_SIP,
2069		VCAP_KF_TCP_UDP_IS,
2070		VCAP_KF_TCP_IS,
2071		VCAP_KF_L4_SPORT,
2072		VCAP_KF_L4_RNG,
2073	};
2074	enum vcap_key_field droplist[] = {
2075		VCAP_KF_8021Q_TPID1,
2076		VCAP_KF_8021Q_PCP1,
2077		VCAP_KF_8021Q_DEI1,
2078		VCAP_KF_8021Q_VID1,
2079		VCAP_KF_8021Q_TPID2,
2080		VCAP_KF_8021Q_PCP2,
2081		VCAP_KF_8021Q_DEI2,
2082		VCAP_KF_8021Q_VID2,
2083		VCAP_KF_L3_IP6_DIP,
2084		VCAP_KF_L3_IP6_SIP,
2085		VCAP_KF_L4_SPORT,
2086		VCAP_KF_L4_RNG,
2087	};
2088	enum vcap_key_field expected[] = {
2089		VCAP_KF_TYPE,
2090		VCAP_KF_LOOKUP_FIRST_IS,
2091		VCAP_KF_LOOKUP_GEN_IDX_SEL,
2092		VCAP_KF_LOOKUP_GEN_IDX,
2093		VCAP_KF_IF_IGR_PORT_MASK_SEL,
2094		VCAP_KF_IF_IGR_PORT_MASK,
2095		VCAP_KF_L2_MC_IS,
2096		VCAP_KF_L2_BC_IS,
2097		VCAP_KF_8021Q_VLAN_TAGS,
2098		VCAP_KF_8021Q_TPID0,
2099		VCAP_KF_8021Q_PCP0,
2100		VCAP_KF_8021Q_DEI0,
2101		VCAP_KF_8021Q_VID0,
2102		VCAP_KF_L2_DMAC,
2103		VCAP_KF_L2_SMAC,
2104		VCAP_KF_IP_MC_IS,
2105		VCAP_KF_ETYPE_LEN_IS,
2106		VCAP_KF_ETYPE,
2107		VCAP_KF_IP_SNAP_IS,
2108		VCAP_KF_IP4_IS,
2109		VCAP_KF_L3_FRAGMENT_TYPE,
2110		VCAP_KF_L3_FRAG_INVLD_L4_LEN,
2111		VCAP_KF_L3_OPTIONS_IS,
2112		VCAP_KF_L3_DSCP,
2113		VCAP_KF_TCP_UDP_IS,
2114		VCAP_KF_TCP_IS,
2115	};
2116	struct vcap_client_keyfield *ckf, *next;
2117	bool ret;
2118	int idx;
2119
2120	/* Add all keys to the rule */
2121	INIT_LIST_HEAD(&ri.data.keyfields);
2122	for (idx = 0; idx < ARRAY_SIZE(keylist); idx++) {
2123		ckf = kzalloc(sizeof(*ckf), GFP_KERNEL);
2124		if (ckf) {
2125			ckf->ctrl.key = keylist[idx];
2126			list_add_tail(&ckf->ctrl.list, &ri.data.keyfields);
2127		}
2128	}
2129
2130	KUNIT_EXPECT_EQ(test, 38, ARRAY_SIZE(keylist));
2131
2132	/* Drop listed keys from the rule */
2133	ret = vcap_filter_rule_keys(&ri.data, droplist, ARRAY_SIZE(droplist),
2134				    false);
2135
2136	KUNIT_EXPECT_EQ(test, 0, ret);
2137
2138	/* Check remaining keys in the rule */
2139	idx = 0;
2140	list_for_each_entry_safe(ckf, next, &ri.data.keyfields, ctrl.list) {
2141		KUNIT_EXPECT_EQ(test, expected[idx], ckf->ctrl.key);
2142		list_del(&ckf->ctrl.list);
2143		kfree(ckf);
2144		++idx;
2145	}
2146	KUNIT_EXPECT_EQ(test, 26, idx);
2147}
2148
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2149static struct kunit_suite vcap_api_rule_remove_test_suite = {
2150	.name = "VCAP_API_Rule_Remove_Testsuite",
2151	.test_cases = vcap_api_rule_remove_test_cases,
2152};
2153
2154static struct kunit_case vcap_api_rule_insert_test_cases[] = {
2155	KUNIT_CASE(vcap_api_rule_insert_in_order_test),
2156	KUNIT_CASE(vcap_api_rule_insert_reverse_order_test),
2157	{}
2158};
2159
2160static struct kunit_suite vcap_api_rule_insert_test_suite = {
2161	.name = "VCAP_API_Rule_Insert_Testsuite",
2162	.test_cases = vcap_api_rule_insert_test_cases,
2163};
2164
2165static struct kunit_case vcap_api_rule_counter_test_cases[] = {
2166	KUNIT_CASE(vcap_api_set_rule_counter_test),
2167	KUNIT_CASE(vcap_api_get_rule_counter_test),
2168	{}
2169};
2170
2171static struct kunit_suite vcap_api_rule_counter_test_suite = {
2172	.name = "VCAP_API_Rule_Counter_Testsuite",
2173	.test_cases = vcap_api_rule_counter_test_cases,
2174};
2175
2176static struct kunit_case vcap_api_support_test_cases[] = {
2177	KUNIT_CASE(vcap_api_next_lookup_basic_test),
2178	KUNIT_CASE(vcap_api_next_lookup_advanced_test),
2179	KUNIT_CASE(vcap_api_filter_unsupported_keys_test),
2180	KUNIT_CASE(vcap_api_filter_keylist_test),
2181	{}
2182};
2183
2184static struct kunit_suite vcap_api_support_test_suite = {
2185	.name = "VCAP_API_Support_Testsuite",
2186	.test_cases = vcap_api_support_test_cases,
2187};
2188
2189static struct kunit_case vcap_api_full_rule_test_cases[] = {
2190	KUNIT_CASE(vcap_api_rule_find_keyset_basic_test),
2191	KUNIT_CASE(vcap_api_rule_find_keyset_failed_test),
2192	KUNIT_CASE(vcap_api_rule_find_keyset_many_test),
2193	KUNIT_CASE(vcap_api_encode_rule_test),
2194	{}
2195};
2196
2197static struct kunit_suite vcap_api_full_rule_test_suite = {
2198	.name = "VCAP_API_Full_Rule_Testsuite",
2199	.test_cases = vcap_api_full_rule_test_cases,
2200};
2201
2202static struct kunit_case vcap_api_rule_value_test_cases[] = {
2203	KUNIT_CASE(vcap_api_rule_add_keyvalue_test),
2204	KUNIT_CASE(vcap_api_rule_add_actionvalue_test),
2205	{}
2206};
2207
2208static struct kunit_suite vcap_api_rule_value_test_suite = {
2209	.name = "VCAP_API_Rule_Value_Testsuite",
2210	.test_cases = vcap_api_rule_value_test_cases,
2211};
2212
2213static struct kunit_case vcap_api_encoding_test_cases[] = {
2214	KUNIT_CASE(vcap_api_set_bit_1_test),
2215	KUNIT_CASE(vcap_api_set_bit_0_test),
2216	KUNIT_CASE(vcap_api_iterator_init_test),
2217	KUNIT_CASE(vcap_api_iterator_next_test),
2218	KUNIT_CASE(vcap_api_encode_typegroups_test),
2219	KUNIT_CASE(vcap_api_encode_bit_test),
2220	KUNIT_CASE(vcap_api_encode_field_test),
2221	KUNIT_CASE(vcap_api_encode_short_field_test),
2222	KUNIT_CASE(vcap_api_encode_keyfield_test),
2223	KUNIT_CASE(vcap_api_encode_max_keyfield_test),
2224	KUNIT_CASE(vcap_api_encode_actionfield_test),
2225	KUNIT_CASE(vcap_api_keyfield_typegroup_test),
2226	KUNIT_CASE(vcap_api_actionfield_typegroup_test),
2227	KUNIT_CASE(vcap_api_vcap_keyfields_test),
2228	KUNIT_CASE(vcap_api_vcap_actionfields_test),
2229	KUNIT_CASE(vcap_api_encode_rule_keyset_test),
2230	KUNIT_CASE(vcap_api_encode_rule_actionset_test),
2231	{}
2232};
2233
2234static struct kunit_suite vcap_api_encoding_test_suite = {
2235	.name = "VCAP_API_Encoding_Testsuite",
2236	.test_cases = vcap_api_encoding_test_cases,
2237};
2238
 
2239kunit_test_suite(vcap_api_rule_remove_test_suite);
2240kunit_test_suite(vcap_api_rule_insert_test_suite);
2241kunit_test_suite(vcap_api_rule_counter_test_suite);
2242kunit_test_suite(vcap_api_support_test_suite);
2243kunit_test_suite(vcap_api_full_rule_test_suite);
2244kunit_test_suite(vcap_api_rule_value_test_suite);
2245kunit_test_suite(vcap_api_encoding_test_suite);