cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

route-test.c (15896B)


      1// SPDX-License-Identifier: GPL-2.0
      2
      3#include <kunit/test.h>
      4
      5#include "utils.h"
      6
      7struct mctp_test_route {
      8	struct mctp_route	rt;
      9	struct sk_buff_head	pkts;
     10};
     11
     12static int mctp_test_route_output(struct mctp_route *rt, struct sk_buff *skb)
     13{
     14	struct mctp_test_route *test_rt = container_of(rt, struct mctp_test_route, rt);
     15
     16	skb_queue_tail(&test_rt->pkts, skb);
     17
     18	return 0;
     19}
     20
     21/* local version of mctp_route_alloc() */
     22static struct mctp_test_route *mctp_route_test_alloc(void)
     23{
     24	struct mctp_test_route *rt;
     25
     26	rt = kzalloc(sizeof(*rt), GFP_KERNEL);
     27	if (!rt)
     28		return NULL;
     29
     30	INIT_LIST_HEAD(&rt->rt.list);
     31	refcount_set(&rt->rt.refs, 1);
     32	rt->rt.output = mctp_test_route_output;
     33
     34	skb_queue_head_init(&rt->pkts);
     35
     36	return rt;
     37}
     38
     39static struct mctp_test_route *mctp_test_create_route(struct net *net,
     40						      struct mctp_dev *dev,
     41						      mctp_eid_t eid,
     42						      unsigned int mtu)
     43{
     44	struct mctp_test_route *rt;
     45
     46	rt = mctp_route_test_alloc();
     47	if (!rt)
     48		return NULL;
     49
     50	rt->rt.min = eid;
     51	rt->rt.max = eid;
     52	rt->rt.mtu = mtu;
     53	rt->rt.type = RTN_UNSPEC;
     54	if (dev)
     55		mctp_dev_hold(dev);
     56	rt->rt.dev = dev;
     57
     58	list_add_rcu(&rt->rt.list, &net->mctp.routes);
     59
     60	return rt;
     61}
     62
     63static void mctp_test_route_destroy(struct kunit *test,
     64				    struct mctp_test_route *rt)
     65{
     66	unsigned int refs;
     67
     68	rtnl_lock();
     69	list_del_rcu(&rt->rt.list);
     70	rtnl_unlock();
     71
     72	skb_queue_purge(&rt->pkts);
     73	if (rt->rt.dev)
     74		mctp_dev_put(rt->rt.dev);
     75
     76	refs = refcount_read(&rt->rt.refs);
     77	KUNIT_ASSERT_EQ_MSG(test, refs, 1, "route ref imbalance");
     78
     79	kfree_rcu(&rt->rt, rcu);
     80}
     81
     82static struct sk_buff *mctp_test_create_skb(const struct mctp_hdr *hdr,
     83					    unsigned int data_len)
     84{
     85	size_t hdr_len = sizeof(*hdr);
     86	struct sk_buff *skb;
     87	unsigned int i;
     88	u8 *buf;
     89
     90	skb = alloc_skb(hdr_len + data_len, GFP_KERNEL);
     91	if (!skb)
     92		return NULL;
     93
     94	memcpy(skb_put(skb, hdr_len), hdr, hdr_len);
     95
     96	buf = skb_put(skb, data_len);
     97	for (i = 0; i < data_len; i++)
     98		buf[i] = i & 0xff;
     99
    100	return skb;
    101}
    102
    103static struct sk_buff *__mctp_test_create_skb_data(const struct mctp_hdr *hdr,
    104						   const void *data,
    105						   size_t data_len)
    106{
    107	size_t hdr_len = sizeof(*hdr);
    108	struct sk_buff *skb;
    109
    110	skb = alloc_skb(hdr_len + data_len, GFP_KERNEL);
    111	if (!skb)
    112		return NULL;
    113
    114	memcpy(skb_put(skb, hdr_len), hdr, hdr_len);
    115	memcpy(skb_put(skb, data_len), data, data_len);
    116
    117	return skb;
    118}
    119
    120#define mctp_test_create_skb_data(h, d) \
    121	__mctp_test_create_skb_data(h, d, sizeof(*d))
    122
    123struct mctp_frag_test {
    124	unsigned int mtu;
    125	unsigned int msgsize;
    126	unsigned int n_frags;
    127};
    128
    129static void mctp_test_fragment(struct kunit *test)
    130{
    131	const struct mctp_frag_test *params;
    132	int rc, i, n, mtu, msgsize;
    133	struct mctp_test_route *rt;
    134	struct sk_buff *skb;
    135	struct mctp_hdr hdr;
    136	u8 seq;
    137
    138	params = test->param_value;
    139	mtu = params->mtu;
    140	msgsize = params->msgsize;
    141
    142	hdr.ver = 1;
    143	hdr.src = 8;
    144	hdr.dest = 10;
    145	hdr.flags_seq_tag = MCTP_HDR_FLAG_TO;
    146
    147	skb = mctp_test_create_skb(&hdr, msgsize);
    148	KUNIT_ASSERT_TRUE(test, skb);
    149
    150	rt = mctp_test_create_route(&init_net, NULL, 10, mtu);
    151	KUNIT_ASSERT_TRUE(test, rt);
    152
    153	rc = mctp_do_fragment_route(&rt->rt, skb, mtu, MCTP_TAG_OWNER);
    154	KUNIT_EXPECT_FALSE(test, rc);
    155
    156	n = rt->pkts.qlen;
    157
    158	KUNIT_EXPECT_EQ(test, n, params->n_frags);
    159
    160	for (i = 0;; i++) {
    161		struct mctp_hdr *hdr2;
    162		struct sk_buff *skb2;
    163		u8 tag_mask, seq2;
    164		bool first, last;
    165
    166		first = i == 0;
    167		last = i == (n - 1);
    168
    169		skb2 = skb_dequeue(&rt->pkts);
    170
    171		if (!skb2)
    172			break;
    173
    174		hdr2 = mctp_hdr(skb2);
    175
    176		tag_mask = MCTP_HDR_TAG_MASK | MCTP_HDR_FLAG_TO;
    177
    178		KUNIT_EXPECT_EQ(test, hdr2->ver, hdr.ver);
    179		KUNIT_EXPECT_EQ(test, hdr2->src, hdr.src);
    180		KUNIT_EXPECT_EQ(test, hdr2->dest, hdr.dest);
    181		KUNIT_EXPECT_EQ(test, hdr2->flags_seq_tag & tag_mask,
    182				hdr.flags_seq_tag & tag_mask);
    183
    184		KUNIT_EXPECT_EQ(test,
    185				!!(hdr2->flags_seq_tag & MCTP_HDR_FLAG_SOM), first);
    186		KUNIT_EXPECT_EQ(test,
    187				!!(hdr2->flags_seq_tag & MCTP_HDR_FLAG_EOM), last);
    188
    189		seq2 = (hdr2->flags_seq_tag >> MCTP_HDR_SEQ_SHIFT) &
    190			MCTP_HDR_SEQ_MASK;
    191
    192		if (first) {
    193			seq = seq2;
    194		} else {
    195			seq++;
    196			KUNIT_EXPECT_EQ(test, seq2, seq & MCTP_HDR_SEQ_MASK);
    197		}
    198
    199		if (!last)
    200			KUNIT_EXPECT_EQ(test, skb2->len, mtu);
    201		else
    202			KUNIT_EXPECT_LE(test, skb2->len, mtu);
    203
    204		kfree_skb(skb2);
    205	}
    206
    207	mctp_test_route_destroy(test, rt);
    208}
    209
    210static const struct mctp_frag_test mctp_frag_tests[] = {
    211	{.mtu = 68, .msgsize = 63, .n_frags = 1},
    212	{.mtu = 68, .msgsize = 64, .n_frags = 1},
    213	{.mtu = 68, .msgsize = 65, .n_frags = 2},
    214	{.mtu = 68, .msgsize = 66, .n_frags = 2},
    215	{.mtu = 68, .msgsize = 127, .n_frags = 2},
    216	{.mtu = 68, .msgsize = 128, .n_frags = 2},
    217	{.mtu = 68, .msgsize = 129, .n_frags = 3},
    218	{.mtu = 68, .msgsize = 130, .n_frags = 3},
    219};
    220
    221static void mctp_frag_test_to_desc(const struct mctp_frag_test *t, char *desc)
    222{
    223	sprintf(desc, "mtu %d len %d -> %d frags",
    224		t->msgsize, t->mtu, t->n_frags);
    225}
    226
    227KUNIT_ARRAY_PARAM(mctp_frag, mctp_frag_tests, mctp_frag_test_to_desc);
    228
    229struct mctp_rx_input_test {
    230	struct mctp_hdr hdr;
    231	bool input;
    232};
    233
    234static void mctp_test_rx_input(struct kunit *test)
    235{
    236	const struct mctp_rx_input_test *params;
    237	struct mctp_test_route *rt;
    238	struct mctp_test_dev *dev;
    239	struct sk_buff *skb;
    240
    241	params = test->param_value;
    242
    243	dev = mctp_test_create_dev();
    244	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
    245
    246	rt = mctp_test_create_route(&init_net, dev->mdev, 8, 68);
    247	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, rt);
    248
    249	skb = mctp_test_create_skb(&params->hdr, 1);
    250	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb);
    251
    252	__mctp_cb(skb);
    253
    254	mctp_pkttype_receive(skb, dev->ndev, &mctp_packet_type, NULL);
    255
    256	KUNIT_EXPECT_EQ(test, !!rt->pkts.qlen, params->input);
    257
    258	mctp_test_route_destroy(test, rt);
    259	mctp_test_destroy_dev(dev);
    260}
    261
    262#define RX_HDR(_ver, _src, _dest, _fst) \
    263	{ .ver = _ver, .src = _src, .dest = _dest, .flags_seq_tag = _fst }
    264
    265/* we have a route for EID 8 only */
    266static const struct mctp_rx_input_test mctp_rx_input_tests[] = {
    267	{ .hdr = RX_HDR(1, 10, 8, 0), .input = true },
    268	{ .hdr = RX_HDR(1, 10, 9, 0), .input = false }, /* no input route */
    269	{ .hdr = RX_HDR(2, 10, 8, 0), .input = false }, /* invalid version */
    270};
    271
    272static void mctp_rx_input_test_to_desc(const struct mctp_rx_input_test *t,
    273				       char *desc)
    274{
    275	sprintf(desc, "{%x,%x,%x,%x}", t->hdr.ver, t->hdr.src, t->hdr.dest,
    276		t->hdr.flags_seq_tag);
    277}
    278
    279KUNIT_ARRAY_PARAM(mctp_rx_input, mctp_rx_input_tests,
    280		  mctp_rx_input_test_to_desc);
    281
    282/* set up a local dev, route on EID 8, and a socket listening on type 0 */
    283static void __mctp_route_test_init(struct kunit *test,
    284				   struct mctp_test_dev **devp,
    285				   struct mctp_test_route **rtp,
    286				   struct socket **sockp)
    287{
    288	struct sockaddr_mctp addr = {0};
    289	struct mctp_test_route *rt;
    290	struct mctp_test_dev *dev;
    291	struct socket *sock;
    292	int rc;
    293
    294	dev = mctp_test_create_dev();
    295	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
    296
    297	rt = mctp_test_create_route(&init_net, dev->mdev, 8, 68);
    298	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, rt);
    299
    300	rc = sock_create_kern(&init_net, AF_MCTP, SOCK_DGRAM, 0, &sock);
    301	KUNIT_ASSERT_EQ(test, rc, 0);
    302
    303	addr.smctp_family = AF_MCTP;
    304	addr.smctp_network = MCTP_NET_ANY;
    305	addr.smctp_addr.s_addr = 8;
    306	addr.smctp_type = 0;
    307	rc = kernel_bind(sock, (struct sockaddr *)&addr, sizeof(addr));
    308	KUNIT_ASSERT_EQ(test, rc, 0);
    309
    310	*rtp = rt;
    311	*devp = dev;
    312	*sockp = sock;
    313}
    314
    315static void __mctp_route_test_fini(struct kunit *test,
    316				   struct mctp_test_dev *dev,
    317				   struct mctp_test_route *rt,
    318				   struct socket *sock)
    319{
    320	sock_release(sock);
    321	mctp_test_route_destroy(test, rt);
    322	mctp_test_destroy_dev(dev);
    323}
    324
    325struct mctp_route_input_sk_test {
    326	struct mctp_hdr hdr;
    327	u8 type;
    328	bool deliver;
    329};
    330
    331static void mctp_test_route_input_sk(struct kunit *test)
    332{
    333	const struct mctp_route_input_sk_test *params;
    334	struct sk_buff *skb, *skb2;
    335	struct mctp_test_route *rt;
    336	struct mctp_test_dev *dev;
    337	struct socket *sock;
    338	int rc;
    339
    340	params = test->param_value;
    341
    342	__mctp_route_test_init(test, &dev, &rt, &sock);
    343
    344	skb = mctp_test_create_skb_data(&params->hdr, &params->type);
    345	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb);
    346
    347	skb->dev = dev->ndev;
    348	__mctp_cb(skb);
    349
    350	rc = mctp_route_input(&rt->rt, skb);
    351
    352	if (params->deliver) {
    353		KUNIT_EXPECT_EQ(test, rc, 0);
    354
    355		skb2 = skb_recv_datagram(sock->sk, MSG_DONTWAIT, &rc);
    356		KUNIT_EXPECT_NOT_ERR_OR_NULL(test, skb2);
    357		KUNIT_EXPECT_EQ(test, skb->len, 1);
    358
    359		skb_free_datagram(sock->sk, skb2);
    360
    361	} else {
    362		KUNIT_EXPECT_NE(test, rc, 0);
    363		skb2 = skb_recv_datagram(sock->sk, MSG_DONTWAIT, &rc);
    364		KUNIT_EXPECT_NULL(test, skb2);
    365	}
    366
    367	__mctp_route_test_fini(test, dev, rt, sock);
    368}
    369
    370#define FL_S	(MCTP_HDR_FLAG_SOM)
    371#define FL_E	(MCTP_HDR_FLAG_EOM)
    372#define FL_TO	(MCTP_HDR_FLAG_TO)
    373#define FL_T(t)	((t) & MCTP_HDR_TAG_MASK)
    374
    375static const struct mctp_route_input_sk_test mctp_route_input_sk_tests[] = {
    376	{ .hdr = RX_HDR(1, 10, 8, FL_S | FL_E | FL_TO), .type = 0, .deliver = true },
    377	{ .hdr = RX_HDR(1, 10, 8, FL_S | FL_E | FL_TO), .type = 1, .deliver = false },
    378	{ .hdr = RX_HDR(1, 10, 8, FL_S | FL_E), .type = 0, .deliver = false },
    379	{ .hdr = RX_HDR(1, 10, 8, FL_E | FL_TO), .type = 0, .deliver = false },
    380	{ .hdr = RX_HDR(1, 10, 8, FL_TO), .type = 0, .deliver = false },
    381	{ .hdr = RX_HDR(1, 10, 8, 0), .type = 0, .deliver = false },
    382};
    383
    384static void mctp_route_input_sk_to_desc(const struct mctp_route_input_sk_test *t,
    385					char *desc)
    386{
    387	sprintf(desc, "{%x,%x,%x,%x} type %d", t->hdr.ver, t->hdr.src,
    388		t->hdr.dest, t->hdr.flags_seq_tag, t->type);
    389}
    390
    391KUNIT_ARRAY_PARAM(mctp_route_input_sk, mctp_route_input_sk_tests,
    392		  mctp_route_input_sk_to_desc);
    393
    394struct mctp_route_input_sk_reasm_test {
    395	const char *name;
    396	struct mctp_hdr hdrs[4];
    397	int n_hdrs;
    398	int rx_len;
    399};
    400
    401static void mctp_test_route_input_sk_reasm(struct kunit *test)
    402{
    403	const struct mctp_route_input_sk_reasm_test *params;
    404	struct sk_buff *skb, *skb2;
    405	struct mctp_test_route *rt;
    406	struct mctp_test_dev *dev;
    407	struct socket *sock;
    408	int i, rc;
    409	u8 c;
    410
    411	params = test->param_value;
    412
    413	__mctp_route_test_init(test, &dev, &rt, &sock);
    414
    415	for (i = 0; i < params->n_hdrs; i++) {
    416		c = i;
    417		skb = mctp_test_create_skb_data(&params->hdrs[i], &c);
    418		KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb);
    419
    420		skb->dev = dev->ndev;
    421		__mctp_cb(skb);
    422
    423		rc = mctp_route_input(&rt->rt, skb);
    424	}
    425
    426	skb2 = skb_recv_datagram(sock->sk, MSG_DONTWAIT, &rc);
    427
    428	if (params->rx_len) {
    429		KUNIT_EXPECT_NOT_ERR_OR_NULL(test, skb2);
    430		KUNIT_EXPECT_EQ(test, skb2->len, params->rx_len);
    431		skb_free_datagram(sock->sk, skb2);
    432
    433	} else {
    434		KUNIT_EXPECT_NULL(test, skb2);
    435	}
    436
    437	__mctp_route_test_fini(test, dev, rt, sock);
    438}
    439
    440#define RX_FRAG(f, s) RX_HDR(1, 10, 8, FL_TO | (f) | ((s) << MCTP_HDR_SEQ_SHIFT))
    441
    442static const struct mctp_route_input_sk_reasm_test mctp_route_input_sk_reasm_tests[] = {
    443	{
    444		.name = "single packet",
    445		.hdrs = {
    446			RX_FRAG(FL_S | FL_E, 0),
    447		},
    448		.n_hdrs = 1,
    449		.rx_len = 1,
    450	},
    451	{
    452		.name = "single packet, offset seq",
    453		.hdrs = {
    454			RX_FRAG(FL_S | FL_E, 1),
    455		},
    456		.n_hdrs = 1,
    457		.rx_len = 1,
    458	},
    459	{
    460		.name = "start & end packets",
    461		.hdrs = {
    462			RX_FRAG(FL_S, 0),
    463			RX_FRAG(FL_E, 1),
    464		},
    465		.n_hdrs = 2,
    466		.rx_len = 2,
    467	},
    468	{
    469		.name = "start & end packets, offset seq",
    470		.hdrs = {
    471			RX_FRAG(FL_S, 1),
    472			RX_FRAG(FL_E, 2),
    473		},
    474		.n_hdrs = 2,
    475		.rx_len = 2,
    476	},
    477	{
    478		.name = "start & end packets, out of order",
    479		.hdrs = {
    480			RX_FRAG(FL_E, 1),
    481			RX_FRAG(FL_S, 0),
    482		},
    483		.n_hdrs = 2,
    484		.rx_len = 0,
    485	},
    486	{
    487		.name = "start, middle & end packets",
    488		.hdrs = {
    489			RX_FRAG(FL_S, 0),
    490			RX_FRAG(0,    1),
    491			RX_FRAG(FL_E, 2),
    492		},
    493		.n_hdrs = 3,
    494		.rx_len = 3,
    495	},
    496	{
    497		.name = "missing seq",
    498		.hdrs = {
    499			RX_FRAG(FL_S, 0),
    500			RX_FRAG(FL_E, 2),
    501		},
    502		.n_hdrs = 2,
    503		.rx_len = 0,
    504	},
    505	{
    506		.name = "seq wrap",
    507		.hdrs = {
    508			RX_FRAG(FL_S, 3),
    509			RX_FRAG(FL_E, 0),
    510		},
    511		.n_hdrs = 2,
    512		.rx_len = 2,
    513	},
    514};
    515
    516static void mctp_route_input_sk_reasm_to_desc(
    517				const struct mctp_route_input_sk_reasm_test *t,
    518				char *desc)
    519{
    520	sprintf(desc, "%s", t->name);
    521}
    522
    523KUNIT_ARRAY_PARAM(mctp_route_input_sk_reasm, mctp_route_input_sk_reasm_tests,
    524		  mctp_route_input_sk_reasm_to_desc);
    525
    526struct mctp_route_input_sk_keys_test {
    527	const char	*name;
    528	mctp_eid_t	key_peer_addr;
    529	mctp_eid_t	key_local_addr;
    530	u8		key_tag;
    531	struct mctp_hdr hdr;
    532	bool		deliver;
    533};
    534
    535/* test packet rx in the presence of various key configurations */
    536static void mctp_test_route_input_sk_keys(struct kunit *test)
    537{
    538	const struct mctp_route_input_sk_keys_test *params;
    539	struct mctp_test_route *rt;
    540	struct sk_buff *skb, *skb2;
    541	struct mctp_test_dev *dev;
    542	struct mctp_sk_key *key;
    543	struct netns_mctp *mns;
    544	struct mctp_sock *msk;
    545	struct socket *sock;
    546	unsigned long flags;
    547	int rc;
    548	u8 c;
    549
    550	params = test->param_value;
    551
    552	dev = mctp_test_create_dev();
    553	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
    554
    555	rt = mctp_test_create_route(&init_net, dev->mdev, 8, 68);
    556	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, rt);
    557
    558	rc = sock_create_kern(&init_net, AF_MCTP, SOCK_DGRAM, 0, &sock);
    559	KUNIT_ASSERT_EQ(test, rc, 0);
    560
    561	msk = container_of(sock->sk, struct mctp_sock, sk);
    562	mns = &sock_net(sock->sk)->mctp;
    563
    564	/* set the incoming tag according to test params */
    565	key = mctp_key_alloc(msk, params->key_local_addr, params->key_peer_addr,
    566			     params->key_tag, GFP_KERNEL);
    567
    568	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, key);
    569
    570	spin_lock_irqsave(&mns->keys_lock, flags);
    571	mctp_reserve_tag(&init_net, key, msk);
    572	spin_unlock_irqrestore(&mns->keys_lock, flags);
    573
    574	/* create packet and route */
    575	c = 0;
    576	skb = mctp_test_create_skb_data(&params->hdr, &c);
    577	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb);
    578
    579	skb->dev = dev->ndev;
    580	__mctp_cb(skb);
    581
    582	rc = mctp_route_input(&rt->rt, skb);
    583
    584	/* (potentially) receive message */
    585	skb2 = skb_recv_datagram(sock->sk, MSG_DONTWAIT, &rc);
    586
    587	if (params->deliver)
    588		KUNIT_EXPECT_NOT_ERR_OR_NULL(test, skb2);
    589	else
    590		KUNIT_EXPECT_PTR_EQ(test, skb2, NULL);
    591
    592	if (skb2)
    593		skb_free_datagram(sock->sk, skb2);
    594
    595	mctp_key_unref(key);
    596	__mctp_route_test_fini(test, dev, rt, sock);
    597}
    598
    599static const struct mctp_route_input_sk_keys_test mctp_route_input_sk_keys_tests[] = {
    600	{
    601		.name = "direct match",
    602		.key_peer_addr = 9,
    603		.key_local_addr = 8,
    604		.key_tag = 1,
    605		.hdr = RX_HDR(1, 9, 8, FL_S | FL_E | FL_T(1)),
    606		.deliver = true,
    607	},
    608	{
    609		.name = "flipped src/dest",
    610		.key_peer_addr = 8,
    611		.key_local_addr = 9,
    612		.key_tag = 1,
    613		.hdr = RX_HDR(1, 9, 8, FL_S | FL_E | FL_T(1)),
    614		.deliver = false,
    615	},
    616	{
    617		.name = "peer addr mismatch",
    618		.key_peer_addr = 9,
    619		.key_local_addr = 8,
    620		.key_tag = 1,
    621		.hdr = RX_HDR(1, 10, 8, FL_S | FL_E | FL_T(1)),
    622		.deliver = false,
    623	},
    624	{
    625		.name = "tag value mismatch",
    626		.key_peer_addr = 9,
    627		.key_local_addr = 8,
    628		.key_tag = 1,
    629		.hdr = RX_HDR(1, 9, 8, FL_S | FL_E | FL_T(2)),
    630		.deliver = false,
    631	},
    632	{
    633		.name = "TO mismatch",
    634		.key_peer_addr = 9,
    635		.key_local_addr = 8,
    636		.key_tag = 1,
    637		.hdr = RX_HDR(1, 9, 8, FL_S | FL_E | FL_T(1) | FL_TO),
    638		.deliver = false,
    639	},
    640	{
    641		.name = "broadcast response",
    642		.key_peer_addr = MCTP_ADDR_ANY,
    643		.key_local_addr = 8,
    644		.key_tag = 1,
    645		.hdr = RX_HDR(1, 11, 8, FL_S | FL_E | FL_T(1)),
    646		.deliver = true,
    647	},
    648	{
    649		.name = "any local match",
    650		.key_peer_addr = 12,
    651		.key_local_addr = MCTP_ADDR_ANY,
    652		.key_tag = 1,
    653		.hdr = RX_HDR(1, 12, 8, FL_S | FL_E | FL_T(1)),
    654		.deliver = true,
    655	},
    656};
    657
    658static void mctp_route_input_sk_keys_to_desc(
    659				const struct mctp_route_input_sk_keys_test *t,
    660				char *desc)
    661{
    662	sprintf(desc, "%s", t->name);
    663}
    664
    665KUNIT_ARRAY_PARAM(mctp_route_input_sk_keys, mctp_route_input_sk_keys_tests,
    666		  mctp_route_input_sk_keys_to_desc);
    667
    668static struct kunit_case mctp_test_cases[] = {
    669	KUNIT_CASE_PARAM(mctp_test_fragment, mctp_frag_gen_params),
    670	KUNIT_CASE_PARAM(mctp_test_rx_input, mctp_rx_input_gen_params),
    671	KUNIT_CASE_PARAM(mctp_test_route_input_sk, mctp_route_input_sk_gen_params),
    672	KUNIT_CASE_PARAM(mctp_test_route_input_sk_reasm,
    673			 mctp_route_input_sk_reasm_gen_params),
    674	KUNIT_CASE_PARAM(mctp_test_route_input_sk_keys,
    675			 mctp_route_input_sk_keys_gen_params),
    676	{}
    677};
    678
    679static struct kunit_suite mctp_test_suite = {
    680	.name = "mctp",
    681	.test_cases = mctp_test_cases,
    682};
    683
    684kunit_test_suite(mctp_test_suite);