xref: /linux/net/mctp/test/route-test.c (revision 8f7aa3d3c7323f4ca2768a9e74ebbe359c4f8f88)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 #include <kunit/test.h>
4 
5 /* keep clangd happy when compiled outside of the route.c include */
6 #include <net/mctp.h>
7 #include <net/mctpdevice.h>
8 
9 #include "utils.h"
10 
11 #define mctp_test_create_skb_data(h, d) \
12 	__mctp_test_create_skb_data(h, d, sizeof(*d))
13 
14 struct mctp_frag_test {
15 	unsigned int mtu;
16 	unsigned int msgsize;
17 	unsigned int n_frags;
18 };
19 
20 static void mctp_test_fragment(struct kunit *test)
21 {
22 	const struct mctp_frag_test *params;
23 	int rc, i, n, mtu, msgsize;
24 	struct mctp_test_dev *dev;
25 	struct mctp_dst dst;
26 	struct sk_buff *skb;
27 	struct mctp_hdr hdr;
28 	u8 seq;
29 
30 	params = test->param_value;
31 	mtu = params->mtu;
32 	msgsize = params->msgsize;
33 
34 	hdr.ver = 1;
35 	hdr.src = 8;
36 	hdr.dest = 10;
37 	hdr.flags_seq_tag = MCTP_HDR_FLAG_TO;
38 
39 	skb = mctp_test_create_skb(&hdr, msgsize);
40 	KUNIT_ASSERT_TRUE(test, skb);
41 
42 	dev = mctp_test_create_dev();
43 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
44 
45 	mctp_test_dst_setup(test, &dst, dev, mtu);
46 
47 	rc = mctp_do_fragment_route(&dst, skb, mtu, MCTP_TAG_OWNER);
48 	KUNIT_EXPECT_FALSE(test, rc);
49 
50 	n = dev->pkts.qlen;
51 	KUNIT_EXPECT_EQ(test, n, params->n_frags);
52 
53 	for (i = 0;; i++) {
54 		struct mctp_hdr *hdr2;
55 		struct sk_buff *skb2;
56 		u8 tag_mask, seq2;
57 		bool first, last;
58 
59 		first = i == 0;
60 		last = i == (n - 1);
61 
62 		skb2 = skb_dequeue(&dev->pkts);
63 		if (!skb2)
64 			break;
65 
66 		hdr2 = mctp_hdr(skb2);
67 
68 		tag_mask = MCTP_HDR_TAG_MASK | MCTP_HDR_FLAG_TO;
69 
70 		KUNIT_EXPECT_EQ(test, hdr2->ver, hdr.ver);
71 		KUNIT_EXPECT_EQ(test, hdr2->src, hdr.src);
72 		KUNIT_EXPECT_EQ(test, hdr2->dest, hdr.dest);
73 		KUNIT_EXPECT_EQ(test, hdr2->flags_seq_tag & tag_mask,
74 				hdr.flags_seq_tag & tag_mask);
75 
76 		KUNIT_EXPECT_EQ(test,
77 				!!(hdr2->flags_seq_tag & MCTP_HDR_FLAG_SOM), first);
78 		KUNIT_EXPECT_EQ(test,
79 				!!(hdr2->flags_seq_tag & MCTP_HDR_FLAG_EOM), last);
80 
81 		seq2 = (hdr2->flags_seq_tag >> MCTP_HDR_SEQ_SHIFT) &
82 			MCTP_HDR_SEQ_MASK;
83 
84 		if (first) {
85 			seq = seq2;
86 		} else {
87 			seq++;
88 			KUNIT_EXPECT_EQ(test, seq2, seq & MCTP_HDR_SEQ_MASK);
89 		}
90 
91 		if (!last)
92 			KUNIT_EXPECT_EQ(test, skb2->len, mtu);
93 		else
94 			KUNIT_EXPECT_LE(test, skb2->len, mtu);
95 
96 		kfree_skb(skb2);
97 	}
98 
99 	mctp_dst_release(&dst);
100 	mctp_test_destroy_dev(dev);
101 }
102 
103 static const struct mctp_frag_test mctp_frag_tests[] = {
104 	{.mtu = 68, .msgsize = 63, .n_frags = 1},
105 	{.mtu = 68, .msgsize = 64, .n_frags = 1},
106 	{.mtu = 68, .msgsize = 65, .n_frags = 2},
107 	{.mtu = 68, .msgsize = 66, .n_frags = 2},
108 	{.mtu = 68, .msgsize = 127, .n_frags = 2},
109 	{.mtu = 68, .msgsize = 128, .n_frags = 2},
110 	{.mtu = 68, .msgsize = 129, .n_frags = 3},
111 	{.mtu = 68, .msgsize = 130, .n_frags = 3},
112 };
113 
114 static void mctp_frag_test_to_desc(const struct mctp_frag_test *t, char *desc)
115 {
116 	sprintf(desc, "mtu %d len %d -> %d frags",
117 		t->msgsize, t->mtu, t->n_frags);
118 }
119 
120 KUNIT_ARRAY_PARAM(mctp_frag, mctp_frag_tests, mctp_frag_test_to_desc);
121 
122 struct mctp_rx_input_test {
123 	struct mctp_hdr hdr;
124 	bool input;
125 };
126 
127 static void mctp_test_rx_input(struct kunit *test)
128 {
129 	const struct mctp_rx_input_test *params;
130 	struct mctp_test_route *rt;
131 	struct mctp_test_dev *dev;
132 	struct sk_buff *skb;
133 
134 	params = test->param_value;
135 
136 	dev = mctp_test_create_dev();
137 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
138 
139 	rt = mctp_test_create_route_direct(&init_net, dev->mdev, 8, 68);
140 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, rt);
141 
142 	skb = mctp_test_create_skb(&params->hdr, 1);
143 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb);
144 
145 	mctp_pkttype_receive(skb, dev->ndev, &mctp_packet_type, NULL);
146 
147 	KUNIT_EXPECT_EQ(test, !!dev->pkts.qlen, params->input);
148 
149 	mctp_test_route_destroy(test, rt);
150 	mctp_test_destroy_dev(dev);
151 }
152 
153 #define RX_HDR(_ver, _src, _dest, _fst) \
154 	{ .ver = _ver, .src = _src, .dest = _dest, .flags_seq_tag = _fst }
155 
156 /* we have a route for EID 8 only */
157 static const struct mctp_rx_input_test mctp_rx_input_tests[] = {
158 	{ .hdr = RX_HDR(1, 10, 8, 0), .input = true },
159 	{ .hdr = RX_HDR(1, 10, 9, 0), .input = false }, /* no input route */
160 	{ .hdr = RX_HDR(2, 10, 8, 0), .input = false }, /* invalid version */
161 };
162 
163 static void mctp_rx_input_test_to_desc(const struct mctp_rx_input_test *t,
164 				       char *desc)
165 {
166 	sprintf(desc, "{%x,%x,%x,%x}", t->hdr.ver, t->hdr.src, t->hdr.dest,
167 		t->hdr.flags_seq_tag);
168 }
169 
170 KUNIT_ARRAY_PARAM(mctp_rx_input, mctp_rx_input_tests,
171 		  mctp_rx_input_test_to_desc);
172 
173 /* set up a local dev, route on EID 8, and a socket listening on type 0 */
174 static void __mctp_route_test_init(struct kunit *test,
175 				   struct mctp_test_dev **devp,
176 				   struct mctp_dst *dst,
177 				   struct socket **sockp,
178 				   unsigned int netid)
179 {
180 	struct sockaddr_mctp addr = {0};
181 	struct mctp_test_dev *dev;
182 	struct socket *sock;
183 	int rc;
184 
185 	dev = mctp_test_create_dev();
186 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
187 	if (netid != MCTP_NET_ANY)
188 		WRITE_ONCE(dev->mdev->net, netid);
189 
190 	mctp_test_dst_setup(test, dst, dev, 68);
191 
192 	rc = sock_create_kern(&init_net, AF_MCTP, SOCK_DGRAM, 0, &sock);
193 	KUNIT_ASSERT_EQ(test, rc, 0);
194 
195 	addr.smctp_family = AF_MCTP;
196 	addr.smctp_network = netid;
197 	addr.smctp_addr.s_addr = 8;
198 	addr.smctp_type = 0;
199 	rc = kernel_bind(sock, (struct sockaddr_unsized *)&addr, sizeof(addr));
200 	KUNIT_ASSERT_EQ(test, rc, 0);
201 
202 	*devp = dev;
203 	*sockp = sock;
204 }
205 
206 static void __mctp_route_test_fini(struct kunit *test,
207 				   struct mctp_test_dev *dev,
208 				   struct mctp_dst *dst,
209 				   struct socket *sock)
210 {
211 	sock_release(sock);
212 	mctp_dst_release(dst);
213 	mctp_test_destroy_dev(dev);
214 }
215 
216 struct mctp_route_input_sk_test {
217 	struct mctp_hdr hdr;
218 	u8 type;
219 	bool deliver;
220 };
221 
222 static void mctp_test_route_input_sk(struct kunit *test)
223 {
224 	const struct mctp_route_input_sk_test *params;
225 	struct sk_buff *skb, *skb2;
226 	struct mctp_test_dev *dev;
227 	struct mctp_dst dst;
228 	struct socket *sock;
229 	int rc;
230 
231 	params = test->param_value;
232 
233 	__mctp_route_test_init(test, &dev, &dst, &sock, MCTP_NET_ANY);
234 
235 	skb = mctp_test_create_skb_data(&params->hdr, &params->type);
236 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb);
237 
238 	mctp_test_skb_set_dev(skb, dev);
239 
240 	rc = mctp_dst_input(&dst, skb);
241 
242 	if (params->deliver) {
243 		KUNIT_EXPECT_EQ(test, rc, 0);
244 
245 		skb2 = skb_recv_datagram(sock->sk, MSG_DONTWAIT, &rc);
246 		KUNIT_EXPECT_NOT_ERR_OR_NULL(test, skb2);
247 		KUNIT_EXPECT_EQ(test, skb2->len, 1);
248 
249 		skb_free_datagram(sock->sk, skb2);
250 
251 	} else {
252 		KUNIT_EXPECT_NE(test, rc, 0);
253 		skb2 = skb_recv_datagram(sock->sk, MSG_DONTWAIT, &rc);
254 		KUNIT_EXPECT_NULL(test, skb2);
255 	}
256 
257 	__mctp_route_test_fini(test, dev, &dst, sock);
258 }
259 
260 #define FL_S	(MCTP_HDR_FLAG_SOM)
261 #define FL_E	(MCTP_HDR_FLAG_EOM)
262 #define FL_TO	(MCTP_HDR_FLAG_TO)
263 #define FL_T(t)	((t) & MCTP_HDR_TAG_MASK)
264 
265 static const struct mctp_route_input_sk_test mctp_route_input_sk_tests[] = {
266 	{ .hdr = RX_HDR(1, 10, 8, FL_S | FL_E | FL_TO), .type = 0, .deliver = true },
267 	{ .hdr = RX_HDR(1, 10, 8, FL_S | FL_E | FL_TO), .type = 1, .deliver = false },
268 	{ .hdr = RX_HDR(1, 10, 8, FL_S | FL_E), .type = 0, .deliver = false },
269 	{ .hdr = RX_HDR(1, 10, 8, FL_E | FL_TO), .type = 0, .deliver = false },
270 	{ .hdr = RX_HDR(1, 10, 8, FL_TO), .type = 0, .deliver = false },
271 	{ .hdr = RX_HDR(1, 10, 8, 0), .type = 0, .deliver = false },
272 };
273 
274 static void mctp_route_input_sk_to_desc(const struct mctp_route_input_sk_test *t,
275 					char *desc)
276 {
277 	sprintf(desc, "{%x,%x,%x,%x} type %d", t->hdr.ver, t->hdr.src,
278 		t->hdr.dest, t->hdr.flags_seq_tag, t->type);
279 }
280 
281 KUNIT_ARRAY_PARAM(mctp_route_input_sk, mctp_route_input_sk_tests,
282 		  mctp_route_input_sk_to_desc);
283 
284 struct mctp_route_input_sk_reasm_test {
285 	const char *name;
286 	struct mctp_hdr hdrs[4];
287 	int n_hdrs;
288 	int rx_len;
289 };
290 
291 static void mctp_test_route_input_sk_reasm(struct kunit *test)
292 {
293 	const struct mctp_route_input_sk_reasm_test *params;
294 	struct sk_buff *skb, *skb2;
295 	struct mctp_test_dev *dev;
296 	struct mctp_dst dst;
297 	struct socket *sock;
298 	int i, rc;
299 	u8 c;
300 
301 	params = test->param_value;
302 
303 	__mctp_route_test_init(test, &dev, &dst, &sock, MCTP_NET_ANY);
304 
305 	for (i = 0; i < params->n_hdrs; i++) {
306 		c = i;
307 		skb = mctp_test_create_skb_data(&params->hdrs[i], &c);
308 		KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb);
309 
310 		mctp_test_skb_set_dev(skb, dev);
311 
312 		rc = mctp_dst_input(&dst, skb);
313 	}
314 
315 	skb2 = skb_recv_datagram(sock->sk, MSG_DONTWAIT, &rc);
316 
317 	if (params->rx_len) {
318 		KUNIT_EXPECT_NOT_ERR_OR_NULL(test, skb2);
319 		KUNIT_EXPECT_EQ(test, skb2->len, params->rx_len);
320 		skb_free_datagram(sock->sk, skb2);
321 
322 	} else {
323 		KUNIT_EXPECT_NULL(test, skb2);
324 	}
325 
326 	__mctp_route_test_fini(test, dev, &dst, sock);
327 }
328 
329 #define RX_FRAG(f, s) RX_HDR(1, 10, 8, FL_TO | (f) | ((s) << MCTP_HDR_SEQ_SHIFT))
330 
331 static const struct mctp_route_input_sk_reasm_test mctp_route_input_sk_reasm_tests[] = {
332 	{
333 		.name = "single packet",
334 		.hdrs = {
335 			RX_FRAG(FL_S | FL_E, 0),
336 		},
337 		.n_hdrs = 1,
338 		.rx_len = 1,
339 	},
340 	{
341 		.name = "single packet, offset seq",
342 		.hdrs = {
343 			RX_FRAG(FL_S | FL_E, 1),
344 		},
345 		.n_hdrs = 1,
346 		.rx_len = 1,
347 	},
348 	{
349 		.name = "start & end packets",
350 		.hdrs = {
351 			RX_FRAG(FL_S, 0),
352 			RX_FRAG(FL_E, 1),
353 		},
354 		.n_hdrs = 2,
355 		.rx_len = 2,
356 	},
357 	{
358 		.name = "start & end packets, offset seq",
359 		.hdrs = {
360 			RX_FRAG(FL_S, 1),
361 			RX_FRAG(FL_E, 2),
362 		},
363 		.n_hdrs = 2,
364 		.rx_len = 2,
365 	},
366 	{
367 		.name = "start & end packets, out of order",
368 		.hdrs = {
369 			RX_FRAG(FL_E, 1),
370 			RX_FRAG(FL_S, 0),
371 		},
372 		.n_hdrs = 2,
373 		.rx_len = 0,
374 	},
375 	{
376 		.name = "start, middle & end packets",
377 		.hdrs = {
378 			RX_FRAG(FL_S, 0),
379 			RX_FRAG(0,    1),
380 			RX_FRAG(FL_E, 2),
381 		},
382 		.n_hdrs = 3,
383 		.rx_len = 3,
384 	},
385 	{
386 		.name = "missing seq",
387 		.hdrs = {
388 			RX_FRAG(FL_S, 0),
389 			RX_FRAG(FL_E, 2),
390 		},
391 		.n_hdrs = 2,
392 		.rx_len = 0,
393 	},
394 	{
395 		.name = "seq wrap",
396 		.hdrs = {
397 			RX_FRAG(FL_S, 3),
398 			RX_FRAG(FL_E, 0),
399 		},
400 		.n_hdrs = 2,
401 		.rx_len = 2,
402 	},
403 };
404 
405 static void mctp_route_input_sk_reasm_to_desc(
406 				const struct mctp_route_input_sk_reasm_test *t,
407 				char *desc)
408 {
409 	sprintf(desc, "%s", t->name);
410 }
411 
412 KUNIT_ARRAY_PARAM(mctp_route_input_sk_reasm, mctp_route_input_sk_reasm_tests,
413 		  mctp_route_input_sk_reasm_to_desc);
414 
415 struct mctp_route_input_sk_keys_test {
416 	const char	*name;
417 	mctp_eid_t	key_peer_addr;
418 	mctp_eid_t	key_local_addr;
419 	u8		key_tag;
420 	struct mctp_hdr hdr;
421 	bool		deliver;
422 };
423 
424 /* test packet rx in the presence of various key configurations */
425 static void mctp_test_route_input_sk_keys(struct kunit *test)
426 {
427 	const struct mctp_route_input_sk_keys_test *params;
428 	struct sk_buff *skb, *skb2;
429 	struct mctp_test_dev *dev;
430 	struct mctp_sk_key *key;
431 	struct netns_mctp *mns;
432 	struct mctp_sock *msk;
433 	struct socket *sock;
434 	unsigned long flags;
435 	struct mctp_dst dst;
436 	unsigned int net;
437 	int rc;
438 	u8 c;
439 
440 	params = test->param_value;
441 
442 	dev = mctp_test_create_dev();
443 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
444 	net = READ_ONCE(dev->mdev->net);
445 
446 	mctp_test_dst_setup(test, &dst, dev, 68);
447 
448 	rc = sock_create_kern(&init_net, AF_MCTP, SOCK_DGRAM, 0, &sock);
449 	KUNIT_ASSERT_EQ(test, rc, 0);
450 
451 	msk = container_of(sock->sk, struct mctp_sock, sk);
452 	mns = &sock_net(sock->sk)->mctp;
453 
454 	/* set the incoming tag according to test params */
455 	key = mctp_key_alloc(msk, net, params->key_local_addr,
456 			     params->key_peer_addr, params->key_tag,
457 			     GFP_KERNEL);
458 
459 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, key);
460 
461 	spin_lock_irqsave(&mns->keys_lock, flags);
462 	mctp_reserve_tag(&init_net, key, msk);
463 	spin_unlock_irqrestore(&mns->keys_lock, flags);
464 
465 	/* create packet and route */
466 	c = 0;
467 	skb = mctp_test_create_skb_data(&params->hdr, &c);
468 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb);
469 
470 	mctp_test_skb_set_dev(skb, dev);
471 
472 	rc = mctp_dst_input(&dst, skb);
473 
474 	/* (potentially) receive message */
475 	skb2 = skb_recv_datagram(sock->sk, MSG_DONTWAIT, &rc);
476 
477 	if (params->deliver)
478 		KUNIT_EXPECT_NOT_ERR_OR_NULL(test, skb2);
479 	else
480 		KUNIT_EXPECT_PTR_EQ(test, skb2, NULL);
481 
482 	if (skb2)
483 		skb_free_datagram(sock->sk, skb2);
484 
485 	mctp_key_unref(key);
486 	__mctp_route_test_fini(test, dev, &dst, sock);
487 }
488 
489 static const struct mctp_route_input_sk_keys_test mctp_route_input_sk_keys_tests[] = {
490 	{
491 		.name = "direct match",
492 		.key_peer_addr = 9,
493 		.key_local_addr = 8,
494 		.key_tag = 1,
495 		.hdr = RX_HDR(1, 9, 8, FL_S | FL_E | FL_T(1)),
496 		.deliver = true,
497 	},
498 	{
499 		.name = "flipped src/dest",
500 		.key_peer_addr = 8,
501 		.key_local_addr = 9,
502 		.key_tag = 1,
503 		.hdr = RX_HDR(1, 9, 8, FL_S | FL_E | FL_T(1)),
504 		.deliver = false,
505 	},
506 	{
507 		.name = "peer addr mismatch",
508 		.key_peer_addr = 9,
509 		.key_local_addr = 8,
510 		.key_tag = 1,
511 		.hdr = RX_HDR(1, 10, 8, FL_S | FL_E | FL_T(1)),
512 		.deliver = false,
513 	},
514 	{
515 		.name = "tag value mismatch",
516 		.key_peer_addr = 9,
517 		.key_local_addr = 8,
518 		.key_tag = 1,
519 		.hdr = RX_HDR(1, 9, 8, FL_S | FL_E | FL_T(2)),
520 		.deliver = false,
521 	},
522 	{
523 		.name = "TO mismatch",
524 		.key_peer_addr = 9,
525 		.key_local_addr = 8,
526 		.key_tag = 1,
527 		.hdr = RX_HDR(1, 9, 8, FL_S | FL_E | FL_T(1) | FL_TO),
528 		.deliver = false,
529 	},
530 	{
531 		.name = "broadcast response",
532 		.key_peer_addr = MCTP_ADDR_ANY,
533 		.key_local_addr = 8,
534 		.key_tag = 1,
535 		.hdr = RX_HDR(1, 11, 8, FL_S | FL_E | FL_T(1)),
536 		.deliver = true,
537 	},
538 	{
539 		.name = "any local match",
540 		.key_peer_addr = 12,
541 		.key_local_addr = MCTP_ADDR_ANY,
542 		.key_tag = 1,
543 		.hdr = RX_HDR(1, 12, 8, FL_S | FL_E | FL_T(1)),
544 		.deliver = true,
545 	},
546 };
547 
548 static void mctp_route_input_sk_keys_to_desc(
549 				const struct mctp_route_input_sk_keys_test *t,
550 				char *desc)
551 {
552 	sprintf(desc, "%s", t->name);
553 }
554 
555 KUNIT_ARRAY_PARAM(mctp_route_input_sk_keys, mctp_route_input_sk_keys_tests,
556 		  mctp_route_input_sk_keys_to_desc);
557 
558 struct test_net {
559 	unsigned int netid;
560 	struct mctp_test_dev *dev;
561 	struct mctp_dst dst;
562 	struct socket *sock;
563 	struct sk_buff *skb;
564 	struct mctp_sk_key *key;
565 	struct {
566 		u8 type;
567 		unsigned int data;
568 	} msg;
569 };
570 
571 static void
572 mctp_test_route_input_multiple_nets_bind_init(struct kunit *test,
573 					      struct test_net *t)
574 {
575 	struct mctp_hdr hdr = RX_HDR(1, 9, 8, FL_S | FL_E | FL_T(1) | FL_TO);
576 
577 	t->msg.data = t->netid;
578 
579 	__mctp_route_test_init(test, &t->dev, &t->dst, &t->sock, t->netid);
580 
581 	t->skb = mctp_test_create_skb_data(&hdr, &t->msg);
582 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, t->skb);
583 	mctp_test_skb_set_dev(t->skb, t->dev);
584 }
585 
586 static void
587 mctp_test_route_input_multiple_nets_bind_fini(struct kunit *test,
588 					      struct test_net *t)
589 {
590 	__mctp_route_test_fini(test, t->dev, &t->dst, t->sock);
591 }
592 
593 /* Test that skbs from different nets (otherwise identical) get routed to their
594  * corresponding socket via the sockets' bind()
595  */
596 static void mctp_test_route_input_multiple_nets_bind(struct kunit *test)
597 {
598 	struct sk_buff *rx_skb1, *rx_skb2;
599 	struct test_net t1, t2;
600 	int rc;
601 
602 	t1.netid = 1;
603 	t2.netid = 2;
604 
605 	t1.msg.type = 0;
606 	t2.msg.type = 0;
607 
608 	mctp_test_route_input_multiple_nets_bind_init(test, &t1);
609 	mctp_test_route_input_multiple_nets_bind_init(test, &t2);
610 
611 	rc = mctp_dst_input(&t1.dst, t1.skb);
612 	KUNIT_ASSERT_EQ(test, rc, 0);
613 	rc = mctp_dst_input(&t2.dst, t2.skb);
614 	KUNIT_ASSERT_EQ(test, rc, 0);
615 
616 	rx_skb1 = skb_recv_datagram(t1.sock->sk, MSG_DONTWAIT, &rc);
617 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, rx_skb1);
618 	KUNIT_EXPECT_EQ(test, rx_skb1->len, sizeof(t1.msg));
619 	KUNIT_EXPECT_EQ(test,
620 			*(unsigned int *)skb_pull(rx_skb1, sizeof(t1.msg.data)),
621 			t1.netid);
622 	kfree_skb(rx_skb1);
623 
624 	rx_skb2 = skb_recv_datagram(t2.sock->sk, MSG_DONTWAIT, &rc);
625 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, rx_skb2);
626 	KUNIT_EXPECT_EQ(test, rx_skb2->len, sizeof(t2.msg));
627 	KUNIT_EXPECT_EQ(test,
628 			*(unsigned int *)skb_pull(rx_skb2, sizeof(t2.msg.data)),
629 			t2.netid);
630 	kfree_skb(rx_skb2);
631 
632 	mctp_test_route_input_multiple_nets_bind_fini(test, &t1);
633 	mctp_test_route_input_multiple_nets_bind_fini(test, &t2);
634 }
635 
636 static void
637 mctp_test_route_input_multiple_nets_key_init(struct kunit *test,
638 					     struct test_net *t)
639 {
640 	struct mctp_hdr hdr = RX_HDR(1, 9, 8, FL_S | FL_E | FL_T(1));
641 	struct mctp_sock *msk;
642 	struct netns_mctp *mns;
643 	unsigned long flags;
644 
645 	t->msg.data = t->netid;
646 
647 	__mctp_route_test_init(test, &t->dev, &t->dst, &t->sock, t->netid);
648 
649 	msk = container_of(t->sock->sk, struct mctp_sock, sk);
650 
651 	t->key = mctp_key_alloc(msk, t->netid, hdr.dest, hdr.src, 1, GFP_KERNEL);
652 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, t->key);
653 
654 	mns = &sock_net(t->sock->sk)->mctp;
655 	spin_lock_irqsave(&mns->keys_lock, flags);
656 	mctp_reserve_tag(&init_net, t->key, msk);
657 	spin_unlock_irqrestore(&mns->keys_lock, flags);
658 
659 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, t->key);
660 	t->skb = mctp_test_create_skb_data(&hdr, &t->msg);
661 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, t->skb);
662 	mctp_test_skb_set_dev(t->skb, t->dev);
663 }
664 
665 static void
666 mctp_test_route_input_multiple_nets_key_fini(struct kunit *test,
667 					     struct test_net *t)
668 {
669 	mctp_key_unref(t->key);
670 	__mctp_route_test_fini(test, t->dev, &t->dst, t->sock);
671 }
672 
673 /* test that skbs from different nets (otherwise identical) get routed to their
674  * corresponding socket via the sk_key
675  */
676 static void mctp_test_route_input_multiple_nets_key(struct kunit *test)
677 {
678 	struct sk_buff *rx_skb1, *rx_skb2;
679 	struct test_net t1, t2;
680 	int rc;
681 
682 	t1.netid = 1;
683 	t2.netid = 2;
684 
685 	/* use type 1 which is not bound */
686 	t1.msg.type = 1;
687 	t2.msg.type = 1;
688 
689 	mctp_test_route_input_multiple_nets_key_init(test, &t1);
690 	mctp_test_route_input_multiple_nets_key_init(test, &t2);
691 
692 	rc = mctp_dst_input(&t1.dst, t1.skb);
693 	KUNIT_ASSERT_EQ(test, rc, 0);
694 	rc = mctp_dst_input(&t2.dst, t2.skb);
695 	KUNIT_ASSERT_EQ(test, rc, 0);
696 
697 	rx_skb1 = skb_recv_datagram(t1.sock->sk, MSG_DONTWAIT, &rc);
698 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, rx_skb1);
699 	KUNIT_EXPECT_EQ(test, rx_skb1->len, sizeof(t1.msg));
700 	KUNIT_EXPECT_EQ(test,
701 			*(unsigned int *)skb_pull(rx_skb1, sizeof(t1.msg.data)),
702 			t1.netid);
703 	kfree_skb(rx_skb1);
704 
705 	rx_skb2 = skb_recv_datagram(t2.sock->sk, MSG_DONTWAIT, &rc);
706 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, rx_skb2);
707 	KUNIT_EXPECT_EQ(test, rx_skb2->len, sizeof(t2.msg));
708 	KUNIT_EXPECT_EQ(test,
709 			*(unsigned int *)skb_pull(rx_skb2, sizeof(t2.msg.data)),
710 			t2.netid);
711 	kfree_skb(rx_skb2);
712 
713 	mctp_test_route_input_multiple_nets_key_fini(test, &t1);
714 	mctp_test_route_input_multiple_nets_key_fini(test, &t2);
715 }
716 
717 /* Input route to socket, using a single-packet message, where sock delivery
718  * fails. Ensure we're handling the failure appropriately.
719  */
720 static void mctp_test_route_input_sk_fail_single(struct kunit *test)
721 {
722 	const struct mctp_hdr hdr = RX_HDR(1, 10, 8, FL_S | FL_E | FL_TO);
723 	struct mctp_test_dev *dev;
724 	struct mctp_dst dst;
725 	struct socket *sock;
726 	struct sk_buff *skb;
727 	int rc;
728 
729 	__mctp_route_test_init(test, &dev, &dst, &sock, MCTP_NET_ANY);
730 
731 	/* No rcvbuf space, so delivery should fail. __sock_set_rcvbuf will
732 	 * clamp the minimum to SOCK_MIN_RCVBUF, so we open-code this.
733 	 */
734 	lock_sock(sock->sk);
735 	WRITE_ONCE(sock->sk->sk_rcvbuf, 0);
736 	release_sock(sock->sk);
737 
738 	skb = mctp_test_create_skb(&hdr, 10);
739 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb);
740 	skb_get(skb);
741 
742 	mctp_test_skb_set_dev(skb, dev);
743 
744 	/* do route input, which should fail */
745 	rc = mctp_dst_input(&dst, skb);
746 	KUNIT_EXPECT_NE(test, rc, 0);
747 
748 	/* we should hold the only reference to skb */
749 	KUNIT_EXPECT_EQ(test, refcount_read(&skb->users), 1);
750 	kfree_skb(skb);
751 
752 	__mctp_route_test_fini(test, dev, &dst, sock);
753 }
754 
755 /* Input route to socket, using a fragmented message, where sock delivery fails.
756  */
757 static void mctp_test_route_input_sk_fail_frag(struct kunit *test)
758 {
759 	const struct mctp_hdr hdrs[2] = { RX_FRAG(FL_S, 0), RX_FRAG(FL_E, 1) };
760 	struct mctp_test_dev *dev;
761 	struct sk_buff *skbs[2];
762 	struct mctp_dst dst;
763 	struct socket *sock;
764 	unsigned int i;
765 	int rc;
766 
767 	__mctp_route_test_init(test, &dev, &dst, &sock, MCTP_NET_ANY);
768 
769 	lock_sock(sock->sk);
770 	WRITE_ONCE(sock->sk->sk_rcvbuf, 0);
771 	release_sock(sock->sk);
772 
773 	for (i = 0; i < ARRAY_SIZE(skbs); i++) {
774 		skbs[i] = mctp_test_create_skb(&hdrs[i], 10);
775 		KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skbs[i]);
776 		skb_get(skbs[i]);
777 
778 		mctp_test_skb_set_dev(skbs[i], dev);
779 	}
780 
781 	/* first route input should succeed, we're only queueing to the
782 	 * frag list
783 	 */
784 	rc = mctp_dst_input(&dst, skbs[0]);
785 	KUNIT_EXPECT_EQ(test, rc, 0);
786 
787 	/* final route input should fail to deliver to the socket */
788 	rc = mctp_dst_input(&dst, skbs[1]);
789 	KUNIT_EXPECT_NE(test, rc, 0);
790 
791 	/* we should hold the only reference to both skbs */
792 	KUNIT_EXPECT_EQ(test, refcount_read(&skbs[0]->users), 1);
793 	kfree_skb(skbs[0]);
794 
795 	KUNIT_EXPECT_EQ(test, refcount_read(&skbs[1]->users), 1);
796 	kfree_skb(skbs[1]);
797 
798 	__mctp_route_test_fini(test, dev, &dst, sock);
799 }
800 
801 /* Input route to socket, using a fragmented message created from clones.
802  */
803 static void mctp_test_route_input_cloned_frag(struct kunit *test)
804 {
805 	/* 5 packet fragments, forming 2 complete messages */
806 	const struct mctp_hdr hdrs[5] = {
807 		RX_FRAG(FL_S, 0),
808 		RX_FRAG(0, 1),
809 		RX_FRAG(FL_E, 2),
810 		RX_FRAG(FL_S, 0),
811 		RX_FRAG(FL_E, 1),
812 	};
813 	const size_t data_len = 3; /* arbitrary */
814 	u8 compare[3 * ARRAY_SIZE(hdrs)];
815 	u8 flat[3 * ARRAY_SIZE(hdrs)];
816 	struct mctp_test_dev *dev;
817 	struct sk_buff *skb[5];
818 	struct sk_buff *rx_skb;
819 	struct mctp_dst dst;
820 	struct socket *sock;
821 	size_t total;
822 	void *p;
823 	int rc;
824 
825 	total = data_len + sizeof(struct mctp_hdr);
826 
827 	__mctp_route_test_init(test, &dev, &dst, &sock, MCTP_NET_ANY);
828 
829 	/* Create a single skb initially with concatenated packets */
830 	skb[0] = mctp_test_create_skb(&hdrs[0], 5 * total);
831 	mctp_test_skb_set_dev(skb[0], dev);
832 	memset(skb[0]->data, 0 * 0x11, skb[0]->len);
833 	memcpy(skb[0]->data, &hdrs[0], sizeof(struct mctp_hdr));
834 
835 	/* Extract and populate packets */
836 	for (int i = 1; i < 5; i++) {
837 		skb[i] = skb_clone(skb[i - 1], GFP_ATOMIC);
838 		KUNIT_ASSERT_TRUE(test, skb[i]);
839 		p = skb_pull(skb[i], total);
840 		KUNIT_ASSERT_TRUE(test, p);
841 		skb_reset_network_header(skb[i]);
842 		memcpy(skb[i]->data, &hdrs[i], sizeof(struct mctp_hdr));
843 		memset(&skb[i]->data[sizeof(struct mctp_hdr)], i * 0x11, data_len);
844 	}
845 	for (int i = 0; i < 5; i++)
846 		skb_trim(skb[i], total);
847 
848 	/* SOM packets have a type byte to match the socket */
849 	skb[0]->data[4] = 0;
850 	skb[3]->data[4] = 0;
851 
852 	skb_dump("pkt1 ", skb[0], false);
853 	skb_dump("pkt2 ", skb[1], false);
854 	skb_dump("pkt3 ", skb[2], false);
855 	skb_dump("pkt4 ", skb[3], false);
856 	skb_dump("pkt5 ", skb[4], false);
857 
858 	for (int i = 0; i < 5; i++) {
859 		KUNIT_EXPECT_EQ(test, refcount_read(&skb[i]->users), 1);
860 		/* Take a reference so we can check refcounts at the end */
861 		skb_get(skb[i]);
862 	}
863 
864 	/* Feed the fragments into MCTP core */
865 	for (int i = 0; i < 5; i++) {
866 		rc = mctp_dst_input(&dst, skb[i]);
867 		KUNIT_EXPECT_EQ(test, rc, 0);
868 	}
869 
870 	/* Receive first reassembled message */
871 	rx_skb = skb_recv_datagram(sock->sk, MSG_DONTWAIT, &rc);
872 	KUNIT_EXPECT_EQ(test, rc, 0);
873 	KUNIT_EXPECT_EQ(test, rx_skb->len, 3 * data_len);
874 	rc = skb_copy_bits(rx_skb, 0, flat, rx_skb->len);
875 	for (int i = 0; i < rx_skb->len; i++)
876 		compare[i] = (i / data_len) * 0x11;
877 	/* Set type byte */
878 	compare[0] = 0;
879 
880 	KUNIT_EXPECT_MEMEQ(test, flat, compare, rx_skb->len);
881 	KUNIT_EXPECT_EQ(test, refcount_read(&rx_skb->users), 1);
882 	kfree_skb(rx_skb);
883 
884 	/* Receive second reassembled message */
885 	rx_skb = skb_recv_datagram(sock->sk, MSG_DONTWAIT, &rc);
886 	KUNIT_EXPECT_EQ(test, rc, 0);
887 	KUNIT_EXPECT_EQ(test, rx_skb->len, 2 * data_len);
888 	rc = skb_copy_bits(rx_skb, 0, flat, rx_skb->len);
889 	for (int i = 0; i < rx_skb->len; i++)
890 		compare[i] = (i / data_len + 3) * 0x11;
891 	/* Set type byte */
892 	compare[0] = 0;
893 
894 	KUNIT_EXPECT_MEMEQ(test, flat, compare, rx_skb->len);
895 	KUNIT_EXPECT_EQ(test, refcount_read(&rx_skb->users), 1);
896 	kfree_skb(rx_skb);
897 
898 	/* Check input skb refcounts */
899 	for (int i = 0; i < 5; i++) {
900 		KUNIT_EXPECT_EQ(test, refcount_read(&skb[i]->users), 1);
901 		kfree_skb(skb[i]);
902 	}
903 
904 	__mctp_route_test_fini(test, dev, &dst, sock);
905 }
906 
907 #if IS_ENABLED(CONFIG_MCTP_FLOWS)
908 
909 static void mctp_test_flow_init(struct kunit *test,
910 				struct mctp_test_dev **devp,
911 				struct mctp_dst *dst,
912 				struct socket **sock,
913 				struct sk_buff **skbp,
914 				unsigned int len)
915 {
916 	struct mctp_test_dev *dev;
917 	struct sk_buff *skb;
918 
919 	/* we have a slightly odd routing setup here; the test route
920 	 * is for EID 8, which is our local EID. We don't do a routing
921 	 * lookup, so that's fine - all we require is a path through
922 	 * mctp_local_output, which will call dst->output on whatever
923 	 * route we provide
924 	 */
925 	__mctp_route_test_init(test, &dev, dst, sock, MCTP_NET_ANY);
926 
927 	/* Assign a single EID. ->addrs is freed on mctp netdev release */
928 	dev->mdev->addrs = kmalloc(sizeof(u8), GFP_KERNEL);
929 	dev->mdev->num_addrs = 1;
930 	dev->mdev->addrs[0] = 8;
931 
932 	skb = alloc_skb(len + sizeof(struct mctp_hdr) + 1, GFP_KERNEL);
933 	KUNIT_ASSERT_TRUE(test, skb);
934 	__mctp_cb(skb);
935 	skb_reserve(skb, sizeof(struct mctp_hdr) + 1);
936 	memset(skb_put(skb, len), 0, len);
937 
938 
939 	*devp = dev;
940 	*skbp = skb;
941 }
942 
943 static void mctp_test_flow_fini(struct kunit *test,
944 				struct mctp_test_dev *dev,
945 				struct mctp_dst *dst,
946 				struct socket *sock)
947 {
948 	__mctp_route_test_fini(test, dev, dst, sock);
949 }
950 
951 /* test that an outgoing skb has the correct MCTP extension data set */
952 static void mctp_test_packet_flow(struct kunit *test)
953 {
954 	struct sk_buff *skb, *skb2;
955 	struct mctp_test_dev *dev;
956 	struct mctp_dst dst;
957 	struct mctp_flow *flow;
958 	struct socket *sock;
959 	u8 dst_eid = 8;
960 	int n, rc;
961 
962 	mctp_test_flow_init(test, &dev, &dst, &sock, &skb, 30);
963 
964 	rc = mctp_local_output(sock->sk, &dst, skb, dst_eid, MCTP_TAG_OWNER);
965 	KUNIT_ASSERT_EQ(test, rc, 0);
966 
967 	n = dev->pkts.qlen;
968 	KUNIT_ASSERT_EQ(test, n, 1);
969 
970 	skb2 = skb_dequeue(&dev->pkts);
971 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb2);
972 
973 	flow = skb_ext_find(skb2, SKB_EXT_MCTP);
974 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, flow);
975 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, flow->key);
976 	KUNIT_ASSERT_PTR_EQ(test, flow->key->sk, sock->sk);
977 
978 	kfree_skb(skb2);
979 	mctp_test_flow_fini(test, dev, &dst, sock);
980 }
981 
982 /* test that outgoing skbs, after fragmentation, all have the correct MCTP
983  * extension data set.
984  */
985 static void mctp_test_fragment_flow(struct kunit *test)
986 {
987 	struct mctp_flow *flows[2];
988 	struct sk_buff *tx_skbs[2];
989 	struct mctp_test_dev *dev;
990 	struct mctp_dst dst;
991 	struct sk_buff *skb;
992 	struct socket *sock;
993 	u8 dst_eid = 8;
994 	int n, rc;
995 
996 	mctp_test_flow_init(test, &dev, &dst, &sock, &skb, 100);
997 
998 	rc = mctp_local_output(sock->sk, &dst, skb, dst_eid, MCTP_TAG_OWNER);
999 	KUNIT_ASSERT_EQ(test, rc, 0);
1000 
1001 	n = dev->pkts.qlen;
1002 	KUNIT_ASSERT_EQ(test, n, 2);
1003 
1004 	/* both resulting packets should have the same flow data */
1005 	tx_skbs[0] = skb_dequeue(&dev->pkts);
1006 	tx_skbs[1] = skb_dequeue(&dev->pkts);
1007 
1008 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, tx_skbs[0]);
1009 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, tx_skbs[1]);
1010 
1011 	flows[0] = skb_ext_find(tx_skbs[0], SKB_EXT_MCTP);
1012 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, flows[0]);
1013 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, flows[0]->key);
1014 	KUNIT_ASSERT_PTR_EQ(test, flows[0]->key->sk, sock->sk);
1015 
1016 	flows[1] = skb_ext_find(tx_skbs[1], SKB_EXT_MCTP);
1017 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, flows[1]);
1018 	KUNIT_ASSERT_PTR_EQ(test, flows[1]->key, flows[0]->key);
1019 
1020 	kfree_skb(tx_skbs[0]);
1021 	kfree_skb(tx_skbs[1]);
1022 	mctp_test_flow_fini(test, dev, &dst, sock);
1023 }
1024 
1025 #else
1026 static void mctp_test_packet_flow(struct kunit *test)
1027 {
1028 	kunit_skip(test, "Requires CONFIG_MCTP_FLOWS=y");
1029 }
1030 
1031 static void mctp_test_fragment_flow(struct kunit *test)
1032 {
1033 	kunit_skip(test, "Requires CONFIG_MCTP_FLOWS=y");
1034 }
1035 #endif
1036 
1037 /* Test that outgoing skbs cause a suitable tag to be created */
1038 static void mctp_test_route_output_key_create(struct kunit *test)
1039 {
1040 	const u8 dst_eid = 26, src_eid = 15;
1041 	const unsigned int netid = 50;
1042 	struct mctp_test_dev *dev;
1043 	struct mctp_sk_key *key;
1044 	struct netns_mctp *mns;
1045 	unsigned long flags;
1046 	struct socket *sock;
1047 	struct sk_buff *skb;
1048 	struct mctp_dst dst;
1049 	bool empty, single;
1050 	const int len = 2;
1051 	int rc;
1052 
1053 	dev = mctp_test_create_dev();
1054 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
1055 	WRITE_ONCE(dev->mdev->net, netid);
1056 
1057 	mctp_test_dst_setup(test, &dst, dev, 68);
1058 
1059 	rc = sock_create_kern(&init_net, AF_MCTP, SOCK_DGRAM, 0, &sock);
1060 	KUNIT_ASSERT_EQ(test, rc, 0);
1061 
1062 	dev->mdev->addrs = kmalloc(sizeof(u8), GFP_KERNEL);
1063 	dev->mdev->num_addrs = 1;
1064 	dev->mdev->addrs[0] = src_eid;
1065 
1066 	skb = alloc_skb(sizeof(struct mctp_hdr) + 1 + len, GFP_KERNEL);
1067 	KUNIT_ASSERT_TRUE(test, skb);
1068 	__mctp_cb(skb);
1069 	skb_reserve(skb, sizeof(struct mctp_hdr) + 1 + len);
1070 	memset(skb_put(skb, len), 0, len);
1071 
1072 	mns = &sock_net(sock->sk)->mctp;
1073 
1074 	/* We assume we're starting from an empty keys list, which requires
1075 	 * preceding tests to clean up correctly!
1076 	 */
1077 	spin_lock_irqsave(&mns->keys_lock, flags);
1078 	empty = hlist_empty(&mns->keys);
1079 	spin_unlock_irqrestore(&mns->keys_lock, flags);
1080 	KUNIT_ASSERT_TRUE(test, empty);
1081 
1082 	rc = mctp_local_output(sock->sk, &dst, skb, dst_eid, MCTP_TAG_OWNER);
1083 	KUNIT_ASSERT_EQ(test, rc, 0);
1084 
1085 	key = NULL;
1086 	single = false;
1087 	spin_lock_irqsave(&mns->keys_lock, flags);
1088 	if (!hlist_empty(&mns->keys)) {
1089 		key = hlist_entry(mns->keys.first, struct mctp_sk_key, hlist);
1090 		single = hlist_is_singular_node(&key->hlist, &mns->keys);
1091 	}
1092 	spin_unlock_irqrestore(&mns->keys_lock, flags);
1093 
1094 	KUNIT_ASSERT_NOT_NULL(test, key);
1095 	KUNIT_ASSERT_TRUE(test, single);
1096 
1097 	KUNIT_EXPECT_EQ(test, key->net, netid);
1098 	KUNIT_EXPECT_EQ(test, key->local_addr, src_eid);
1099 	KUNIT_EXPECT_EQ(test, key->peer_addr, dst_eid);
1100 	/* key has incoming tag, so inverse of what we sent */
1101 	KUNIT_EXPECT_FALSE(test, key->tag & MCTP_TAG_OWNER);
1102 
1103 	sock_release(sock);
1104 	mctp_dst_release(&dst);
1105 	mctp_test_destroy_dev(dev);
1106 }
1107 
1108 static void mctp_test_route_extaddr_input(struct kunit *test)
1109 {
1110 	static const unsigned char haddr[] = { 0xaa, 0x55 };
1111 	struct mctp_skb_cb *cb, *cb2;
1112 	const unsigned int len = 40;
1113 	struct mctp_test_dev *dev;
1114 	struct sk_buff *skb, *skb2;
1115 	struct mctp_dst dst;
1116 	struct mctp_hdr hdr;
1117 	struct socket *sock;
1118 	int rc;
1119 
1120 	hdr.ver = 1;
1121 	hdr.src = 10;
1122 	hdr.dest = 8;
1123 	hdr.flags_seq_tag = FL_S | FL_E | FL_TO;
1124 
1125 	__mctp_route_test_init(test, &dev, &dst, &sock, MCTP_NET_ANY);
1126 
1127 	skb = mctp_test_create_skb(&hdr, len);
1128 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb);
1129 
1130 	/* set our hardware addressing data */
1131 	cb = mctp_cb(skb);
1132 	memcpy(cb->haddr, haddr, sizeof(haddr));
1133 	cb->halen = sizeof(haddr);
1134 
1135 	mctp_test_skb_set_dev(skb, dev);
1136 
1137 	rc = mctp_dst_input(&dst, skb);
1138 	KUNIT_ASSERT_EQ(test, rc, 0);
1139 
1140 	skb2 = skb_recv_datagram(sock->sk, MSG_DONTWAIT, &rc);
1141 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb2);
1142 	KUNIT_ASSERT_EQ(test, skb2->len, len);
1143 
1144 	cb2 = mctp_cb(skb2);
1145 
1146 	/* Received SKB should have the hardware addressing as set above.
1147 	 * We're likely to have the same actual cb here (ie., cb == cb2),
1148 	 * but it's the comparison that we care about
1149 	 */
1150 	KUNIT_EXPECT_EQ(test, cb2->halen, sizeof(haddr));
1151 	KUNIT_EXPECT_MEMEQ(test, cb2->haddr, haddr, sizeof(haddr));
1152 
1153 	kfree_skb(skb2);
1154 	__mctp_route_test_fini(test, dev, &dst, sock);
1155 }
1156 
1157 static void mctp_test_route_gw_lookup(struct kunit *test)
1158 {
1159 	struct mctp_test_route *rt1, *rt2;
1160 	struct mctp_dst dst = { 0 };
1161 	struct mctp_test_dev *dev;
1162 	int rc;
1163 
1164 	dev = mctp_test_create_dev();
1165 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
1166 
1167 	/* 8 (local) -> 10 (gateway) via 9 (direct) */
1168 	rt1 = mctp_test_create_route_direct(&init_net, dev->mdev, 9, 0);
1169 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, rt1);
1170 	rt2 = mctp_test_create_route_gw(&init_net, dev->mdev->net, 10, 9, 0);
1171 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, rt2);
1172 
1173 	rc = mctp_route_lookup(&init_net, dev->mdev->net, 10, &dst);
1174 	KUNIT_EXPECT_EQ(test, rc, 0);
1175 	KUNIT_EXPECT_PTR_EQ(test, dst.dev, dev->mdev);
1176 	KUNIT_EXPECT_EQ(test, dst.mtu, dev->ndev->mtu);
1177 	KUNIT_EXPECT_EQ(test, dst.nexthop, 9);
1178 	KUNIT_EXPECT_EQ(test, dst.halen, 0);
1179 
1180 	mctp_dst_release(&dst);
1181 
1182 	mctp_test_route_destroy(test, rt2);
1183 	mctp_test_route_destroy(test, rt1);
1184 	mctp_test_destroy_dev(dev);
1185 }
1186 
1187 static void mctp_test_route_gw_loop(struct kunit *test)
1188 {
1189 	struct mctp_test_route *rt1, *rt2;
1190 	struct mctp_dst dst = { 0 };
1191 	struct mctp_test_dev *dev;
1192 	int rc;
1193 
1194 	dev = mctp_test_create_dev();
1195 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
1196 
1197 	/* two routes using each other as the gw */
1198 	rt1 = mctp_test_create_route_gw(&init_net, dev->mdev->net, 9, 10, 0);
1199 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, rt1);
1200 	rt2 = mctp_test_create_route_gw(&init_net, dev->mdev->net, 10, 9, 0);
1201 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, rt2);
1202 
1203 	/* this should fail, rather than infinite-loop */
1204 	rc = mctp_route_lookup(&init_net, dev->mdev->net, 10, &dst);
1205 	KUNIT_EXPECT_NE(test, rc, 0);
1206 
1207 	mctp_test_route_destroy(test, rt2);
1208 	mctp_test_route_destroy(test, rt1);
1209 	mctp_test_destroy_dev(dev);
1210 }
1211 
1212 struct mctp_route_gw_mtu_test {
1213 	/* working away from the local stack */
1214 	unsigned int dev, neigh, gw, dst;
1215 	unsigned int exp;
1216 };
1217 
1218 static void mctp_route_gw_mtu_to_desc(const struct mctp_route_gw_mtu_test *t,
1219 				      char *desc)
1220 {
1221 	sprintf(desc, "dev %d, neigh %d, gw %d, dst %d -> %d",
1222 		t->dev, t->neigh, t->gw, t->dst, t->exp);
1223 }
1224 
1225 static const struct mctp_route_gw_mtu_test mctp_route_gw_mtu_tests[] = {
1226 	/* no route-specific MTUs */
1227 	{ 68, 0, 0, 0, 68 },
1228 	{ 100, 0, 0, 0, 100 },
1229 	/* one route MTU (smaller than dev mtu), others unrestricted */
1230 	{ 100, 68, 0, 0, 68 },
1231 	{ 100, 0, 68, 0, 68 },
1232 	{ 100, 0, 0, 68, 68 },
1233 	/* smallest applied, regardless of order */
1234 	{ 100, 99, 98, 68, 68 },
1235 	{ 99, 100, 98, 68, 68 },
1236 	{ 98, 99, 100, 68, 68 },
1237 	{ 68, 98, 99, 100, 68 },
1238 };
1239 
1240 KUNIT_ARRAY_PARAM(mctp_route_gw_mtu, mctp_route_gw_mtu_tests,
1241 		  mctp_route_gw_mtu_to_desc);
1242 
1243 static void mctp_test_route_gw_mtu(struct kunit *test)
1244 {
1245 	const struct mctp_route_gw_mtu_test *mtus = test->param_value;
1246 	struct mctp_test_route *rt1, *rt2, *rt3;
1247 	struct mctp_dst dst = { 0 };
1248 	struct mctp_test_dev *dev;
1249 	struct mctp_dev *mdev;
1250 	unsigned int netid;
1251 	int rc;
1252 
1253 	dev = mctp_test_create_dev();
1254 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
1255 	dev->ndev->mtu = mtus->dev;
1256 	mdev = dev->mdev;
1257 	netid = mdev->net;
1258 
1259 	/* 8 (local) -> 11 (dst) via 10 (gw) via 9 (neigh) */
1260 	rt1 = mctp_test_create_route_direct(&init_net, mdev, 9, mtus->neigh);
1261 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, rt1);
1262 
1263 	rt2 = mctp_test_create_route_gw(&init_net, netid, 10, 9, mtus->gw);
1264 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, rt2);
1265 
1266 	rt3 = mctp_test_create_route_gw(&init_net, netid, 11, 10, mtus->dst);
1267 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, rt3);
1268 
1269 	rc = mctp_route_lookup(&init_net, dev->mdev->net, 11, &dst);
1270 	KUNIT_EXPECT_EQ(test, rc, 0);
1271 	KUNIT_EXPECT_EQ(test, dst.mtu, mtus->exp);
1272 
1273 	mctp_dst_release(&dst);
1274 
1275 	mctp_test_route_destroy(test, rt3);
1276 	mctp_test_route_destroy(test, rt2);
1277 	mctp_test_route_destroy(test, rt1);
1278 	mctp_test_destroy_dev(dev);
1279 }
1280 
1281 #define MCTP_TEST_LLADDR_LEN 2
1282 struct mctp_test_llhdr {
1283 	unsigned int magic;
1284 	unsigned char src[MCTP_TEST_LLADDR_LEN];
1285 	unsigned char dst[MCTP_TEST_LLADDR_LEN];
1286 };
1287 
1288 static const unsigned int mctp_test_llhdr_magic = 0x5c78339c;
1289 
1290 static int test_dev_header_create(struct sk_buff *skb, struct net_device *dev,
1291 				  unsigned short type, const void *daddr,
1292 				  const void *saddr, unsigned int len)
1293 {
1294 	struct kunit *test = current->kunit_test;
1295 	struct mctp_test_llhdr *hdr;
1296 
1297 	hdr = skb_push(skb, sizeof(*hdr));
1298 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hdr);
1299 	skb_reset_mac_header(skb);
1300 
1301 	hdr->magic = mctp_test_llhdr_magic;
1302 	memcpy(&hdr->src, saddr, sizeof(hdr->src));
1303 	memcpy(&hdr->dst, daddr, sizeof(hdr->dst));
1304 
1305 	return 0;
1306 }
1307 
1308 /* Test the dst_output path for a gateway-routed skb: we should have it
1309  * lookup the nexthop EID in the neighbour table, and call into
1310  * header_ops->create to resolve that to a lladdr. Our mock header_ops->create
1311  * will just set a synthetic link-layer header, which we check after transmit.
1312  */
1313 static void mctp_test_route_gw_output(struct kunit *test)
1314 {
1315 	const unsigned char haddr_self[MCTP_TEST_LLADDR_LEN] = { 0xaa, 0x03 };
1316 	const unsigned char haddr_peer[MCTP_TEST_LLADDR_LEN] = { 0xaa, 0x02 };
1317 	const struct header_ops ops = {
1318 		.create = test_dev_header_create,
1319 	};
1320 	struct mctp_neigh neigh = { 0 };
1321 	struct mctp_test_llhdr *ll_hdr;
1322 	struct mctp_dst dst = { 0 };
1323 	struct mctp_hdr hdr = { 0 };
1324 	struct mctp_test_dev *dev;
1325 	struct sk_buff *skb;
1326 	unsigned char *buf;
1327 	int i, rc;
1328 
1329 	dev = mctp_test_create_dev_lladdr(sizeof(haddr_self), haddr_self);
1330 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
1331 	dev->ndev->header_ops = &ops;
1332 
1333 	dst.dev = dev->mdev;
1334 	__mctp_dev_get(dst.dev->dev);
1335 	dst.mtu = 68;
1336 	dst.nexthop = 9;
1337 
1338 	/* simple mctp_neigh_add for the gateway (not dest!) endpoint */
1339 	INIT_LIST_HEAD(&neigh.list);
1340 	neigh.dev = dev->mdev;
1341 	mctp_dev_hold(dev->mdev);
1342 	neigh.eid = 9;
1343 	neigh.source = MCTP_NEIGH_STATIC;
1344 	memcpy(neigh.ha, haddr_peer, sizeof(haddr_peer));
1345 	list_add_rcu(&neigh.list, &init_net.mctp.neighbours);
1346 
1347 	hdr.ver = 1;
1348 	hdr.src = 8;
1349 	hdr.dest = 10;
1350 	hdr.flags_seq_tag = FL_S | FL_E | FL_TO;
1351 
1352 	/* construct enough for a future link-layer header, the provided
1353 	 * mctp header, and 4 bytes of data
1354 	 */
1355 	skb = alloc_skb(sizeof(*ll_hdr) + sizeof(hdr) + 4, GFP_KERNEL);
1356 	skb->dev = dev->ndev;
1357 	__mctp_cb(skb);
1358 
1359 	skb_reserve(skb, sizeof(*ll_hdr));
1360 
1361 	memcpy(skb_put(skb, sizeof(hdr)), &hdr, sizeof(hdr));
1362 	buf = skb_put(skb, 4);
1363 	for (i = 0; i < 4; i++)
1364 		buf[i] = i;
1365 
1366 	/* extra ref over the dev_xmit */
1367 	skb_get(skb);
1368 
1369 	rc = mctp_dst_output(&dst, skb);
1370 	KUNIT_EXPECT_EQ(test, rc, 0);
1371 
1372 	mctp_dst_release(&dst);
1373 	list_del_rcu(&neigh.list);
1374 	mctp_dev_put(dev->mdev);
1375 
1376 	/* check that we have our header created with the correct neighbour */
1377 	ll_hdr = (void *)skb_mac_header(skb);
1378 	KUNIT_EXPECT_EQ(test, ll_hdr->magic, mctp_test_llhdr_magic);
1379 	KUNIT_EXPECT_MEMEQ(test, ll_hdr->src, haddr_self, sizeof(haddr_self));
1380 	KUNIT_EXPECT_MEMEQ(test, ll_hdr->dst, haddr_peer, sizeof(haddr_peer));
1381 	kfree_skb(skb);
1382 }
1383 
1384 struct mctp_bind_lookup_test {
1385 	/* header of incoming message */
1386 	struct mctp_hdr hdr;
1387 	u8 ty;
1388 	/* mctp network of incoming interface (smctp_network) */
1389 	unsigned int net;
1390 
1391 	/* expected socket, matches .name in lookup_binds, NULL for dropped */
1392 	const char *expect;
1393 };
1394 
1395 /* Single-packet TO-set message */
1396 #define LK(src, dst) RX_HDR(1, (src), (dst), FL_S | FL_E | FL_TO)
1397 
1398 /* Input message test cases for bind lookup tests.
1399  *
1400  * 10 and 11 are local EIDs.
1401  * 20 and 21 are remote EIDs.
1402  */
1403 static const struct mctp_bind_lookup_test mctp_bind_lookup_tests[] = {
1404 	/* both local-eid and remote-eid binds, remote eid is preferenced */
1405 	{ .hdr = LK(20, 10),  .ty = 1, .net = 1, .expect = "remote20" },
1406 
1407 	{ .hdr = LK(20, 255), .ty = 1, .net = 1, .expect = "remote20" },
1408 	{ .hdr = LK(20, 0),   .ty = 1, .net = 1, .expect = "remote20" },
1409 	{ .hdr = LK(0, 255),  .ty = 1, .net = 1, .expect = "any" },
1410 	{ .hdr = LK(0, 11),   .ty = 1, .net = 1, .expect = "any" },
1411 	{ .hdr = LK(0, 0),    .ty = 1, .net = 1, .expect = "any" },
1412 	{ .hdr = LK(0, 10),   .ty = 1, .net = 1, .expect = "local10" },
1413 	{ .hdr = LK(21, 10),  .ty = 1, .net = 1, .expect = "local10" },
1414 	{ .hdr = LK(21, 11),  .ty = 1, .net = 1, .expect = "remote21local11" },
1415 
1416 	/* both src and dest set to eid=99. unusual, but accepted
1417 	 * by MCTP stack currently.
1418 	 */
1419 	{ .hdr = LK(99, 99),  .ty = 1, .net = 1, .expect = "any" },
1420 
1421 	/* unbound smctp_type */
1422 	{ .hdr = LK(20, 10),  .ty = 3, .net = 1, .expect = NULL },
1423 
1424 	/* smctp_network tests */
1425 
1426 	{ .hdr = LK(0, 0),    .ty = 1, .net = 7, .expect = "any" },
1427 	{ .hdr = LK(21, 10),  .ty = 1, .net = 2, .expect = "any" },
1428 
1429 	/* remote EID 20 matches, but MCTP_NET_ANY in "remote20" resolved
1430 	 * to net=1, so lookup doesn't match "remote20"
1431 	 */
1432 	{ .hdr = LK(20, 10),  .ty = 1, .net = 3, .expect = "any" },
1433 
1434 	{ .hdr = LK(21, 10),  .ty = 1, .net = 3, .expect = "remote21net3" },
1435 	{ .hdr = LK(21, 10),  .ty = 1, .net = 4, .expect = "remote21net4" },
1436 	{ .hdr = LK(21, 10),  .ty = 1, .net = 5, .expect = "remote21net5" },
1437 
1438 	{ .hdr = LK(21, 10),  .ty = 1, .net = 5, .expect = "remote21net5" },
1439 
1440 	{ .hdr = LK(99, 10),  .ty = 1, .net = 8, .expect = "local10net8" },
1441 
1442 	{ .hdr = LK(99, 10),  .ty = 1, .net = 9, .expect = "anynet9" },
1443 	{ .hdr = LK(0, 0),    .ty = 1, .net = 9, .expect = "anynet9" },
1444 	{ .hdr = LK(99, 99),  .ty = 1, .net = 9, .expect = "anynet9" },
1445 	{ .hdr = LK(20, 10),  .ty = 1, .net = 9, .expect = "anynet9" },
1446 };
1447 
1448 /* Binds to create during the lookup tests */
1449 static const struct mctp_test_bind_setup lookup_binds[] = {
1450 	/* any address and net, type 1 */
1451 	{ .name = "any", .bind_addr = MCTP_ADDR_ANY,
1452 		.bind_net = MCTP_NET_ANY, .bind_type = 1, },
1453 	/* local eid 10, net 1 (resolved from MCTP_NET_ANY) */
1454 	{ .name = "local10", .bind_addr = 10,
1455 		.bind_net = MCTP_NET_ANY, .bind_type = 1, },
1456 	/* local eid 10, net 8 */
1457 	{ .name = "local10net8", .bind_addr = 10,
1458 		.bind_net = 8, .bind_type = 1, },
1459 	/* any EID, net 9 */
1460 	{ .name = "anynet9", .bind_addr = MCTP_ADDR_ANY,
1461 		.bind_net = 9, .bind_type = 1, },
1462 
1463 	/* remote eid 20, net 1, any local eid */
1464 	{ .name = "remote20", .bind_addr = MCTP_ADDR_ANY,
1465 		.bind_net = MCTP_NET_ANY, .bind_type = 1,
1466 		.have_peer = true, .peer_addr = 20, .peer_net = MCTP_NET_ANY, },
1467 
1468 	/* remote eid 20, net 1, local eid 11 */
1469 	{ .name = "remote21local11", .bind_addr = 11,
1470 		.bind_net = MCTP_NET_ANY, .bind_type = 1,
1471 		.have_peer = true, .peer_addr = 21, .peer_net = MCTP_NET_ANY, },
1472 
1473 	/* remote eid 21, specific net=3 for connect() */
1474 	{ .name = "remote21net3", .bind_addr = MCTP_ADDR_ANY,
1475 		.bind_net = MCTP_NET_ANY, .bind_type = 1,
1476 		.have_peer = true, .peer_addr = 21, .peer_net = 3, },
1477 
1478 	/* remote eid 21, net 4 for bind, specific net=4 for connect() */
1479 	{ .name = "remote21net4", .bind_addr = MCTP_ADDR_ANY,
1480 		.bind_net = 4, .bind_type = 1,
1481 		.have_peer = true, .peer_addr = 21, .peer_net = 4, },
1482 
1483 	/* remote eid 21, net 5 for bind, specific net=5 for connect() */
1484 	{ .name = "remote21net5", .bind_addr = MCTP_ADDR_ANY,
1485 		.bind_net = 5, .bind_type = 1,
1486 		.have_peer = true, .peer_addr = 21, .peer_net = 5, },
1487 };
1488 
1489 static void mctp_bind_lookup_desc(const struct mctp_bind_lookup_test *t,
1490 				  char *desc)
1491 {
1492 	snprintf(desc, KUNIT_PARAM_DESC_SIZE,
1493 		 "{src %d dst %d ty %d net %d expect %s}",
1494 		 t->hdr.src, t->hdr.dest, t->ty, t->net, t->expect);
1495 }
1496 
1497 KUNIT_ARRAY_PARAM(mctp_bind_lookup, mctp_bind_lookup_tests,
1498 		  mctp_bind_lookup_desc);
1499 
1500 static void mctp_test_bind_lookup(struct kunit *test)
1501 {
1502 	const struct mctp_bind_lookup_test *rx;
1503 	struct socket *socks[ARRAY_SIZE(lookup_binds)];
1504 	struct sk_buff *skb_pkt = NULL, *skb_sock = NULL;
1505 	struct socket *sock_ty0, *sock_expect = NULL;
1506 	struct mctp_test_dev *dev;
1507 	struct mctp_dst dst;
1508 	int rc;
1509 
1510 	rx = test->param_value;
1511 
1512 	__mctp_route_test_init(test, &dev, &dst, &sock_ty0, rx->net);
1513 	/* Create all binds */
1514 	for (size_t i = 0; i < ARRAY_SIZE(lookup_binds); i++) {
1515 		mctp_test_bind_run(test, &lookup_binds[i],
1516 				   &rc, &socks[i]);
1517 		KUNIT_ASSERT_EQ(test, rc, 0);
1518 
1519 		/* Record the expected receive socket */
1520 		if (rx->expect &&
1521 		    strcmp(rx->expect, lookup_binds[i].name) == 0) {
1522 			KUNIT_ASSERT_NULL(test, sock_expect);
1523 			sock_expect = socks[i];
1524 		}
1525 	}
1526 	KUNIT_ASSERT_EQ(test, !!sock_expect, !!rx->expect);
1527 
1528 	/* Create test message */
1529 	skb_pkt = mctp_test_create_skb_data(&rx->hdr, &rx->ty);
1530 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb_pkt);
1531 	mctp_test_skb_set_dev(skb_pkt, dev);
1532 
1533 	rc = mctp_dst_input(&dst, skb_pkt);
1534 	if (rx->expect) {
1535 		/* Test the message is received on the expected socket */
1536 		KUNIT_EXPECT_EQ(test, rc, 0);
1537 		skb_sock = skb_recv_datagram(sock_expect->sk,
1538 					     MSG_DONTWAIT, &rc);
1539 		if (!skb_sock) {
1540 			/* Find which socket received it instead */
1541 			for (size_t i = 0; i < ARRAY_SIZE(lookup_binds); i++) {
1542 				skb_sock = skb_recv_datagram(socks[i]->sk,
1543 							     MSG_DONTWAIT, &rc);
1544 				if (skb_sock) {
1545 					KUNIT_FAIL(test,
1546 						   "received on incorrect socket '%s', expect '%s'",
1547 						   lookup_binds[i].name,
1548 						   rx->expect);
1549 					goto cleanup;
1550 				}
1551 			}
1552 			KUNIT_FAIL(test, "no message received");
1553 		}
1554 	} else {
1555 		KUNIT_EXPECT_NE(test, rc, 0);
1556 	}
1557 
1558 cleanup:
1559 	kfree_skb(skb_sock);
1560 
1561 	/* Drop all binds */
1562 	for (size_t i = 0; i < ARRAY_SIZE(lookup_binds); i++)
1563 		sock_release(socks[i]);
1564 
1565 	__mctp_route_test_fini(test, dev, &dst, sock_ty0);
1566 }
1567 
1568 static struct kunit_case mctp_test_cases[] = {
1569 	KUNIT_CASE_PARAM(mctp_test_fragment, mctp_frag_gen_params),
1570 	KUNIT_CASE_PARAM(mctp_test_rx_input, mctp_rx_input_gen_params),
1571 	KUNIT_CASE_PARAM(mctp_test_route_input_sk, mctp_route_input_sk_gen_params),
1572 	KUNIT_CASE_PARAM(mctp_test_route_input_sk_reasm,
1573 			 mctp_route_input_sk_reasm_gen_params),
1574 	KUNIT_CASE_PARAM(mctp_test_route_input_sk_keys,
1575 			 mctp_route_input_sk_keys_gen_params),
1576 	KUNIT_CASE(mctp_test_route_input_sk_fail_single),
1577 	KUNIT_CASE(mctp_test_route_input_sk_fail_frag),
1578 	KUNIT_CASE(mctp_test_route_input_multiple_nets_bind),
1579 	KUNIT_CASE(mctp_test_route_input_multiple_nets_key),
1580 	KUNIT_CASE(mctp_test_packet_flow),
1581 	KUNIT_CASE(mctp_test_fragment_flow),
1582 	KUNIT_CASE(mctp_test_route_output_key_create),
1583 	KUNIT_CASE(mctp_test_route_input_cloned_frag),
1584 	KUNIT_CASE(mctp_test_route_extaddr_input),
1585 	KUNIT_CASE(mctp_test_route_gw_lookup),
1586 	KUNIT_CASE(mctp_test_route_gw_loop),
1587 	KUNIT_CASE_PARAM(mctp_test_route_gw_mtu, mctp_route_gw_mtu_gen_params),
1588 	KUNIT_CASE(mctp_test_route_gw_output),
1589 	KUNIT_CASE_PARAM(mctp_test_bind_lookup, mctp_bind_lookup_gen_params),
1590 	{}
1591 };
1592 
1593 static struct kunit_suite mctp_test_suite = {
1594 	.name = "mctp-route",
1595 	.test_cases = mctp_test_cases,
1596 };
1597 
1598 kunit_test_suite(mctp_test_suite);
1599