xref: /openbmc/linux/net/mctp/test/route-test.c (revision f4b41f06)
1161eba50SJeremy Kerr // SPDX-License-Identifier: GPL-2.0
2161eba50SJeremy Kerr 
3161eba50SJeremy Kerr #include <kunit/test.h>
4161eba50SJeremy Kerr 
5b504db40SJeremy Kerr #include "utils.h"
6b504db40SJeremy Kerr 
7161eba50SJeremy Kerr struct mctp_test_route {
8161eba50SJeremy Kerr 	struct mctp_route	rt;
9161eba50SJeremy Kerr 	struct sk_buff_head	pkts;
10161eba50SJeremy Kerr };
11161eba50SJeremy Kerr 
mctp_test_route_output(struct mctp_route * rt,struct sk_buff * skb)12161eba50SJeremy Kerr static int mctp_test_route_output(struct mctp_route *rt, struct sk_buff *skb)
13161eba50SJeremy Kerr {
14161eba50SJeremy Kerr 	struct mctp_test_route *test_rt = container_of(rt, struct mctp_test_route, rt);
15161eba50SJeremy Kerr 
16161eba50SJeremy Kerr 	skb_queue_tail(&test_rt->pkts, skb);
17161eba50SJeremy Kerr 
18161eba50SJeremy Kerr 	return 0;
19161eba50SJeremy Kerr }
20161eba50SJeremy Kerr 
21161eba50SJeremy Kerr /* local version of mctp_route_alloc() */
mctp_route_test_alloc(void)22161eba50SJeremy Kerr static struct mctp_test_route *mctp_route_test_alloc(void)
23161eba50SJeremy Kerr {
24161eba50SJeremy Kerr 	struct mctp_test_route *rt;
25161eba50SJeremy Kerr 
26161eba50SJeremy Kerr 	rt = kzalloc(sizeof(*rt), GFP_KERNEL);
27161eba50SJeremy Kerr 	if (!rt)
28161eba50SJeremy Kerr 		return NULL;
29161eba50SJeremy Kerr 
30161eba50SJeremy Kerr 	INIT_LIST_HEAD(&rt->rt.list);
31161eba50SJeremy Kerr 	refcount_set(&rt->rt.refs, 1);
32161eba50SJeremy Kerr 	rt->rt.output = mctp_test_route_output;
33161eba50SJeremy Kerr 
34161eba50SJeremy Kerr 	skb_queue_head_init(&rt->pkts);
35161eba50SJeremy Kerr 
36161eba50SJeremy Kerr 	return rt;
37161eba50SJeremy Kerr }
38161eba50SJeremy Kerr 
mctp_test_create_route(struct net * net,struct mctp_dev * dev,mctp_eid_t eid,unsigned int mtu)39161eba50SJeremy Kerr static struct mctp_test_route *mctp_test_create_route(struct net *net,
40b504db40SJeremy Kerr 						      struct mctp_dev *dev,
41161eba50SJeremy Kerr 						      mctp_eid_t eid,
42161eba50SJeremy Kerr 						      unsigned int mtu)
43161eba50SJeremy Kerr {
44161eba50SJeremy Kerr 	struct mctp_test_route *rt;
45161eba50SJeremy Kerr 
46161eba50SJeremy Kerr 	rt = mctp_route_test_alloc();
47161eba50SJeremy Kerr 	if (!rt)
48161eba50SJeremy Kerr 		return NULL;
49161eba50SJeremy Kerr 
50161eba50SJeremy Kerr 	rt->rt.min = eid;
51161eba50SJeremy Kerr 	rt->rt.max = eid;
52161eba50SJeremy Kerr 	rt->rt.mtu = mtu;
53161eba50SJeremy Kerr 	rt->rt.type = RTN_UNSPEC;
54b504db40SJeremy Kerr 	if (dev)
55b504db40SJeremy Kerr 		mctp_dev_hold(dev);
56b504db40SJeremy Kerr 	rt->rt.dev = dev;
57161eba50SJeremy Kerr 
58161eba50SJeremy Kerr 	list_add_rcu(&rt->rt.list, &net->mctp.routes);
59161eba50SJeremy Kerr 
60161eba50SJeremy Kerr 	return rt;
61161eba50SJeremy Kerr }
62161eba50SJeremy Kerr 
mctp_test_route_destroy(struct kunit * test,struct mctp_test_route * rt)63161eba50SJeremy Kerr static void mctp_test_route_destroy(struct kunit *test,
64161eba50SJeremy Kerr 				    struct mctp_test_route *rt)
65161eba50SJeremy Kerr {
66161eba50SJeremy Kerr 	unsigned int refs;
67161eba50SJeremy Kerr 
68161eba50SJeremy Kerr 	rtnl_lock();
69161eba50SJeremy Kerr 	list_del_rcu(&rt->rt.list);
70161eba50SJeremy Kerr 	rtnl_unlock();
71161eba50SJeremy Kerr 
72161eba50SJeremy Kerr 	skb_queue_purge(&rt->pkts);
73b504db40SJeremy Kerr 	if (rt->rt.dev)
74b504db40SJeremy Kerr 		mctp_dev_put(rt->rt.dev);
75161eba50SJeremy Kerr 
76161eba50SJeremy Kerr 	refs = refcount_read(&rt->rt.refs);
77161eba50SJeremy Kerr 	KUNIT_ASSERT_EQ_MSG(test, refs, 1, "route ref imbalance");
78161eba50SJeremy Kerr 
79161eba50SJeremy Kerr 	kfree_rcu(&rt->rt, rcu);
80161eba50SJeremy Kerr }
81161eba50SJeremy Kerr 
mctp_test_create_skb(const struct mctp_hdr * hdr,unsigned int data_len)82b504db40SJeremy Kerr static struct sk_buff *mctp_test_create_skb(const struct mctp_hdr *hdr,
83161eba50SJeremy Kerr 					    unsigned int data_len)
84161eba50SJeremy Kerr {
85161eba50SJeremy Kerr 	size_t hdr_len = sizeof(*hdr);
86161eba50SJeremy Kerr 	struct sk_buff *skb;
87161eba50SJeremy Kerr 	unsigned int i;
88161eba50SJeremy Kerr 	u8 *buf;
89161eba50SJeremy Kerr 
90161eba50SJeremy Kerr 	skb = alloc_skb(hdr_len + data_len, GFP_KERNEL);
91161eba50SJeremy Kerr 	if (!skb)
92161eba50SJeremy Kerr 		return NULL;
93161eba50SJeremy Kerr 
94161eba50SJeremy Kerr 	memcpy(skb_put(skb, hdr_len), hdr, hdr_len);
95161eba50SJeremy Kerr 
96161eba50SJeremy Kerr 	buf = skb_put(skb, data_len);
97161eba50SJeremy Kerr 	for (i = 0; i < data_len; i++)
98161eba50SJeremy Kerr 		buf[i] = i & 0xff;
99161eba50SJeremy Kerr 
100161eba50SJeremy Kerr 	return skb;
101161eba50SJeremy Kerr }
102161eba50SJeremy Kerr 
__mctp_test_create_skb_data(const struct mctp_hdr * hdr,const void * data,size_t data_len)1038892c049SJeremy Kerr static struct sk_buff *__mctp_test_create_skb_data(const struct mctp_hdr *hdr,
1048892c049SJeremy Kerr 						   const void *data,
1058892c049SJeremy Kerr 						   size_t data_len)
1068892c049SJeremy Kerr {
1078892c049SJeremy Kerr 	size_t hdr_len = sizeof(*hdr);
1088892c049SJeremy Kerr 	struct sk_buff *skb;
1098892c049SJeremy Kerr 
1108892c049SJeremy Kerr 	skb = alloc_skb(hdr_len + data_len, GFP_KERNEL);
1118892c049SJeremy Kerr 	if (!skb)
1128892c049SJeremy Kerr 		return NULL;
1138892c049SJeremy Kerr 
1148892c049SJeremy Kerr 	memcpy(skb_put(skb, hdr_len), hdr, hdr_len);
1158892c049SJeremy Kerr 	memcpy(skb_put(skb, data_len), data, data_len);
1168892c049SJeremy Kerr 
1178892c049SJeremy Kerr 	return skb;
1188892c049SJeremy Kerr }
1198892c049SJeremy Kerr 
1208892c049SJeremy Kerr #define mctp_test_create_skb_data(h, d) \
1218892c049SJeremy Kerr 	__mctp_test_create_skb_data(h, d, sizeof(*d))
1228892c049SJeremy Kerr 
123161eba50SJeremy Kerr struct mctp_frag_test {
124161eba50SJeremy Kerr 	unsigned int mtu;
125161eba50SJeremy Kerr 	unsigned int msgsize;
126161eba50SJeremy Kerr 	unsigned int n_frags;
127161eba50SJeremy Kerr };
128161eba50SJeremy Kerr 
mctp_test_fragment(struct kunit * test)129161eba50SJeremy Kerr static void mctp_test_fragment(struct kunit *test)
130161eba50SJeremy Kerr {
131161eba50SJeremy Kerr 	const struct mctp_frag_test *params;
132161eba50SJeremy Kerr 	int rc, i, n, mtu, msgsize;
133161eba50SJeremy Kerr 	struct mctp_test_route *rt;
134161eba50SJeremy Kerr 	struct sk_buff *skb;
135161eba50SJeremy Kerr 	struct mctp_hdr hdr;
136161eba50SJeremy Kerr 	u8 seq;
137161eba50SJeremy Kerr 
138161eba50SJeremy Kerr 	params = test->param_value;
139161eba50SJeremy Kerr 	mtu = params->mtu;
140161eba50SJeremy Kerr 	msgsize = params->msgsize;
141161eba50SJeremy Kerr 
142161eba50SJeremy Kerr 	hdr.ver = 1;
143161eba50SJeremy Kerr 	hdr.src = 8;
144161eba50SJeremy Kerr 	hdr.dest = 10;
145161eba50SJeremy Kerr 	hdr.flags_seq_tag = MCTP_HDR_FLAG_TO;
146161eba50SJeremy Kerr 
147161eba50SJeremy Kerr 	skb = mctp_test_create_skb(&hdr, msgsize);
148161eba50SJeremy Kerr 	KUNIT_ASSERT_TRUE(test, skb);
149161eba50SJeremy Kerr 
150b504db40SJeremy Kerr 	rt = mctp_test_create_route(&init_net, NULL, 10, mtu);
151161eba50SJeremy Kerr 	KUNIT_ASSERT_TRUE(test, rt);
152161eba50SJeremy Kerr 
153161eba50SJeremy Kerr 	rc = mctp_do_fragment_route(&rt->rt, skb, mtu, MCTP_TAG_OWNER);
154161eba50SJeremy Kerr 	KUNIT_EXPECT_FALSE(test, rc);
155161eba50SJeremy Kerr 
156161eba50SJeremy Kerr 	n = rt->pkts.qlen;
157161eba50SJeremy Kerr 
158161eba50SJeremy Kerr 	KUNIT_EXPECT_EQ(test, n, params->n_frags);
159161eba50SJeremy Kerr 
160161eba50SJeremy Kerr 	for (i = 0;; i++) {
161161eba50SJeremy Kerr 		struct mctp_hdr *hdr2;
162161eba50SJeremy Kerr 		struct sk_buff *skb2;
163161eba50SJeremy Kerr 		u8 tag_mask, seq2;
164161eba50SJeremy Kerr 		bool first, last;
165161eba50SJeremy Kerr 
166161eba50SJeremy Kerr 		first = i == 0;
167161eba50SJeremy Kerr 		last = i == (n - 1);
168161eba50SJeremy Kerr 
169161eba50SJeremy Kerr 		skb2 = skb_dequeue(&rt->pkts);
170161eba50SJeremy Kerr 
171161eba50SJeremy Kerr 		if (!skb2)
172161eba50SJeremy Kerr 			break;
173161eba50SJeremy Kerr 
174161eba50SJeremy Kerr 		hdr2 = mctp_hdr(skb2);
175161eba50SJeremy Kerr 
176161eba50SJeremy Kerr 		tag_mask = MCTP_HDR_TAG_MASK | MCTP_HDR_FLAG_TO;
177161eba50SJeremy Kerr 
178161eba50SJeremy Kerr 		KUNIT_EXPECT_EQ(test, hdr2->ver, hdr.ver);
179161eba50SJeremy Kerr 		KUNIT_EXPECT_EQ(test, hdr2->src, hdr.src);
180161eba50SJeremy Kerr 		KUNIT_EXPECT_EQ(test, hdr2->dest, hdr.dest);
181161eba50SJeremy Kerr 		KUNIT_EXPECT_EQ(test, hdr2->flags_seq_tag & tag_mask,
182161eba50SJeremy Kerr 				hdr.flags_seq_tag & tag_mask);
183161eba50SJeremy Kerr 
184161eba50SJeremy Kerr 		KUNIT_EXPECT_EQ(test,
185161eba50SJeremy Kerr 				!!(hdr2->flags_seq_tag & MCTP_HDR_FLAG_SOM), first);
186161eba50SJeremy Kerr 		KUNIT_EXPECT_EQ(test,
187161eba50SJeremy Kerr 				!!(hdr2->flags_seq_tag & MCTP_HDR_FLAG_EOM), last);
188161eba50SJeremy Kerr 
189161eba50SJeremy Kerr 		seq2 = (hdr2->flags_seq_tag >> MCTP_HDR_SEQ_SHIFT) &
190161eba50SJeremy Kerr 			MCTP_HDR_SEQ_MASK;
191161eba50SJeremy Kerr 
192161eba50SJeremy Kerr 		if (first) {
193161eba50SJeremy Kerr 			seq = seq2;
194161eba50SJeremy Kerr 		} else {
195161eba50SJeremy Kerr 			seq++;
196161eba50SJeremy Kerr 			KUNIT_EXPECT_EQ(test, seq2, seq & MCTP_HDR_SEQ_MASK);
197161eba50SJeremy Kerr 		}
198161eba50SJeremy Kerr 
199161eba50SJeremy Kerr 		if (!last)
200161eba50SJeremy Kerr 			KUNIT_EXPECT_EQ(test, skb2->len, mtu);
201161eba50SJeremy Kerr 		else
202161eba50SJeremy Kerr 			KUNIT_EXPECT_LE(test, skb2->len, mtu);
203161eba50SJeremy Kerr 
204161eba50SJeremy Kerr 		kfree_skb(skb2);
205161eba50SJeremy Kerr 	}
206161eba50SJeremy Kerr 
207161eba50SJeremy Kerr 	mctp_test_route_destroy(test, rt);
208161eba50SJeremy Kerr }
209161eba50SJeremy Kerr 
210161eba50SJeremy Kerr static const struct mctp_frag_test mctp_frag_tests[] = {
211161eba50SJeremy Kerr 	{.mtu = 68, .msgsize = 63, .n_frags = 1},
212161eba50SJeremy Kerr 	{.mtu = 68, .msgsize = 64, .n_frags = 1},
213161eba50SJeremy Kerr 	{.mtu = 68, .msgsize = 65, .n_frags = 2},
214161eba50SJeremy Kerr 	{.mtu = 68, .msgsize = 66, .n_frags = 2},
215161eba50SJeremy Kerr 	{.mtu = 68, .msgsize = 127, .n_frags = 2},
216161eba50SJeremy Kerr 	{.mtu = 68, .msgsize = 128, .n_frags = 2},
217161eba50SJeremy Kerr 	{.mtu = 68, .msgsize = 129, .n_frags = 3},
218161eba50SJeremy Kerr 	{.mtu = 68, .msgsize = 130, .n_frags = 3},
219161eba50SJeremy Kerr };
220161eba50SJeremy Kerr 
mctp_frag_test_to_desc(const struct mctp_frag_test * t,char * desc)221161eba50SJeremy Kerr static void mctp_frag_test_to_desc(const struct mctp_frag_test *t, char *desc)
222161eba50SJeremy Kerr {
223161eba50SJeremy Kerr 	sprintf(desc, "mtu %d len %d -> %d frags",
224161eba50SJeremy Kerr 		t->msgsize, t->mtu, t->n_frags);
225161eba50SJeremy Kerr }
226161eba50SJeremy Kerr 
227161eba50SJeremy Kerr KUNIT_ARRAY_PARAM(mctp_frag, mctp_frag_tests, mctp_frag_test_to_desc);
228161eba50SJeremy Kerr 
229b504db40SJeremy Kerr struct mctp_rx_input_test {
230b504db40SJeremy Kerr 	struct mctp_hdr hdr;
231b504db40SJeremy Kerr 	bool input;
232b504db40SJeremy Kerr };
233b504db40SJeremy Kerr 
mctp_test_rx_input(struct kunit * test)234b504db40SJeremy Kerr static void mctp_test_rx_input(struct kunit *test)
235b504db40SJeremy Kerr {
236b504db40SJeremy Kerr 	const struct mctp_rx_input_test *params;
237b504db40SJeremy Kerr 	struct mctp_test_route *rt;
238b504db40SJeremy Kerr 	struct mctp_test_dev *dev;
239b504db40SJeremy Kerr 	struct sk_buff *skb;
240b504db40SJeremy Kerr 
241b504db40SJeremy Kerr 	params = test->param_value;
242b504db40SJeremy Kerr 
243b504db40SJeremy Kerr 	dev = mctp_test_create_dev();
244b504db40SJeremy Kerr 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
245b504db40SJeremy Kerr 
246b504db40SJeremy Kerr 	rt = mctp_test_create_route(&init_net, dev->mdev, 8, 68);
247b504db40SJeremy Kerr 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, rt);
248b504db40SJeremy Kerr 
249b504db40SJeremy Kerr 	skb = mctp_test_create_skb(&params->hdr, 1);
250b504db40SJeremy Kerr 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb);
251b504db40SJeremy Kerr 
252b504db40SJeremy Kerr 	__mctp_cb(skb);
253b504db40SJeremy Kerr 
254b504db40SJeremy Kerr 	mctp_pkttype_receive(skb, dev->ndev, &mctp_packet_type, NULL);
255b504db40SJeremy Kerr 
256b504db40SJeremy Kerr 	KUNIT_EXPECT_EQ(test, !!rt->pkts.qlen, params->input);
257b504db40SJeremy Kerr 
258b504db40SJeremy Kerr 	mctp_test_route_destroy(test, rt);
259b504db40SJeremy Kerr 	mctp_test_destroy_dev(dev);
260b504db40SJeremy Kerr }
261b504db40SJeremy Kerr 
262b504db40SJeremy Kerr #define RX_HDR(_ver, _src, _dest, _fst) \
263b504db40SJeremy Kerr 	{ .ver = _ver, .src = _src, .dest = _dest, .flags_seq_tag = _fst }
264b504db40SJeremy Kerr 
265b504db40SJeremy Kerr /* we have a route for EID 8 only */
266b504db40SJeremy Kerr static const struct mctp_rx_input_test mctp_rx_input_tests[] = {
267b504db40SJeremy Kerr 	{ .hdr = RX_HDR(1, 10, 8, 0), .input = true },
268b504db40SJeremy Kerr 	{ .hdr = RX_HDR(1, 10, 9, 0), .input = false }, /* no input route */
269b504db40SJeremy Kerr 	{ .hdr = RX_HDR(2, 10, 8, 0), .input = false }, /* invalid version */
270b504db40SJeremy Kerr };
271b504db40SJeremy Kerr 
mctp_rx_input_test_to_desc(const struct mctp_rx_input_test * t,char * desc)272b504db40SJeremy Kerr static void mctp_rx_input_test_to_desc(const struct mctp_rx_input_test *t,
273b504db40SJeremy Kerr 				       char *desc)
274b504db40SJeremy Kerr {
275b504db40SJeremy Kerr 	sprintf(desc, "{%x,%x,%x,%x}", t->hdr.ver, t->hdr.src, t->hdr.dest,
276b504db40SJeremy Kerr 		t->hdr.flags_seq_tag);
277b504db40SJeremy Kerr }
278b504db40SJeremy Kerr 
279b504db40SJeremy Kerr KUNIT_ARRAY_PARAM(mctp_rx_input, mctp_rx_input_tests,
280b504db40SJeremy Kerr 		  mctp_rx_input_test_to_desc);
281b504db40SJeremy Kerr 
2828892c049SJeremy Kerr /* set up a local dev, route on EID 8, and a socket listening on type 0 */
__mctp_route_test_init(struct kunit * test,struct mctp_test_dev ** devp,struct mctp_test_route ** rtp,struct socket ** sockp)2838892c049SJeremy Kerr static void __mctp_route_test_init(struct kunit *test,
2848892c049SJeremy Kerr 				   struct mctp_test_dev **devp,
2858892c049SJeremy Kerr 				   struct mctp_test_route **rtp,
2868892c049SJeremy Kerr 				   struct socket **sockp)
2878892c049SJeremy Kerr {
288284a4d94SMatt Johnston 	struct sockaddr_mctp addr = {0};
2898892c049SJeremy Kerr 	struct mctp_test_route *rt;
2908892c049SJeremy Kerr 	struct mctp_test_dev *dev;
2918892c049SJeremy Kerr 	struct socket *sock;
2928892c049SJeremy Kerr 	int rc;
2938892c049SJeremy Kerr 
2948892c049SJeremy Kerr 	dev = mctp_test_create_dev();
2958892c049SJeremy Kerr 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
2968892c049SJeremy Kerr 
2978892c049SJeremy Kerr 	rt = mctp_test_create_route(&init_net, dev->mdev, 8, 68);
2988892c049SJeremy Kerr 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, rt);
2998892c049SJeremy Kerr 
3008892c049SJeremy Kerr 	rc = sock_create_kern(&init_net, AF_MCTP, SOCK_DGRAM, 0, &sock);
3018892c049SJeremy Kerr 	KUNIT_ASSERT_EQ(test, rc, 0);
3028892c049SJeremy Kerr 
3038892c049SJeremy Kerr 	addr.smctp_family = AF_MCTP;
3048892c049SJeremy Kerr 	addr.smctp_network = MCTP_NET_ANY;
3058892c049SJeremy Kerr 	addr.smctp_addr.s_addr = 8;
3068892c049SJeremy Kerr 	addr.smctp_type = 0;
3078892c049SJeremy Kerr 	rc = kernel_bind(sock, (struct sockaddr *)&addr, sizeof(addr));
3088892c049SJeremy Kerr 	KUNIT_ASSERT_EQ(test, rc, 0);
3098892c049SJeremy Kerr 
3108892c049SJeremy Kerr 	*rtp = rt;
3118892c049SJeremy Kerr 	*devp = dev;
3128892c049SJeremy Kerr 	*sockp = sock;
3138892c049SJeremy Kerr }
3148892c049SJeremy Kerr 
__mctp_route_test_fini(struct kunit * test,struct mctp_test_dev * dev,struct mctp_test_route * rt,struct socket * sock)3158892c049SJeremy Kerr static void __mctp_route_test_fini(struct kunit *test,
3168892c049SJeremy Kerr 				   struct mctp_test_dev *dev,
3178892c049SJeremy Kerr 				   struct mctp_test_route *rt,
3188892c049SJeremy Kerr 				   struct socket *sock)
3198892c049SJeremy Kerr {
3208892c049SJeremy Kerr 	sock_release(sock);
3218892c049SJeremy Kerr 	mctp_test_route_destroy(test, rt);
3228892c049SJeremy Kerr 	mctp_test_destroy_dev(dev);
3238892c049SJeremy Kerr }
3248892c049SJeremy Kerr 
3258892c049SJeremy Kerr struct mctp_route_input_sk_test {
3268892c049SJeremy Kerr 	struct mctp_hdr hdr;
3278892c049SJeremy Kerr 	u8 type;
3288892c049SJeremy Kerr 	bool deliver;
3298892c049SJeremy Kerr };
3308892c049SJeremy Kerr 
mctp_test_route_input_sk(struct kunit * test)3318892c049SJeremy Kerr static void mctp_test_route_input_sk(struct kunit *test)
3328892c049SJeremy Kerr {
3338892c049SJeremy Kerr 	const struct mctp_route_input_sk_test *params;
3348892c049SJeremy Kerr 	struct sk_buff *skb, *skb2;
3358892c049SJeremy Kerr 	struct mctp_test_route *rt;
3368892c049SJeremy Kerr 	struct mctp_test_dev *dev;
3378892c049SJeremy Kerr 	struct socket *sock;
3388892c049SJeremy Kerr 	int rc;
3398892c049SJeremy Kerr 
3408892c049SJeremy Kerr 	params = test->param_value;
3418892c049SJeremy Kerr 
3428892c049SJeremy Kerr 	__mctp_route_test_init(test, &dev, &rt, &sock);
3438892c049SJeremy Kerr 
3448892c049SJeremy Kerr 	skb = mctp_test_create_skb_data(&params->hdr, &params->type);
3458892c049SJeremy Kerr 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb);
3468892c049SJeremy Kerr 
3478892c049SJeremy Kerr 	skb->dev = dev->ndev;
3488892c049SJeremy Kerr 	__mctp_cb(skb);
3498892c049SJeremy Kerr 
3508892c049SJeremy Kerr 	rc = mctp_route_input(&rt->rt, skb);
3518892c049SJeremy Kerr 
3528892c049SJeremy Kerr 	if (params->deliver) {
3538892c049SJeremy Kerr 		KUNIT_EXPECT_EQ(test, rc, 0);
3548892c049SJeremy Kerr 
355*f4b41f06SOliver Hartkopp 		skb2 = skb_recv_datagram(sock->sk, MSG_DONTWAIT, &rc);
3568892c049SJeremy Kerr 		KUNIT_EXPECT_NOT_ERR_OR_NULL(test, skb2);
3578892c049SJeremy Kerr 		KUNIT_EXPECT_EQ(test, skb->len, 1);
3588892c049SJeremy Kerr 
3598892c049SJeremy Kerr 		skb_free_datagram(sock->sk, skb2);
3608892c049SJeremy Kerr 
3618892c049SJeremy Kerr 	} else {
3628892c049SJeremy Kerr 		KUNIT_EXPECT_NE(test, rc, 0);
363*f4b41f06SOliver Hartkopp 		skb2 = skb_recv_datagram(sock->sk, MSG_DONTWAIT, &rc);
3648892c049SJeremy Kerr 		KUNIT_EXPECT_NULL(test, skb2);
3658892c049SJeremy Kerr 	}
3668892c049SJeremy Kerr 
3678892c049SJeremy Kerr 	__mctp_route_test_fini(test, dev, rt, sock);
3688892c049SJeremy Kerr }
3698892c049SJeremy Kerr 
3708892c049SJeremy Kerr #define FL_S	(MCTP_HDR_FLAG_SOM)
3718892c049SJeremy Kerr #define FL_E	(MCTP_HDR_FLAG_EOM)
37262a2b005SJeremy Kerr #define FL_TO	(MCTP_HDR_FLAG_TO)
373c5755214SJeremy Kerr #define FL_T(t)	((t) & MCTP_HDR_TAG_MASK)
3748892c049SJeremy Kerr 
3758892c049SJeremy Kerr static const struct mctp_route_input_sk_test mctp_route_input_sk_tests[] = {
37662a2b005SJeremy Kerr 	{ .hdr = RX_HDR(1, 10, 8, FL_S | FL_E | FL_TO), .type = 0, .deliver = true },
37762a2b005SJeremy Kerr 	{ .hdr = RX_HDR(1, 10, 8, FL_S | FL_E | FL_TO), .type = 1, .deliver = false },
3788892c049SJeremy Kerr 	{ .hdr = RX_HDR(1, 10, 8, FL_S | FL_E), .type = 0, .deliver = false },
37962a2b005SJeremy Kerr 	{ .hdr = RX_HDR(1, 10, 8, FL_E | FL_TO), .type = 0, .deliver = false },
38062a2b005SJeremy Kerr 	{ .hdr = RX_HDR(1, 10, 8, FL_TO), .type = 0, .deliver = false },
3818892c049SJeremy Kerr 	{ .hdr = RX_HDR(1, 10, 8, 0), .type = 0, .deliver = false },
3828892c049SJeremy Kerr };
3838892c049SJeremy Kerr 
mctp_route_input_sk_to_desc(const struct mctp_route_input_sk_test * t,char * desc)3848892c049SJeremy Kerr static void mctp_route_input_sk_to_desc(const struct mctp_route_input_sk_test *t,
3858892c049SJeremy Kerr 					char *desc)
3868892c049SJeremy Kerr {
3878892c049SJeremy Kerr 	sprintf(desc, "{%x,%x,%x,%x} type %d", t->hdr.ver, t->hdr.src,
3888892c049SJeremy Kerr 		t->hdr.dest, t->hdr.flags_seq_tag, t->type);
3898892c049SJeremy Kerr }
3908892c049SJeremy Kerr 
3918892c049SJeremy Kerr KUNIT_ARRAY_PARAM(mctp_route_input_sk, mctp_route_input_sk_tests,
3928892c049SJeremy Kerr 		  mctp_route_input_sk_to_desc);
3938892c049SJeremy Kerr 
3941e5e9250SJeremy Kerr struct mctp_route_input_sk_reasm_test {
3951e5e9250SJeremy Kerr 	const char *name;
3961e5e9250SJeremy Kerr 	struct mctp_hdr hdrs[4];
3971e5e9250SJeremy Kerr 	int n_hdrs;
3981e5e9250SJeremy Kerr 	int rx_len;
3991e5e9250SJeremy Kerr };
4001e5e9250SJeremy Kerr 
mctp_test_route_input_sk_reasm(struct kunit * test)4011e5e9250SJeremy Kerr static void mctp_test_route_input_sk_reasm(struct kunit *test)
4021e5e9250SJeremy Kerr {
4031e5e9250SJeremy Kerr 	const struct mctp_route_input_sk_reasm_test *params;
4041e5e9250SJeremy Kerr 	struct sk_buff *skb, *skb2;
4051e5e9250SJeremy Kerr 	struct mctp_test_route *rt;
4061e5e9250SJeremy Kerr 	struct mctp_test_dev *dev;
4071e5e9250SJeremy Kerr 	struct socket *sock;
4081e5e9250SJeremy Kerr 	int i, rc;
4091e5e9250SJeremy Kerr 	u8 c;
4101e5e9250SJeremy Kerr 
4111e5e9250SJeremy Kerr 	params = test->param_value;
4121e5e9250SJeremy Kerr 
4131e5e9250SJeremy Kerr 	__mctp_route_test_init(test, &dev, &rt, &sock);
4141e5e9250SJeremy Kerr 
4151e5e9250SJeremy Kerr 	for (i = 0; i < params->n_hdrs; i++) {
4161e5e9250SJeremy Kerr 		c = i;
4171e5e9250SJeremy Kerr 		skb = mctp_test_create_skb_data(&params->hdrs[i], &c);
4181e5e9250SJeremy Kerr 		KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb);
4191e5e9250SJeremy Kerr 
4201e5e9250SJeremy Kerr 		skb->dev = dev->ndev;
4211e5e9250SJeremy Kerr 		__mctp_cb(skb);
4221e5e9250SJeremy Kerr 
4231e5e9250SJeremy Kerr 		rc = mctp_route_input(&rt->rt, skb);
4241e5e9250SJeremy Kerr 	}
4251e5e9250SJeremy Kerr 
426*f4b41f06SOliver Hartkopp 	skb2 = skb_recv_datagram(sock->sk, MSG_DONTWAIT, &rc);
4271e5e9250SJeremy Kerr 
4281e5e9250SJeremy Kerr 	if (params->rx_len) {
4291e5e9250SJeremy Kerr 		KUNIT_EXPECT_NOT_ERR_OR_NULL(test, skb2);
4301e5e9250SJeremy Kerr 		KUNIT_EXPECT_EQ(test, skb2->len, params->rx_len);
4311e5e9250SJeremy Kerr 		skb_free_datagram(sock->sk, skb2);
4321e5e9250SJeremy Kerr 
4331e5e9250SJeremy Kerr 	} else {
4341e5e9250SJeremy Kerr 		KUNIT_EXPECT_NULL(test, skb2);
4351e5e9250SJeremy Kerr 	}
4361e5e9250SJeremy Kerr 
4371e5e9250SJeremy Kerr 	__mctp_route_test_fini(test, dev, rt, sock);
4381e5e9250SJeremy Kerr }
4391e5e9250SJeremy Kerr 
44062a2b005SJeremy Kerr #define RX_FRAG(f, s) RX_HDR(1, 10, 8, FL_TO | (f) | ((s) << MCTP_HDR_SEQ_SHIFT))
4411e5e9250SJeremy Kerr 
4421e5e9250SJeremy Kerr static const struct mctp_route_input_sk_reasm_test mctp_route_input_sk_reasm_tests[] = {
4431e5e9250SJeremy Kerr 	{
4441e5e9250SJeremy Kerr 		.name = "single packet",
4451e5e9250SJeremy Kerr 		.hdrs = {
4461e5e9250SJeremy Kerr 			RX_FRAG(FL_S | FL_E, 0),
4471e5e9250SJeremy Kerr 		},
4481e5e9250SJeremy Kerr 		.n_hdrs = 1,
4491e5e9250SJeremy Kerr 		.rx_len = 1,
4501e5e9250SJeremy Kerr 	},
4511e5e9250SJeremy Kerr 	{
4521e5e9250SJeremy Kerr 		.name = "single packet, offset seq",
4531e5e9250SJeremy Kerr 		.hdrs = {
4541e5e9250SJeremy Kerr 			RX_FRAG(FL_S | FL_E, 1),
4551e5e9250SJeremy Kerr 		},
4561e5e9250SJeremy Kerr 		.n_hdrs = 1,
4571e5e9250SJeremy Kerr 		.rx_len = 1,
4581e5e9250SJeremy Kerr 	},
4591e5e9250SJeremy Kerr 	{
4601e5e9250SJeremy Kerr 		.name = "start & end packets",
4611e5e9250SJeremy Kerr 		.hdrs = {
4621e5e9250SJeremy Kerr 			RX_FRAG(FL_S, 0),
4631e5e9250SJeremy Kerr 			RX_FRAG(FL_E, 1),
4641e5e9250SJeremy Kerr 		},
4651e5e9250SJeremy Kerr 		.n_hdrs = 2,
4661e5e9250SJeremy Kerr 		.rx_len = 2,
4671e5e9250SJeremy Kerr 	},
4681e5e9250SJeremy Kerr 	{
4691e5e9250SJeremy Kerr 		.name = "start & end packets, offset seq",
4701e5e9250SJeremy Kerr 		.hdrs = {
4711e5e9250SJeremy Kerr 			RX_FRAG(FL_S, 1),
4721e5e9250SJeremy Kerr 			RX_FRAG(FL_E, 2),
4731e5e9250SJeremy Kerr 		},
4741e5e9250SJeremy Kerr 		.n_hdrs = 2,
4751e5e9250SJeremy Kerr 		.rx_len = 2,
4761e5e9250SJeremy Kerr 	},
4771e5e9250SJeremy Kerr 	{
4781e5e9250SJeremy Kerr 		.name = "start & end packets, out of order",
4791e5e9250SJeremy Kerr 		.hdrs = {
4801e5e9250SJeremy Kerr 			RX_FRAG(FL_E, 1),
4811e5e9250SJeremy Kerr 			RX_FRAG(FL_S, 0),
4821e5e9250SJeremy Kerr 		},
4831e5e9250SJeremy Kerr 		.n_hdrs = 2,
4841e5e9250SJeremy Kerr 		.rx_len = 0,
4851e5e9250SJeremy Kerr 	},
4861e5e9250SJeremy Kerr 	{
4871e5e9250SJeremy Kerr 		.name = "start, middle & end packets",
4881e5e9250SJeremy Kerr 		.hdrs = {
4891e5e9250SJeremy Kerr 			RX_FRAG(FL_S, 0),
4901e5e9250SJeremy Kerr 			RX_FRAG(0,    1),
4911e5e9250SJeremy Kerr 			RX_FRAG(FL_E, 2),
4921e5e9250SJeremy Kerr 		},
4931e5e9250SJeremy Kerr 		.n_hdrs = 3,
4941e5e9250SJeremy Kerr 		.rx_len = 3,
4951e5e9250SJeremy Kerr 	},
4961e5e9250SJeremy Kerr 	{
4971e5e9250SJeremy Kerr 		.name = "missing seq",
4981e5e9250SJeremy Kerr 		.hdrs = {
4991e5e9250SJeremy Kerr 			RX_FRAG(FL_S, 0),
5001e5e9250SJeremy Kerr 			RX_FRAG(FL_E, 2),
5011e5e9250SJeremy Kerr 		},
5021e5e9250SJeremy Kerr 		.n_hdrs = 2,
5031e5e9250SJeremy Kerr 		.rx_len = 0,
5041e5e9250SJeremy Kerr 	},
5051e5e9250SJeremy Kerr 	{
5061e5e9250SJeremy Kerr 		.name = "seq wrap",
5071e5e9250SJeremy Kerr 		.hdrs = {
5081e5e9250SJeremy Kerr 			RX_FRAG(FL_S, 3),
5091e5e9250SJeremy Kerr 			RX_FRAG(FL_E, 0),
5101e5e9250SJeremy Kerr 		},
5111e5e9250SJeremy Kerr 		.n_hdrs = 2,
5121e5e9250SJeremy Kerr 		.rx_len = 2,
5131e5e9250SJeremy Kerr 	},
5141e5e9250SJeremy Kerr };
5151e5e9250SJeremy Kerr 
mctp_route_input_sk_reasm_to_desc(const struct mctp_route_input_sk_reasm_test * t,char * desc)5161e5e9250SJeremy Kerr static void mctp_route_input_sk_reasm_to_desc(
5171e5e9250SJeremy Kerr 				const struct mctp_route_input_sk_reasm_test *t,
5181e5e9250SJeremy Kerr 				char *desc)
5191e5e9250SJeremy Kerr {
5201e5e9250SJeremy Kerr 	sprintf(desc, "%s", t->name);
5211e5e9250SJeremy Kerr }
5221e5e9250SJeremy Kerr 
5231e5e9250SJeremy Kerr KUNIT_ARRAY_PARAM(mctp_route_input_sk_reasm, mctp_route_input_sk_reasm_tests,
5241e5e9250SJeremy Kerr 		  mctp_route_input_sk_reasm_to_desc);
5251e5e9250SJeremy Kerr 
526c5755214SJeremy Kerr struct mctp_route_input_sk_keys_test {
527c5755214SJeremy Kerr 	const char	*name;
528c5755214SJeremy Kerr 	mctp_eid_t	key_peer_addr;
529c5755214SJeremy Kerr 	mctp_eid_t	key_local_addr;
530c5755214SJeremy Kerr 	u8		key_tag;
531c5755214SJeremy Kerr 	struct mctp_hdr hdr;
532c5755214SJeremy Kerr 	bool		deliver;
533c5755214SJeremy Kerr };
534c5755214SJeremy Kerr 
535c5755214SJeremy Kerr /* test packet rx in the presence of various key configurations */
mctp_test_route_input_sk_keys(struct kunit * test)536c5755214SJeremy Kerr static void mctp_test_route_input_sk_keys(struct kunit *test)
537c5755214SJeremy Kerr {
538c5755214SJeremy Kerr 	const struct mctp_route_input_sk_keys_test *params;
539c5755214SJeremy Kerr 	struct mctp_test_route *rt;
540c5755214SJeremy Kerr 	struct sk_buff *skb, *skb2;
541c5755214SJeremy Kerr 	struct mctp_test_dev *dev;
542c5755214SJeremy Kerr 	struct mctp_sk_key *key;
543c5755214SJeremy Kerr 	struct netns_mctp *mns;
544c5755214SJeremy Kerr 	struct mctp_sock *msk;
545c5755214SJeremy Kerr 	struct socket *sock;
546c5755214SJeremy Kerr 	unsigned long flags;
547c5755214SJeremy Kerr 	int rc;
548c5755214SJeremy Kerr 	u8 c;
549c5755214SJeremy Kerr 
550c5755214SJeremy Kerr 	params = test->param_value;
551c5755214SJeremy Kerr 
552c5755214SJeremy Kerr 	dev = mctp_test_create_dev();
553c5755214SJeremy Kerr 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
554c5755214SJeremy Kerr 
555c5755214SJeremy Kerr 	rt = mctp_test_create_route(&init_net, dev->mdev, 8, 68);
556c5755214SJeremy Kerr 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, rt);
557c5755214SJeremy Kerr 
558c5755214SJeremy Kerr 	rc = sock_create_kern(&init_net, AF_MCTP, SOCK_DGRAM, 0, &sock);
559c5755214SJeremy Kerr 	KUNIT_ASSERT_EQ(test, rc, 0);
560c5755214SJeremy Kerr 
561c5755214SJeremy Kerr 	msk = container_of(sock->sk, struct mctp_sock, sk);
562c5755214SJeremy Kerr 	mns = &sock_net(sock->sk)->mctp;
563c5755214SJeremy Kerr 
564c5755214SJeremy Kerr 	/* set the incoming tag according to test params */
565c5755214SJeremy Kerr 	key = mctp_key_alloc(msk, params->key_local_addr, params->key_peer_addr,
566c5755214SJeremy Kerr 			     params->key_tag, GFP_KERNEL);
567c5755214SJeremy Kerr 
568c5755214SJeremy Kerr 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, key);
569c5755214SJeremy Kerr 
570c5755214SJeremy Kerr 	spin_lock_irqsave(&mns->keys_lock, flags);
571c5755214SJeremy Kerr 	mctp_reserve_tag(&init_net, key, msk);
572c5755214SJeremy Kerr 	spin_unlock_irqrestore(&mns->keys_lock, flags);
573c5755214SJeremy Kerr 
574c5755214SJeremy Kerr 	/* create packet and route */
575c5755214SJeremy Kerr 	c = 0;
576c5755214SJeremy Kerr 	skb = mctp_test_create_skb_data(&params->hdr, &c);
577c5755214SJeremy Kerr 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb);
578c5755214SJeremy Kerr 
579c5755214SJeremy Kerr 	skb->dev = dev->ndev;
580c5755214SJeremy Kerr 	__mctp_cb(skb);
581c5755214SJeremy Kerr 
582c5755214SJeremy Kerr 	rc = mctp_route_input(&rt->rt, skb);
583c5755214SJeremy Kerr 
584c5755214SJeremy Kerr 	/* (potentially) receive message */
585*f4b41f06SOliver Hartkopp 	skb2 = skb_recv_datagram(sock->sk, MSG_DONTWAIT, &rc);
586c5755214SJeremy Kerr 
587c5755214SJeremy Kerr 	if (params->deliver)
588c5755214SJeremy Kerr 		KUNIT_EXPECT_NOT_ERR_OR_NULL(test, skb2);
589c5755214SJeremy Kerr 	else
590c5755214SJeremy Kerr 		KUNIT_EXPECT_PTR_EQ(test, skb2, NULL);
591c5755214SJeremy Kerr 
592c5755214SJeremy Kerr 	if (skb2)
593c5755214SJeremy Kerr 		skb_free_datagram(sock->sk, skb2);
594c5755214SJeremy Kerr 
595c5755214SJeremy Kerr 	mctp_key_unref(key);
596c5755214SJeremy Kerr 	__mctp_route_test_fini(test, dev, rt, sock);
597c5755214SJeremy Kerr }
598c5755214SJeremy Kerr 
599c5755214SJeremy Kerr static const struct mctp_route_input_sk_keys_test mctp_route_input_sk_keys_tests[] = {
600c5755214SJeremy Kerr 	{
601c5755214SJeremy Kerr 		.name = "direct match",
602c5755214SJeremy Kerr 		.key_peer_addr = 9,
603c5755214SJeremy Kerr 		.key_local_addr = 8,
604c5755214SJeremy Kerr 		.key_tag = 1,
605c5755214SJeremy Kerr 		.hdr = RX_HDR(1, 9, 8, FL_S | FL_E | FL_T(1)),
606c5755214SJeremy Kerr 		.deliver = true,
607c5755214SJeremy Kerr 	},
608c5755214SJeremy Kerr 	{
609c5755214SJeremy Kerr 		.name = "flipped src/dest",
610c5755214SJeremy Kerr 		.key_peer_addr = 8,
611c5755214SJeremy Kerr 		.key_local_addr = 9,
612c5755214SJeremy Kerr 		.key_tag = 1,
613c5755214SJeremy Kerr 		.hdr = RX_HDR(1, 9, 8, FL_S | FL_E | FL_T(1)),
614c5755214SJeremy Kerr 		.deliver = false,
615c5755214SJeremy Kerr 	},
616c5755214SJeremy Kerr 	{
617c5755214SJeremy Kerr 		.name = "peer addr mismatch",
618c5755214SJeremy Kerr 		.key_peer_addr = 9,
619c5755214SJeremy Kerr 		.key_local_addr = 8,
620c5755214SJeremy Kerr 		.key_tag = 1,
621c5755214SJeremy Kerr 		.hdr = RX_HDR(1, 10, 8, FL_S | FL_E | FL_T(1)),
622c5755214SJeremy Kerr 		.deliver = false,
623c5755214SJeremy Kerr 	},
624c5755214SJeremy Kerr 	{
625c5755214SJeremy Kerr 		.name = "tag value mismatch",
626c5755214SJeremy Kerr 		.key_peer_addr = 9,
627c5755214SJeremy Kerr 		.key_local_addr = 8,
628c5755214SJeremy Kerr 		.key_tag = 1,
629c5755214SJeremy Kerr 		.hdr = RX_HDR(1, 9, 8, FL_S | FL_E | FL_T(2)),
630c5755214SJeremy Kerr 		.deliver = false,
631c5755214SJeremy Kerr 	},
632c5755214SJeremy Kerr 	{
633c5755214SJeremy Kerr 		.name = "TO mismatch",
634c5755214SJeremy Kerr 		.key_peer_addr = 9,
635c5755214SJeremy Kerr 		.key_local_addr = 8,
636c5755214SJeremy Kerr 		.key_tag = 1,
637c5755214SJeremy Kerr 		.hdr = RX_HDR(1, 9, 8, FL_S | FL_E | FL_T(1) | FL_TO),
638c5755214SJeremy Kerr 		.deliver = false,
639c5755214SJeremy Kerr 	},
640c5755214SJeremy Kerr 	{
641c5755214SJeremy Kerr 		.name = "broadcast response",
642c5755214SJeremy Kerr 		.key_peer_addr = MCTP_ADDR_ANY,
643c5755214SJeremy Kerr 		.key_local_addr = 8,
644c5755214SJeremy Kerr 		.key_tag = 1,
645c5755214SJeremy Kerr 		.hdr = RX_HDR(1, 11, 8, FL_S | FL_E | FL_T(1)),
646c5755214SJeremy Kerr 		.deliver = true,
647c5755214SJeremy Kerr 	},
6480de55a7dSJeremy Kerr 	{
6490de55a7dSJeremy Kerr 		.name = "any local match",
6500de55a7dSJeremy Kerr 		.key_peer_addr = 12,
6510de55a7dSJeremy Kerr 		.key_local_addr = MCTP_ADDR_ANY,
6520de55a7dSJeremy Kerr 		.key_tag = 1,
6530de55a7dSJeremy Kerr 		.hdr = RX_HDR(1, 12, 8, FL_S | FL_E | FL_T(1)),
6540de55a7dSJeremy Kerr 		.deliver = true,
6550de55a7dSJeremy Kerr 	},
656c5755214SJeremy Kerr };
657c5755214SJeremy Kerr 
mctp_route_input_sk_keys_to_desc(const struct mctp_route_input_sk_keys_test * t,char * desc)658c5755214SJeremy Kerr static void mctp_route_input_sk_keys_to_desc(
659c5755214SJeremy Kerr 				const struct mctp_route_input_sk_keys_test *t,
660c5755214SJeremy Kerr 				char *desc)
661c5755214SJeremy Kerr {
662c5755214SJeremy Kerr 	sprintf(desc, "%s", t->name);
663c5755214SJeremy Kerr }
664c5755214SJeremy Kerr 
665c5755214SJeremy Kerr KUNIT_ARRAY_PARAM(mctp_route_input_sk_keys, mctp_route_input_sk_keys_tests,
666c5755214SJeremy Kerr 		  mctp_route_input_sk_keys_to_desc);
667c5755214SJeremy Kerr 
668161eba50SJeremy Kerr static struct kunit_case mctp_test_cases[] = {
669161eba50SJeremy Kerr 	KUNIT_CASE_PARAM(mctp_test_fragment, mctp_frag_gen_params),
670b504db40SJeremy Kerr 	KUNIT_CASE_PARAM(mctp_test_rx_input, mctp_rx_input_gen_params),
6718892c049SJeremy Kerr 	KUNIT_CASE_PARAM(mctp_test_route_input_sk, mctp_route_input_sk_gen_params),
6721e5e9250SJeremy Kerr 	KUNIT_CASE_PARAM(mctp_test_route_input_sk_reasm,
6731e5e9250SJeremy Kerr 			 mctp_route_input_sk_reasm_gen_params),
674c5755214SJeremy Kerr 	KUNIT_CASE_PARAM(mctp_test_route_input_sk_keys,
675c5755214SJeremy Kerr 			 mctp_route_input_sk_keys_gen_params),
676161eba50SJeremy Kerr 	{}
677161eba50SJeremy Kerr };
678161eba50SJeremy Kerr 
679161eba50SJeremy Kerr static struct kunit_suite mctp_test_suite = {
680161eba50SJeremy Kerr 	.name = "mctp",
681161eba50SJeremy Kerr 	.test_cases = mctp_test_cases,
682161eba50SJeremy Kerr };
683161eba50SJeremy Kerr 
684161eba50SJeremy Kerr kunit_test_suite(mctp_test_suite);
685