xref: /linux/tools/testing/selftests/net/ipsec.c (revision ec8a42e7343234802b9054874fe01810880289ce)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * ipsec.c - Check xfrm on veth inside a net-ns.
4  * Copyright (c) 2018 Dmitry Safonov
5  */
6 
7 #define _GNU_SOURCE
8 
9 #include <arpa/inet.h>
10 #include <asm/types.h>
11 #include <errno.h>
12 #include <fcntl.h>
13 #include <limits.h>
14 #include <linux/limits.h>
15 #include <linux/netlink.h>
16 #include <linux/random.h>
17 #include <linux/rtnetlink.h>
18 #include <linux/veth.h>
19 #include <linux/xfrm.h>
20 #include <netinet/in.h>
21 #include <net/if.h>
22 #include <sched.h>
23 #include <stdbool.h>
24 #include <stdint.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <sys/mman.h>
29 #include <sys/socket.h>
30 #include <sys/stat.h>
31 #include <sys/syscall.h>
32 #include <sys/types.h>
33 #include <sys/wait.h>
34 #include <time.h>
35 #include <unistd.h>
36 
37 #include "../kselftest.h"
38 
39 #define printk(fmt, ...)						\
40 	ksft_print_msg("%d[%u] " fmt "\n", getpid(), __LINE__, ##__VA_ARGS__)
41 
42 #define pr_err(fmt, ...)	printk(fmt ": %m", ##__VA_ARGS__)
43 
44 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
45 #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
46 
47 #define IPV4_STR_SZ	16	/* xxx.xxx.xxx.xxx is longest + \0 */
48 #define MAX_PAYLOAD	2048
49 #define XFRM_ALGO_KEY_BUF_SIZE	512
50 #define MAX_PROCESSES	(1 << 14) /* /16 mask divided by /30 subnets */
51 #define INADDR_A	((in_addr_t) 0x0a000000) /* 10.0.0.0 */
52 #define INADDR_B	((in_addr_t) 0xc0a80000) /* 192.168.0.0 */
53 
54 /* /30 mask for one veth connection */
55 #define PREFIX_LEN	30
56 #define child_ip(nr)	(4*nr + 1)
57 #define grchild_ip(nr)	(4*nr + 2)
58 
59 #define VETH_FMT	"ktst-%d"
60 #define VETH_LEN	12
61 
62 static int nsfd_parent	= -1;
63 static int nsfd_childa	= -1;
64 static int nsfd_childb	= -1;
65 static long page_size;
66 
67 /*
68  * ksft_cnt is static in kselftest, so isn't shared with children.
69  * We have to send a test result back to parent and count there.
70  * results_fd is a pipe with test feedback from children.
71  */
72 static int results_fd[2];
73 
74 const unsigned int ping_delay_nsec	= 50 * 1000 * 1000;
75 const unsigned int ping_timeout		= 300;
76 const unsigned int ping_count		= 100;
77 const unsigned int ping_success		= 80;
78 
79 static void randomize_buffer(void *buf, size_t buflen)
80 {
81 	int *p = (int *)buf;
82 	size_t words = buflen / sizeof(int);
83 	size_t leftover = buflen % sizeof(int);
84 
85 	if (!buflen)
86 		return;
87 
88 	while (words--)
89 		*p++ = rand();
90 
91 	if (leftover) {
92 		int tmp = rand();
93 
94 		memcpy(buf + buflen - leftover, &tmp, leftover);
95 	}
96 
97 	return;
98 }
99 
100 static int unshare_open(void)
101 {
102 	const char *netns_path = "/proc/self/ns/net";
103 	int fd;
104 
105 	if (unshare(CLONE_NEWNET) != 0) {
106 		pr_err("unshare()");
107 		return -1;
108 	}
109 
110 	fd = open(netns_path, O_RDONLY);
111 	if (fd <= 0) {
112 		pr_err("open(%s)", netns_path);
113 		return -1;
114 	}
115 
116 	return fd;
117 }
118 
119 static int switch_ns(int fd)
120 {
121 	if (setns(fd, CLONE_NEWNET)) {
122 		pr_err("setns()");
123 		return -1;
124 	}
125 	return 0;
126 }
127 
128 /*
129  * Running the test inside a new parent net namespace to bother less
130  * about cleanup on error-path.
131  */
132 static int init_namespaces(void)
133 {
134 	nsfd_parent = unshare_open();
135 	if (nsfd_parent <= 0)
136 		return -1;
137 
138 	nsfd_childa = unshare_open();
139 	if (nsfd_childa <= 0)
140 		return -1;
141 
142 	if (switch_ns(nsfd_parent))
143 		return -1;
144 
145 	nsfd_childb = unshare_open();
146 	if (nsfd_childb <= 0)
147 		return -1;
148 
149 	if (switch_ns(nsfd_parent))
150 		return -1;
151 	return 0;
152 }
153 
154 static int netlink_sock(int *sock, uint32_t *seq_nr, int proto)
155 {
156 	if (*sock > 0) {
157 		seq_nr++;
158 		return 0;
159 	}
160 
161 	*sock = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, proto);
162 	if (*sock <= 0) {
163 		pr_err("socket(AF_NETLINK)");
164 		return -1;
165 	}
166 
167 	randomize_buffer(seq_nr, sizeof(*seq_nr));
168 
169 	return 0;
170 }
171 
172 static inline struct rtattr *rtattr_hdr(struct nlmsghdr *nh)
173 {
174 	return (struct rtattr *)((char *)(nh) + RTA_ALIGN((nh)->nlmsg_len));
175 }
176 
177 static int rtattr_pack(struct nlmsghdr *nh, size_t req_sz,
178 		unsigned short rta_type, const void *payload, size_t size)
179 {
180 	/* NLMSG_ALIGNTO == RTA_ALIGNTO, nlmsg_len already aligned */
181 	struct rtattr *attr = rtattr_hdr(nh);
182 	size_t nl_size = RTA_ALIGN(nh->nlmsg_len) + RTA_LENGTH(size);
183 
184 	if (req_sz < nl_size) {
185 		printk("req buf is too small: %zu < %zu", req_sz, nl_size);
186 		return -1;
187 	}
188 	nh->nlmsg_len = nl_size;
189 
190 	attr->rta_len = RTA_LENGTH(size);
191 	attr->rta_type = rta_type;
192 	memcpy(RTA_DATA(attr), payload, size);
193 
194 	return 0;
195 }
196 
197 static struct rtattr *_rtattr_begin(struct nlmsghdr *nh, size_t req_sz,
198 		unsigned short rta_type, const void *payload, size_t size)
199 {
200 	struct rtattr *ret = rtattr_hdr(nh);
201 
202 	if (rtattr_pack(nh, req_sz, rta_type, payload, size))
203 		return 0;
204 
205 	return ret;
206 }
207 
208 static inline struct rtattr *rtattr_begin(struct nlmsghdr *nh, size_t req_sz,
209 		unsigned short rta_type)
210 {
211 	return _rtattr_begin(nh, req_sz, rta_type, 0, 0);
212 }
213 
214 static inline void rtattr_end(struct nlmsghdr *nh, struct rtattr *attr)
215 {
216 	char *nlmsg_end = (char *)nh + nh->nlmsg_len;
217 
218 	attr->rta_len = nlmsg_end - (char *)attr;
219 }
220 
221 static int veth_pack_peerb(struct nlmsghdr *nh, size_t req_sz,
222 		const char *peer, int ns)
223 {
224 	struct ifinfomsg pi;
225 	struct rtattr *peer_attr;
226 
227 	memset(&pi, 0, sizeof(pi));
228 	pi.ifi_family	= AF_UNSPEC;
229 	pi.ifi_change	= 0xFFFFFFFF;
230 
231 	peer_attr = _rtattr_begin(nh, req_sz, VETH_INFO_PEER, &pi, sizeof(pi));
232 	if (!peer_attr)
233 		return -1;
234 
235 	if (rtattr_pack(nh, req_sz, IFLA_IFNAME, peer, strlen(peer)))
236 		return -1;
237 
238 	if (rtattr_pack(nh, req_sz, IFLA_NET_NS_FD, &ns, sizeof(ns)))
239 		return -1;
240 
241 	rtattr_end(nh, peer_attr);
242 
243 	return 0;
244 }
245 
246 static int netlink_check_answer(int sock)
247 {
248 	struct nlmsgerror {
249 		struct nlmsghdr hdr;
250 		int error;
251 		struct nlmsghdr orig_msg;
252 	} answer;
253 
254 	if (recv(sock, &answer, sizeof(answer), 0) < 0) {
255 		pr_err("recv()");
256 		return -1;
257 	} else if (answer.hdr.nlmsg_type != NLMSG_ERROR) {
258 		printk("expected NLMSG_ERROR, got %d", (int)answer.hdr.nlmsg_type);
259 		return -1;
260 	} else if (answer.error) {
261 		printk("NLMSG_ERROR: %d: %s",
262 			answer.error, strerror(-answer.error));
263 		return answer.error;
264 	}
265 
266 	return 0;
267 }
268 
269 static int veth_add(int sock, uint32_t seq, const char *peera, int ns_a,
270 		const char *peerb, int ns_b)
271 {
272 	uint16_t flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_EXCL | NLM_F_CREATE;
273 	struct {
274 		struct nlmsghdr		nh;
275 		struct ifinfomsg	info;
276 		char			attrbuf[MAX_PAYLOAD];
277 	} req;
278 	const char veth_type[] = "veth";
279 	struct rtattr *link_info, *info_data;
280 
281 	memset(&req, 0, sizeof(req));
282 	req.nh.nlmsg_len	= NLMSG_LENGTH(sizeof(req.info));
283 	req.nh.nlmsg_type	= RTM_NEWLINK;
284 	req.nh.nlmsg_flags	= flags;
285 	req.nh.nlmsg_seq	= seq;
286 	req.info.ifi_family	= AF_UNSPEC;
287 	req.info.ifi_change	= 0xFFFFFFFF;
288 
289 	if (rtattr_pack(&req.nh, sizeof(req), IFLA_IFNAME, peera, strlen(peera)))
290 		return -1;
291 
292 	if (rtattr_pack(&req.nh, sizeof(req), IFLA_NET_NS_FD, &ns_a, sizeof(ns_a)))
293 		return -1;
294 
295 	link_info = rtattr_begin(&req.nh, sizeof(req), IFLA_LINKINFO);
296 	if (!link_info)
297 		return -1;
298 
299 	if (rtattr_pack(&req.nh, sizeof(req), IFLA_INFO_KIND, veth_type, sizeof(veth_type)))
300 		return -1;
301 
302 	info_data = rtattr_begin(&req.nh, sizeof(req), IFLA_INFO_DATA);
303 	if (!info_data)
304 		return -1;
305 
306 	if (veth_pack_peerb(&req.nh, sizeof(req), peerb, ns_b))
307 		return -1;
308 
309 	rtattr_end(&req.nh, info_data);
310 	rtattr_end(&req.nh, link_info);
311 
312 	if (send(sock, &req, req.nh.nlmsg_len, 0) < 0) {
313 		pr_err("send()");
314 		return -1;
315 	}
316 	return netlink_check_answer(sock);
317 }
318 
319 static int ip4_addr_set(int sock, uint32_t seq, const char *intf,
320 		struct in_addr addr, uint8_t prefix)
321 {
322 	uint16_t flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_EXCL | NLM_F_CREATE;
323 	struct {
324 		struct nlmsghdr		nh;
325 		struct ifaddrmsg	info;
326 		char			attrbuf[MAX_PAYLOAD];
327 	} req;
328 
329 	memset(&req, 0, sizeof(req));
330 	req.nh.nlmsg_len	= NLMSG_LENGTH(sizeof(req.info));
331 	req.nh.nlmsg_type	= RTM_NEWADDR;
332 	req.nh.nlmsg_flags	= flags;
333 	req.nh.nlmsg_seq	= seq;
334 	req.info.ifa_family	= AF_INET;
335 	req.info.ifa_prefixlen	= prefix;
336 	req.info.ifa_index	= if_nametoindex(intf);
337 
338 #ifdef DEBUG
339 	{
340 		char addr_str[IPV4_STR_SZ] = {};
341 
342 		strncpy(addr_str, inet_ntoa(addr), IPV4_STR_SZ - 1);
343 
344 		printk("ip addr set %s", addr_str);
345 	}
346 #endif
347 
348 	if (rtattr_pack(&req.nh, sizeof(req), IFA_LOCAL, &addr, sizeof(addr)))
349 		return -1;
350 
351 	if (rtattr_pack(&req.nh, sizeof(req), IFA_ADDRESS, &addr, sizeof(addr)))
352 		return -1;
353 
354 	if (send(sock, &req, req.nh.nlmsg_len, 0) < 0) {
355 		pr_err("send()");
356 		return -1;
357 	}
358 	return netlink_check_answer(sock);
359 }
360 
361 static int link_set_up(int sock, uint32_t seq, const char *intf)
362 {
363 	struct {
364 		struct nlmsghdr		nh;
365 		struct ifinfomsg	info;
366 		char			attrbuf[MAX_PAYLOAD];
367 	} req;
368 
369 	memset(&req, 0, sizeof(req));
370 	req.nh.nlmsg_len	= NLMSG_LENGTH(sizeof(req.info));
371 	req.nh.nlmsg_type	= RTM_NEWLINK;
372 	req.nh.nlmsg_flags	= NLM_F_REQUEST | NLM_F_ACK;
373 	req.nh.nlmsg_seq	= seq;
374 	req.info.ifi_family	= AF_UNSPEC;
375 	req.info.ifi_change	= 0xFFFFFFFF;
376 	req.info.ifi_index	= if_nametoindex(intf);
377 	req.info.ifi_flags	= IFF_UP;
378 	req.info.ifi_change	= IFF_UP;
379 
380 	if (send(sock, &req, req.nh.nlmsg_len, 0) < 0) {
381 		pr_err("send()");
382 		return -1;
383 	}
384 	return netlink_check_answer(sock);
385 }
386 
387 static int ip4_route_set(int sock, uint32_t seq, const char *intf,
388 		struct in_addr src, struct in_addr dst)
389 {
390 	struct {
391 		struct nlmsghdr	nh;
392 		struct rtmsg	rt;
393 		char		attrbuf[MAX_PAYLOAD];
394 	} req;
395 	unsigned int index = if_nametoindex(intf);
396 
397 	memset(&req, 0, sizeof(req));
398 	req.nh.nlmsg_len	= NLMSG_LENGTH(sizeof(req.rt));
399 	req.nh.nlmsg_type	= RTM_NEWROUTE;
400 	req.nh.nlmsg_flags	= NLM_F_REQUEST | NLM_F_ACK | NLM_F_CREATE;
401 	req.nh.nlmsg_seq	= seq;
402 	req.rt.rtm_family	= AF_INET;
403 	req.rt.rtm_dst_len	= 32;
404 	req.rt.rtm_table	= RT_TABLE_MAIN;
405 	req.rt.rtm_protocol	= RTPROT_BOOT;
406 	req.rt.rtm_scope	= RT_SCOPE_LINK;
407 	req.rt.rtm_type		= RTN_UNICAST;
408 
409 	if (rtattr_pack(&req.nh, sizeof(req), RTA_DST, &dst, sizeof(dst)))
410 		return -1;
411 
412 	if (rtattr_pack(&req.nh, sizeof(req), RTA_PREFSRC, &src, sizeof(src)))
413 		return -1;
414 
415 	if (rtattr_pack(&req.nh, sizeof(req), RTA_OIF, &index, sizeof(index)))
416 		return -1;
417 
418 	if (send(sock, &req, req.nh.nlmsg_len, 0) < 0) {
419 		pr_err("send()");
420 		return -1;
421 	}
422 
423 	return netlink_check_answer(sock);
424 }
425 
426 static int tunnel_set_route(int route_sock, uint32_t *route_seq, char *veth,
427 		struct in_addr tunsrc, struct in_addr tundst)
428 {
429 	if (ip4_addr_set(route_sock, (*route_seq)++, "lo",
430 			tunsrc, PREFIX_LEN)) {
431 		printk("Failed to set ipv4 addr");
432 		return -1;
433 	}
434 
435 	if (ip4_route_set(route_sock, (*route_seq)++, veth, tunsrc, tundst)) {
436 		printk("Failed to set ipv4 route");
437 		return -1;
438 	}
439 
440 	return 0;
441 }
442 
443 static int init_child(int nsfd, char *veth, unsigned int src, unsigned int dst)
444 {
445 	struct in_addr intsrc = inet_makeaddr(INADDR_B, src);
446 	struct in_addr tunsrc = inet_makeaddr(INADDR_A, src);
447 	struct in_addr tundst = inet_makeaddr(INADDR_A, dst);
448 	int route_sock = -1, ret = -1;
449 	uint32_t route_seq;
450 
451 	if (switch_ns(nsfd))
452 		return -1;
453 
454 	if (netlink_sock(&route_sock, &route_seq, NETLINK_ROUTE)) {
455 		printk("Failed to open netlink route socket in child");
456 		return -1;
457 	}
458 
459 	if (ip4_addr_set(route_sock, route_seq++, veth, intsrc, PREFIX_LEN)) {
460 		printk("Failed to set ipv4 addr");
461 		goto err;
462 	}
463 
464 	if (link_set_up(route_sock, route_seq++, veth)) {
465 		printk("Failed to bring up %s", veth);
466 		goto err;
467 	}
468 
469 	if (tunnel_set_route(route_sock, &route_seq, veth, tunsrc, tundst)) {
470 		printk("Failed to add tunnel route on %s", veth);
471 		goto err;
472 	}
473 	ret = 0;
474 
475 err:
476 	close(route_sock);
477 	return ret;
478 }
479 
480 #define ALGO_LEN	64
481 enum desc_type {
482 	CREATE_TUNNEL	= 0,
483 	ALLOCATE_SPI,
484 	MONITOR_ACQUIRE,
485 	EXPIRE_STATE,
486 	EXPIRE_POLICY,
487 };
488 const char *desc_name[] = {
489 	"create tunnel",
490 	"alloc spi",
491 	"monitor acquire",
492 	"expire state",
493 	"expire policy"
494 };
495 struct xfrm_desc {
496 	enum desc_type	type;
497 	uint8_t		proto;
498 	char		a_algo[ALGO_LEN];
499 	char		e_algo[ALGO_LEN];
500 	char		c_algo[ALGO_LEN];
501 	char		ae_algo[ALGO_LEN];
502 	unsigned int	icv_len;
503 	/* unsigned key_len; */
504 };
505 
506 enum msg_type {
507 	MSG_ACK		= 0,
508 	MSG_EXIT,
509 	MSG_PING,
510 	MSG_XFRM_PREPARE,
511 	MSG_XFRM_ADD,
512 	MSG_XFRM_DEL,
513 	MSG_XFRM_CLEANUP,
514 };
515 
516 struct test_desc {
517 	enum msg_type type;
518 	union {
519 		struct {
520 			in_addr_t reply_ip;
521 			unsigned int port;
522 		} ping;
523 		struct xfrm_desc xfrm_desc;
524 	} body;
525 };
526 
527 struct test_result {
528 	struct xfrm_desc desc;
529 	unsigned int res;
530 };
531 
532 static void write_test_result(unsigned int res, struct xfrm_desc *d)
533 {
534 	struct test_result tr = {};
535 	ssize_t ret;
536 
537 	tr.desc = *d;
538 	tr.res = res;
539 
540 	ret = write(results_fd[1], &tr, sizeof(tr));
541 	if (ret != sizeof(tr))
542 		pr_err("Failed to write the result in pipe %zd", ret);
543 }
544 
545 static void write_msg(int fd, struct test_desc *msg, bool exit_of_fail)
546 {
547 	ssize_t bytes = write(fd, msg, sizeof(*msg));
548 
549 	/* Make sure that write/read is atomic to a pipe */
550 	BUILD_BUG_ON(sizeof(struct test_desc) > PIPE_BUF);
551 
552 	if (bytes < 0) {
553 		pr_err("write()");
554 		if (exit_of_fail)
555 			exit(KSFT_FAIL);
556 	}
557 	if (bytes != sizeof(*msg)) {
558 		pr_err("sent part of the message %zd/%zu", bytes, sizeof(*msg));
559 		if (exit_of_fail)
560 			exit(KSFT_FAIL);
561 	}
562 }
563 
564 static void read_msg(int fd, struct test_desc *msg, bool exit_of_fail)
565 {
566 	ssize_t bytes = read(fd, msg, sizeof(*msg));
567 
568 	if (bytes < 0) {
569 		pr_err("read()");
570 		if (exit_of_fail)
571 			exit(KSFT_FAIL);
572 	}
573 	if (bytes != sizeof(*msg)) {
574 		pr_err("got incomplete message %zd/%zu", bytes, sizeof(*msg));
575 		if (exit_of_fail)
576 			exit(KSFT_FAIL);
577 	}
578 }
579 
580 static int udp_ping_init(struct in_addr listen_ip, unsigned int u_timeout,
581 		unsigned int *server_port, int sock[2])
582 {
583 	struct sockaddr_in server;
584 	struct timeval t = { .tv_sec = 0, .tv_usec = u_timeout };
585 	socklen_t s_len = sizeof(server);
586 
587 	sock[0] = socket(AF_INET, SOCK_DGRAM, 0);
588 	if (sock[0] < 0) {
589 		pr_err("socket()");
590 		return -1;
591 	}
592 
593 	server.sin_family	= AF_INET;
594 	server.sin_port		= 0;
595 	memcpy(&server.sin_addr.s_addr, &listen_ip, sizeof(struct in_addr));
596 
597 	if (bind(sock[0], (struct sockaddr *)&server, s_len)) {
598 		pr_err("bind()");
599 		goto err_close_server;
600 	}
601 
602 	if (getsockname(sock[0], (struct sockaddr *)&server, &s_len)) {
603 		pr_err("getsockname()");
604 		goto err_close_server;
605 	}
606 
607 	*server_port = ntohs(server.sin_port);
608 
609 	if (setsockopt(sock[0], SOL_SOCKET, SO_RCVTIMEO, (const char *)&t, sizeof t)) {
610 		pr_err("setsockopt()");
611 		goto err_close_server;
612 	}
613 
614 	sock[1] = socket(AF_INET, SOCK_DGRAM, 0);
615 	if (sock[1] < 0) {
616 		pr_err("socket()");
617 		goto err_close_server;
618 	}
619 
620 	return 0;
621 
622 err_close_server:
623 	close(sock[0]);
624 	return -1;
625 }
626 
627 static int udp_ping_send(int sock[2], in_addr_t dest_ip, unsigned int port,
628 		char *buf, size_t buf_len)
629 {
630 	struct sockaddr_in server;
631 	const struct sockaddr *dest_addr = (struct sockaddr *)&server;
632 	char *sock_buf[buf_len];
633 	ssize_t r_bytes, s_bytes;
634 
635 	server.sin_family	= AF_INET;
636 	server.sin_port		= htons(port);
637 	server.sin_addr.s_addr	= dest_ip;
638 
639 	s_bytes = sendto(sock[1], buf, buf_len, 0, dest_addr, sizeof(server));
640 	if (s_bytes < 0) {
641 		pr_err("sendto()");
642 		return -1;
643 	} else if (s_bytes != buf_len) {
644 		printk("send part of the message: %zd/%zu", s_bytes, sizeof(server));
645 		return -1;
646 	}
647 
648 	r_bytes = recv(sock[0], sock_buf, buf_len, 0);
649 	if (r_bytes < 0) {
650 		if (errno != EAGAIN)
651 			pr_err("recv()");
652 		return -1;
653 	} else if (r_bytes == 0) { /* EOF */
654 		printk("EOF on reply to ping");
655 		return -1;
656 	} else if (r_bytes != buf_len || memcmp(buf, sock_buf, buf_len)) {
657 		printk("ping reply packet is corrupted %zd/%zu", r_bytes, buf_len);
658 		return -1;
659 	}
660 
661 	return 0;
662 }
663 
664 static int udp_ping_reply(int sock[2], in_addr_t dest_ip, unsigned int port,
665 		char *buf, size_t buf_len)
666 {
667 	struct sockaddr_in server;
668 	const struct sockaddr *dest_addr = (struct sockaddr *)&server;
669 	char *sock_buf[buf_len];
670 	ssize_t r_bytes, s_bytes;
671 
672 	server.sin_family	= AF_INET;
673 	server.sin_port		= htons(port);
674 	server.sin_addr.s_addr	= dest_ip;
675 
676 	r_bytes = recv(sock[0], sock_buf, buf_len, 0);
677 	if (r_bytes < 0) {
678 		if (errno != EAGAIN)
679 			pr_err("recv()");
680 		return -1;
681 	}
682 	if (r_bytes == 0) { /* EOF */
683 		printk("EOF on reply to ping");
684 		return -1;
685 	}
686 	if (r_bytes != buf_len || memcmp(buf, sock_buf, buf_len)) {
687 		printk("ping reply packet is corrupted %zd/%zu", r_bytes, buf_len);
688 		return -1;
689 	}
690 
691 	s_bytes = sendto(sock[1], buf, buf_len, 0, dest_addr, sizeof(server));
692 	if (s_bytes < 0) {
693 		pr_err("sendto()");
694 		return -1;
695 	} else if (s_bytes != buf_len) {
696 		printk("send part of the message: %zd/%zu", s_bytes, sizeof(server));
697 		return -1;
698 	}
699 
700 	return 0;
701 }
702 
703 typedef int (*ping_f)(int sock[2], in_addr_t dest_ip, unsigned int port,
704 		char *buf, size_t buf_len);
705 static int do_ping(int cmd_fd, char *buf, size_t buf_len, struct in_addr from,
706 		bool init_side, int d_port, in_addr_t to, ping_f func)
707 {
708 	struct test_desc msg;
709 	unsigned int s_port, i, ping_succeeded = 0;
710 	int ping_sock[2];
711 	char to_str[IPV4_STR_SZ] = {}, from_str[IPV4_STR_SZ] = {};
712 
713 	if (udp_ping_init(from, ping_timeout, &s_port, ping_sock)) {
714 		printk("Failed to init ping");
715 		return -1;
716 	}
717 
718 	memset(&msg, 0, sizeof(msg));
719 	msg.type		= MSG_PING;
720 	msg.body.ping.port	= s_port;
721 	memcpy(&msg.body.ping.reply_ip, &from, sizeof(from));
722 
723 	write_msg(cmd_fd, &msg, 0);
724 	if (init_side) {
725 		/* The other end sends ip to ping */
726 		read_msg(cmd_fd, &msg, 0);
727 		if (msg.type != MSG_PING)
728 			return -1;
729 		to = msg.body.ping.reply_ip;
730 		d_port = msg.body.ping.port;
731 	}
732 
733 	for (i = 0; i < ping_count ; i++) {
734 		struct timespec sleep_time = {
735 			.tv_sec = 0,
736 			.tv_nsec = ping_delay_nsec,
737 		};
738 
739 		ping_succeeded += !func(ping_sock, to, d_port, buf, page_size);
740 		nanosleep(&sleep_time, 0);
741 	}
742 
743 	close(ping_sock[0]);
744 	close(ping_sock[1]);
745 
746 	strncpy(to_str, inet_ntoa(*(struct in_addr *)&to), IPV4_STR_SZ - 1);
747 	strncpy(from_str, inet_ntoa(from), IPV4_STR_SZ - 1);
748 
749 	if (ping_succeeded < ping_success) {
750 		printk("ping (%s) %s->%s failed %u/%u times",
751 			init_side ? "send" : "reply", from_str, to_str,
752 			ping_count - ping_succeeded, ping_count);
753 		return -1;
754 	}
755 
756 #ifdef DEBUG
757 	printk("ping (%s) %s->%s succeeded %u/%u times",
758 		init_side ? "send" : "reply", from_str, to_str,
759 		ping_succeeded, ping_count);
760 #endif
761 
762 	return 0;
763 }
764 
765 static int xfrm_fill_key(char *name, char *buf,
766 		size_t buf_len, unsigned int *key_len)
767 {
768 	/* TODO: use set/map instead */
769 	if (strncmp(name, "digest_null", ALGO_LEN) == 0)
770 		*key_len = 0;
771 	else if (strncmp(name, "ecb(cipher_null)", ALGO_LEN) == 0)
772 		*key_len = 0;
773 	else if (strncmp(name, "cbc(des)", ALGO_LEN) == 0)
774 		*key_len = 64;
775 	else if (strncmp(name, "hmac(md5)", ALGO_LEN) == 0)
776 		*key_len = 128;
777 	else if (strncmp(name, "cmac(aes)", ALGO_LEN) == 0)
778 		*key_len = 128;
779 	else if (strncmp(name, "xcbc(aes)", ALGO_LEN) == 0)
780 		*key_len = 128;
781 	else if (strncmp(name, "cbc(cast5)", ALGO_LEN) == 0)
782 		*key_len = 128;
783 	else if (strncmp(name, "cbc(serpent)", ALGO_LEN) == 0)
784 		*key_len = 128;
785 	else if (strncmp(name, "hmac(sha1)", ALGO_LEN) == 0)
786 		*key_len = 160;
787 	else if (strncmp(name, "hmac(rmd160)", ALGO_LEN) == 0)
788 		*key_len = 160;
789 	else if (strncmp(name, "cbc(des3_ede)", ALGO_LEN) == 0)
790 		*key_len = 192;
791 	else if (strncmp(name, "hmac(sha256)", ALGO_LEN) == 0)
792 		*key_len = 256;
793 	else if (strncmp(name, "cbc(aes)", ALGO_LEN) == 0)
794 		*key_len = 256;
795 	else if (strncmp(name, "cbc(camellia)", ALGO_LEN) == 0)
796 		*key_len = 256;
797 	else if (strncmp(name, "cbc(twofish)", ALGO_LEN) == 0)
798 		*key_len = 256;
799 	else if (strncmp(name, "rfc3686(ctr(aes))", ALGO_LEN) == 0)
800 		*key_len = 288;
801 	else if (strncmp(name, "hmac(sha384)", ALGO_LEN) == 0)
802 		*key_len = 384;
803 	else if (strncmp(name, "cbc(blowfish)", ALGO_LEN) == 0)
804 		*key_len = 448;
805 	else if (strncmp(name, "hmac(sha512)", ALGO_LEN) == 0)
806 		*key_len = 512;
807 	else if (strncmp(name, "rfc4106(gcm(aes))-128", ALGO_LEN) == 0)
808 		*key_len = 160;
809 	else if (strncmp(name, "rfc4543(gcm(aes))-128", ALGO_LEN) == 0)
810 		*key_len = 160;
811 	else if (strncmp(name, "rfc4309(ccm(aes))-128", ALGO_LEN) == 0)
812 		*key_len = 152;
813 	else if (strncmp(name, "rfc4106(gcm(aes))-192", ALGO_LEN) == 0)
814 		*key_len = 224;
815 	else if (strncmp(name, "rfc4543(gcm(aes))-192", ALGO_LEN) == 0)
816 		*key_len = 224;
817 	else if (strncmp(name, "rfc4309(ccm(aes))-192", ALGO_LEN) == 0)
818 		*key_len = 216;
819 	else if (strncmp(name, "rfc4106(gcm(aes))-256", ALGO_LEN) == 0)
820 		*key_len = 288;
821 	else if (strncmp(name, "rfc4543(gcm(aes))-256", ALGO_LEN) == 0)
822 		*key_len = 288;
823 	else if (strncmp(name, "rfc4309(ccm(aes))-256", ALGO_LEN) == 0)
824 		*key_len = 280;
825 	else if (strncmp(name, "rfc7539(chacha20,poly1305)-128", ALGO_LEN) == 0)
826 		*key_len = 0;
827 
828 	if (*key_len > buf_len) {
829 		printk("Can't pack a key - too big for buffer");
830 		return -1;
831 	}
832 
833 	randomize_buffer(buf, *key_len);
834 
835 	return 0;
836 }
837 
838 static int xfrm_state_pack_algo(struct nlmsghdr *nh, size_t req_sz,
839 		struct xfrm_desc *desc)
840 {
841 	struct {
842 		union {
843 			struct xfrm_algo	alg;
844 			struct xfrm_algo_aead	aead;
845 			struct xfrm_algo_auth	auth;
846 		} u;
847 		char buf[XFRM_ALGO_KEY_BUF_SIZE];
848 	} alg = {};
849 	size_t alen, elen, clen, aelen;
850 	unsigned short type;
851 
852 	alen = strlen(desc->a_algo);
853 	elen = strlen(desc->e_algo);
854 	clen = strlen(desc->c_algo);
855 	aelen = strlen(desc->ae_algo);
856 
857 	/* Verify desc */
858 	switch (desc->proto) {
859 	case IPPROTO_AH:
860 		if (!alen || elen || clen || aelen) {
861 			printk("BUG: buggy ah desc");
862 			return -1;
863 		}
864 		strncpy(alg.u.alg.alg_name, desc->a_algo, ALGO_LEN - 1);
865 		if (xfrm_fill_key(desc->a_algo, alg.u.alg.alg_key,
866 				sizeof(alg.buf), &alg.u.alg.alg_key_len))
867 			return -1;
868 		type = XFRMA_ALG_AUTH;
869 		break;
870 	case IPPROTO_COMP:
871 		if (!clen || elen || alen || aelen) {
872 			printk("BUG: buggy comp desc");
873 			return -1;
874 		}
875 		strncpy(alg.u.alg.alg_name, desc->c_algo, ALGO_LEN - 1);
876 		if (xfrm_fill_key(desc->c_algo, alg.u.alg.alg_key,
877 				sizeof(alg.buf), &alg.u.alg.alg_key_len))
878 			return -1;
879 		type = XFRMA_ALG_COMP;
880 		break;
881 	case IPPROTO_ESP:
882 		if (!((alen && elen) ^ aelen) || clen) {
883 			printk("BUG: buggy esp desc");
884 			return -1;
885 		}
886 		if (aelen) {
887 			alg.u.aead.alg_icv_len = desc->icv_len;
888 			strncpy(alg.u.aead.alg_name, desc->ae_algo, ALGO_LEN - 1);
889 			if (xfrm_fill_key(desc->ae_algo, alg.u.aead.alg_key,
890 						sizeof(alg.buf), &alg.u.aead.alg_key_len))
891 				return -1;
892 			type = XFRMA_ALG_AEAD;
893 		} else {
894 
895 			strncpy(alg.u.alg.alg_name, desc->e_algo, ALGO_LEN - 1);
896 			type = XFRMA_ALG_CRYPT;
897 			if (xfrm_fill_key(desc->e_algo, alg.u.alg.alg_key,
898 						sizeof(alg.buf), &alg.u.alg.alg_key_len))
899 				return -1;
900 			if (rtattr_pack(nh, req_sz, type, &alg, sizeof(alg)))
901 				return -1;
902 
903 			strncpy(alg.u.alg.alg_name, desc->a_algo, ALGO_LEN);
904 			type = XFRMA_ALG_AUTH;
905 			if (xfrm_fill_key(desc->a_algo, alg.u.alg.alg_key,
906 						sizeof(alg.buf), &alg.u.alg.alg_key_len))
907 				return -1;
908 		}
909 		break;
910 	default:
911 		printk("BUG: unknown proto in desc");
912 		return -1;
913 	}
914 
915 	if (rtattr_pack(nh, req_sz, type, &alg, sizeof(alg)))
916 		return -1;
917 
918 	return 0;
919 }
920 
921 static inline uint32_t gen_spi(struct in_addr src)
922 {
923 	return htonl(inet_lnaof(src));
924 }
925 
926 static int xfrm_state_add(int xfrm_sock, uint32_t seq, uint32_t spi,
927 		struct in_addr src, struct in_addr dst,
928 		struct xfrm_desc *desc)
929 {
930 	struct {
931 		struct nlmsghdr		nh;
932 		struct xfrm_usersa_info	info;
933 		char			attrbuf[MAX_PAYLOAD];
934 	} req;
935 
936 	memset(&req, 0, sizeof(req));
937 	req.nh.nlmsg_len	= NLMSG_LENGTH(sizeof(req.info));
938 	req.nh.nlmsg_type	= XFRM_MSG_NEWSA;
939 	req.nh.nlmsg_flags	= NLM_F_REQUEST | NLM_F_ACK;
940 	req.nh.nlmsg_seq	= seq;
941 
942 	/* Fill selector. */
943 	memcpy(&req.info.sel.daddr, &dst, sizeof(dst));
944 	memcpy(&req.info.sel.saddr, &src, sizeof(src));
945 	req.info.sel.family		= AF_INET;
946 	req.info.sel.prefixlen_d	= PREFIX_LEN;
947 	req.info.sel.prefixlen_s	= PREFIX_LEN;
948 
949 	/* Fill id */
950 	memcpy(&req.info.id.daddr, &dst, sizeof(dst));
951 	/* Note: zero-spi cannot be deleted */
952 	req.info.id.spi = spi;
953 	req.info.id.proto	= desc->proto;
954 
955 	memcpy(&req.info.saddr, &src, sizeof(src));
956 
957 	/* Fill lifteme_cfg */
958 	req.info.lft.soft_byte_limit	= XFRM_INF;
959 	req.info.lft.hard_byte_limit	= XFRM_INF;
960 	req.info.lft.soft_packet_limit	= XFRM_INF;
961 	req.info.lft.hard_packet_limit	= XFRM_INF;
962 
963 	req.info.family		= AF_INET;
964 	req.info.mode		= XFRM_MODE_TUNNEL;
965 
966 	if (xfrm_state_pack_algo(&req.nh, sizeof(req), desc))
967 		return -1;
968 
969 	if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
970 		pr_err("send()");
971 		return -1;
972 	}
973 
974 	return netlink_check_answer(xfrm_sock);
975 }
976 
977 static bool xfrm_usersa_found(struct xfrm_usersa_info *info, uint32_t spi,
978 		struct in_addr src, struct in_addr dst,
979 		struct xfrm_desc *desc)
980 {
981 	if (memcmp(&info->sel.daddr, &dst, sizeof(dst)))
982 		return false;
983 
984 	if (memcmp(&info->sel.saddr, &src, sizeof(src)))
985 		return false;
986 
987 	if (info->sel.family != AF_INET					||
988 			info->sel.prefixlen_d != PREFIX_LEN		||
989 			info->sel.prefixlen_s != PREFIX_LEN)
990 		return false;
991 
992 	if (info->id.spi != spi || info->id.proto != desc->proto)
993 		return false;
994 
995 	if (memcmp(&info->id.daddr, &dst, sizeof(dst)))
996 		return false;
997 
998 	if (memcmp(&info->saddr, &src, sizeof(src)))
999 		return false;
1000 
1001 	if (info->lft.soft_byte_limit != XFRM_INF			||
1002 			info->lft.hard_byte_limit != XFRM_INF		||
1003 			info->lft.soft_packet_limit != XFRM_INF		||
1004 			info->lft.hard_packet_limit != XFRM_INF)
1005 		return false;
1006 
1007 	if (info->family != AF_INET || info->mode != XFRM_MODE_TUNNEL)
1008 		return false;
1009 
1010 	/* XXX: check xfrm algo, see xfrm_state_pack_algo(). */
1011 
1012 	return true;
1013 }
1014 
1015 static int xfrm_state_check(int xfrm_sock, uint32_t seq, uint32_t spi,
1016 		struct in_addr src, struct in_addr dst,
1017 		struct xfrm_desc *desc)
1018 {
1019 	struct {
1020 		struct nlmsghdr		nh;
1021 		char			attrbuf[MAX_PAYLOAD];
1022 	} req;
1023 	struct {
1024 		struct nlmsghdr		nh;
1025 		union {
1026 			struct xfrm_usersa_info	info;
1027 			int error;
1028 		};
1029 		char			attrbuf[MAX_PAYLOAD];
1030 	} answer;
1031 	struct xfrm_address_filter filter = {};
1032 	bool found = false;
1033 
1034 
1035 	memset(&req, 0, sizeof(req));
1036 	req.nh.nlmsg_len	= NLMSG_LENGTH(0);
1037 	req.nh.nlmsg_type	= XFRM_MSG_GETSA;
1038 	req.nh.nlmsg_flags	= NLM_F_REQUEST | NLM_F_DUMP;
1039 	req.nh.nlmsg_seq	= seq;
1040 
1041 	/*
1042 	 * Add dump filter by source address as there may be other tunnels
1043 	 * in this netns (if tests run in parallel).
1044 	 */
1045 	filter.family = AF_INET;
1046 	filter.splen = 0x1f;	/* 0xffffffff mask see addr_match() */
1047 	memcpy(&filter.saddr, &src, sizeof(src));
1048 	if (rtattr_pack(&req.nh, sizeof(req), XFRMA_ADDRESS_FILTER,
1049 				&filter, sizeof(filter)))
1050 		return -1;
1051 
1052 	if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
1053 		pr_err("send()");
1054 		return -1;
1055 	}
1056 
1057 	while (1) {
1058 		if (recv(xfrm_sock, &answer, sizeof(answer), 0) < 0) {
1059 			pr_err("recv()");
1060 			return -1;
1061 		}
1062 		if (answer.nh.nlmsg_type == NLMSG_ERROR) {
1063 			printk("NLMSG_ERROR: %d: %s",
1064 				answer.error, strerror(-answer.error));
1065 			return -1;
1066 		} else if (answer.nh.nlmsg_type == NLMSG_DONE) {
1067 			if (found)
1068 				return 0;
1069 			printk("didn't find allocated xfrm state in dump");
1070 			return -1;
1071 		} else if (answer.nh.nlmsg_type == XFRM_MSG_NEWSA) {
1072 			if (xfrm_usersa_found(&answer.info, spi, src, dst, desc))
1073 				found = true;
1074 		}
1075 	}
1076 }
1077 
1078 static int xfrm_set(int xfrm_sock, uint32_t *seq,
1079 		struct in_addr src, struct in_addr dst,
1080 		struct in_addr tunsrc, struct in_addr tundst,
1081 		struct xfrm_desc *desc)
1082 {
1083 	int err;
1084 
1085 	err = xfrm_state_add(xfrm_sock, (*seq)++, gen_spi(src), src, dst, desc);
1086 	if (err) {
1087 		printk("Failed to add xfrm state");
1088 		return -1;
1089 	}
1090 
1091 	err = xfrm_state_add(xfrm_sock, (*seq)++, gen_spi(src), dst, src, desc);
1092 	if (err) {
1093 		printk("Failed to add xfrm state");
1094 		return -1;
1095 	}
1096 
1097 	/* Check dumps for XFRM_MSG_GETSA */
1098 	err = xfrm_state_check(xfrm_sock, (*seq)++, gen_spi(src), src, dst, desc);
1099 	err |= xfrm_state_check(xfrm_sock, (*seq)++, gen_spi(src), dst, src, desc);
1100 	if (err) {
1101 		printk("Failed to check xfrm state");
1102 		return -1;
1103 	}
1104 
1105 	return 0;
1106 }
1107 
1108 static int xfrm_policy_add(int xfrm_sock, uint32_t seq, uint32_t spi,
1109 		struct in_addr src, struct in_addr dst, uint8_t dir,
1110 		struct in_addr tunsrc, struct in_addr tundst, uint8_t proto)
1111 {
1112 	struct {
1113 		struct nlmsghdr			nh;
1114 		struct xfrm_userpolicy_info	info;
1115 		char				attrbuf[MAX_PAYLOAD];
1116 	} req;
1117 	struct xfrm_user_tmpl tmpl;
1118 
1119 	memset(&req, 0, sizeof(req));
1120 	memset(&tmpl, 0, sizeof(tmpl));
1121 	req.nh.nlmsg_len	= NLMSG_LENGTH(sizeof(req.info));
1122 	req.nh.nlmsg_type	= XFRM_MSG_NEWPOLICY;
1123 	req.nh.nlmsg_flags	= NLM_F_REQUEST | NLM_F_ACK;
1124 	req.nh.nlmsg_seq	= seq;
1125 
1126 	/* Fill selector. */
1127 	memcpy(&req.info.sel.daddr, &dst, sizeof(tundst));
1128 	memcpy(&req.info.sel.saddr, &src, sizeof(tunsrc));
1129 	req.info.sel.family		= AF_INET;
1130 	req.info.sel.prefixlen_d	= PREFIX_LEN;
1131 	req.info.sel.prefixlen_s	= PREFIX_LEN;
1132 
1133 	/* Fill lifteme_cfg */
1134 	req.info.lft.soft_byte_limit	= XFRM_INF;
1135 	req.info.lft.hard_byte_limit	= XFRM_INF;
1136 	req.info.lft.soft_packet_limit	= XFRM_INF;
1137 	req.info.lft.hard_packet_limit	= XFRM_INF;
1138 
1139 	req.info.dir = dir;
1140 
1141 	/* Fill tmpl */
1142 	memcpy(&tmpl.id.daddr, &dst, sizeof(dst));
1143 	/* Note: zero-spi cannot be deleted */
1144 	tmpl.id.spi = spi;
1145 	tmpl.id.proto	= proto;
1146 	tmpl.family	= AF_INET;
1147 	memcpy(&tmpl.saddr, &src, sizeof(src));
1148 	tmpl.mode	= XFRM_MODE_TUNNEL;
1149 	tmpl.aalgos = (~(uint32_t)0);
1150 	tmpl.ealgos = (~(uint32_t)0);
1151 	tmpl.calgos = (~(uint32_t)0);
1152 
1153 	if (rtattr_pack(&req.nh, sizeof(req), XFRMA_TMPL, &tmpl, sizeof(tmpl)))
1154 		return -1;
1155 
1156 	if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
1157 		pr_err("send()");
1158 		return -1;
1159 	}
1160 
1161 	return netlink_check_answer(xfrm_sock);
1162 }
1163 
1164 static int xfrm_prepare(int xfrm_sock, uint32_t *seq,
1165 		struct in_addr src, struct in_addr dst,
1166 		struct in_addr tunsrc, struct in_addr tundst, uint8_t proto)
1167 {
1168 	if (xfrm_policy_add(xfrm_sock, (*seq)++, gen_spi(src), src, dst,
1169 				XFRM_POLICY_OUT, tunsrc, tundst, proto)) {
1170 		printk("Failed to add xfrm policy");
1171 		return -1;
1172 	}
1173 
1174 	if (xfrm_policy_add(xfrm_sock, (*seq)++, gen_spi(src), dst, src,
1175 				XFRM_POLICY_IN, tunsrc, tundst, proto)) {
1176 		printk("Failed to add xfrm policy");
1177 		return -1;
1178 	}
1179 
1180 	return 0;
1181 }
1182 
1183 static int xfrm_policy_del(int xfrm_sock, uint32_t seq,
1184 		struct in_addr src, struct in_addr dst, uint8_t dir,
1185 		struct in_addr tunsrc, struct in_addr tundst)
1186 {
1187 	struct {
1188 		struct nlmsghdr			nh;
1189 		struct xfrm_userpolicy_id	id;
1190 		char				attrbuf[MAX_PAYLOAD];
1191 	} req;
1192 
1193 	memset(&req, 0, sizeof(req));
1194 	req.nh.nlmsg_len	= NLMSG_LENGTH(sizeof(req.id));
1195 	req.nh.nlmsg_type	= XFRM_MSG_DELPOLICY;
1196 	req.nh.nlmsg_flags	= NLM_F_REQUEST | NLM_F_ACK;
1197 	req.nh.nlmsg_seq	= seq;
1198 
1199 	/* Fill id */
1200 	memcpy(&req.id.sel.daddr, &dst, sizeof(tundst));
1201 	memcpy(&req.id.sel.saddr, &src, sizeof(tunsrc));
1202 	req.id.sel.family		= AF_INET;
1203 	req.id.sel.prefixlen_d		= PREFIX_LEN;
1204 	req.id.sel.prefixlen_s		= PREFIX_LEN;
1205 	req.id.dir = dir;
1206 
1207 	if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
1208 		pr_err("send()");
1209 		return -1;
1210 	}
1211 
1212 	return netlink_check_answer(xfrm_sock);
1213 }
1214 
1215 static int xfrm_cleanup(int xfrm_sock, uint32_t *seq,
1216 		struct in_addr src, struct in_addr dst,
1217 		struct in_addr tunsrc, struct in_addr tundst)
1218 {
1219 	if (xfrm_policy_del(xfrm_sock, (*seq)++, src, dst,
1220 				XFRM_POLICY_OUT, tunsrc, tundst)) {
1221 		printk("Failed to add xfrm policy");
1222 		return -1;
1223 	}
1224 
1225 	if (xfrm_policy_del(xfrm_sock, (*seq)++, dst, src,
1226 				XFRM_POLICY_IN, tunsrc, tundst)) {
1227 		printk("Failed to add xfrm policy");
1228 		return -1;
1229 	}
1230 
1231 	return 0;
1232 }
1233 
1234 static int xfrm_state_del(int xfrm_sock, uint32_t seq, uint32_t spi,
1235 		struct in_addr src, struct in_addr dst, uint8_t proto)
1236 {
1237 	struct {
1238 		struct nlmsghdr		nh;
1239 		struct xfrm_usersa_id	id;
1240 		char			attrbuf[MAX_PAYLOAD];
1241 	} req;
1242 	xfrm_address_t saddr = {};
1243 
1244 	memset(&req, 0, sizeof(req));
1245 	req.nh.nlmsg_len	= NLMSG_LENGTH(sizeof(req.id));
1246 	req.nh.nlmsg_type	= XFRM_MSG_DELSA;
1247 	req.nh.nlmsg_flags	= NLM_F_REQUEST | NLM_F_ACK;
1248 	req.nh.nlmsg_seq	= seq;
1249 
1250 	memcpy(&req.id.daddr, &dst, sizeof(dst));
1251 	req.id.family		= AF_INET;
1252 	req.id.proto		= proto;
1253 	/* Note: zero-spi cannot be deleted */
1254 	req.id.spi = spi;
1255 
1256 	memcpy(&saddr, &src, sizeof(src));
1257 	if (rtattr_pack(&req.nh, sizeof(req), XFRMA_SRCADDR, &saddr, sizeof(saddr)))
1258 		return -1;
1259 
1260 	if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
1261 		pr_err("send()");
1262 		return -1;
1263 	}
1264 
1265 	return netlink_check_answer(xfrm_sock);
1266 }
1267 
1268 static int xfrm_delete(int xfrm_sock, uint32_t *seq,
1269 		struct in_addr src, struct in_addr dst,
1270 		struct in_addr tunsrc, struct in_addr tundst, uint8_t proto)
1271 {
1272 	if (xfrm_state_del(xfrm_sock, (*seq)++, gen_spi(src), src, dst, proto)) {
1273 		printk("Failed to remove xfrm state");
1274 		return -1;
1275 	}
1276 
1277 	if (xfrm_state_del(xfrm_sock, (*seq)++, gen_spi(src), dst, src, proto)) {
1278 		printk("Failed to remove xfrm state");
1279 		return -1;
1280 	}
1281 
1282 	return 0;
1283 }
1284 
1285 static int xfrm_state_allocspi(int xfrm_sock, uint32_t *seq,
1286 		uint32_t spi, uint8_t proto)
1287 {
1288 	struct {
1289 		struct nlmsghdr			nh;
1290 		struct xfrm_userspi_info	spi;
1291 	} req;
1292 	struct {
1293 		struct nlmsghdr			nh;
1294 		union {
1295 			struct xfrm_usersa_info	info;
1296 			int error;
1297 		};
1298 	} answer;
1299 
1300 	memset(&req, 0, sizeof(req));
1301 	req.nh.nlmsg_len	= NLMSG_LENGTH(sizeof(req.spi));
1302 	req.nh.nlmsg_type	= XFRM_MSG_ALLOCSPI;
1303 	req.nh.nlmsg_flags	= NLM_F_REQUEST;
1304 	req.nh.nlmsg_seq	= (*seq)++;
1305 
1306 	req.spi.info.family	= AF_INET;
1307 	req.spi.min		= spi;
1308 	req.spi.max		= spi;
1309 	req.spi.info.id.proto	= proto;
1310 
1311 	if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
1312 		pr_err("send()");
1313 		return KSFT_FAIL;
1314 	}
1315 
1316 	if (recv(xfrm_sock, &answer, sizeof(answer), 0) < 0) {
1317 		pr_err("recv()");
1318 		return KSFT_FAIL;
1319 	} else if (answer.nh.nlmsg_type == XFRM_MSG_NEWSA) {
1320 		uint32_t new_spi = htonl(answer.info.id.spi);
1321 
1322 		if (new_spi != spi) {
1323 			printk("allocated spi is different from requested: %#x != %#x",
1324 					new_spi, spi);
1325 			return KSFT_FAIL;
1326 		}
1327 		return KSFT_PASS;
1328 	} else if (answer.nh.nlmsg_type != NLMSG_ERROR) {
1329 		printk("expected NLMSG_ERROR, got %d", (int)answer.nh.nlmsg_type);
1330 		return KSFT_FAIL;
1331 	}
1332 
1333 	printk("NLMSG_ERROR: %d: %s", answer.error, strerror(-answer.error));
1334 	return (answer.error) ? KSFT_FAIL : KSFT_PASS;
1335 }
1336 
1337 static int netlink_sock_bind(int *sock, uint32_t *seq, int proto, uint32_t groups)
1338 {
1339 	struct sockaddr_nl snl = {};
1340 	socklen_t addr_len;
1341 	int ret = -1;
1342 
1343 	snl.nl_family = AF_NETLINK;
1344 	snl.nl_groups = groups;
1345 
1346 	if (netlink_sock(sock, seq, proto)) {
1347 		printk("Failed to open xfrm netlink socket");
1348 		return -1;
1349 	}
1350 
1351 	if (bind(*sock, (struct sockaddr *)&snl, sizeof(snl)) < 0) {
1352 		pr_err("bind()");
1353 		goto out_close;
1354 	}
1355 
1356 	addr_len = sizeof(snl);
1357 	if (getsockname(*sock, (struct sockaddr *)&snl, &addr_len) < 0) {
1358 		pr_err("getsockname()");
1359 		goto out_close;
1360 	}
1361 	if (addr_len != sizeof(snl)) {
1362 		printk("Wrong address length %d", addr_len);
1363 		goto out_close;
1364 	}
1365 	if (snl.nl_family != AF_NETLINK) {
1366 		printk("Wrong address family %d", snl.nl_family);
1367 		goto out_close;
1368 	}
1369 	return 0;
1370 
1371 out_close:
1372 	close(*sock);
1373 	return ret;
1374 }
1375 
1376 static int xfrm_monitor_acquire(int xfrm_sock, uint32_t *seq, unsigned int nr)
1377 {
1378 	struct {
1379 		struct nlmsghdr nh;
1380 		union {
1381 			struct xfrm_user_acquire acq;
1382 			int error;
1383 		};
1384 		char attrbuf[MAX_PAYLOAD];
1385 	} req;
1386 	struct xfrm_user_tmpl xfrm_tmpl = {};
1387 	int xfrm_listen = -1, ret = KSFT_FAIL;
1388 	uint32_t seq_listen;
1389 
1390 	if (netlink_sock_bind(&xfrm_listen, &seq_listen, NETLINK_XFRM, XFRMNLGRP_ACQUIRE))
1391 		return KSFT_FAIL;
1392 
1393 	memset(&req, 0, sizeof(req));
1394 	req.nh.nlmsg_len	= NLMSG_LENGTH(sizeof(req.acq));
1395 	req.nh.nlmsg_type	= XFRM_MSG_ACQUIRE;
1396 	req.nh.nlmsg_flags	= NLM_F_REQUEST | NLM_F_ACK;
1397 	req.nh.nlmsg_seq	= (*seq)++;
1398 
1399 	req.acq.policy.sel.family	= AF_INET;
1400 	req.acq.aalgos	= 0xfeed;
1401 	req.acq.ealgos	= 0xbaad;
1402 	req.acq.calgos	= 0xbabe;
1403 
1404 	xfrm_tmpl.family = AF_INET;
1405 	xfrm_tmpl.id.proto = IPPROTO_ESP;
1406 	if (rtattr_pack(&req.nh, sizeof(req), XFRMA_TMPL, &xfrm_tmpl, sizeof(xfrm_tmpl)))
1407 		goto out_close;
1408 
1409 	if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
1410 		pr_err("send()");
1411 		goto out_close;
1412 	}
1413 
1414 	if (recv(xfrm_sock, &req, sizeof(req), 0) < 0) {
1415 		pr_err("recv()");
1416 		goto out_close;
1417 	} else if (req.nh.nlmsg_type != NLMSG_ERROR) {
1418 		printk("expected NLMSG_ERROR, got %d", (int)req.nh.nlmsg_type);
1419 		goto out_close;
1420 	}
1421 
1422 	if (req.error) {
1423 		printk("NLMSG_ERROR: %d: %s", req.error, strerror(-req.error));
1424 		ret = req.error;
1425 		goto out_close;
1426 	}
1427 
1428 	if (recv(xfrm_listen, &req, sizeof(req), 0) < 0) {
1429 		pr_err("recv()");
1430 		goto out_close;
1431 	}
1432 
1433 	if (req.acq.aalgos != 0xfeed || req.acq.ealgos != 0xbaad
1434 			|| req.acq.calgos != 0xbabe) {
1435 		printk("xfrm_user_acquire has changed  %x %x %x",
1436 				req.acq.aalgos, req.acq.ealgos, req.acq.calgos);
1437 		goto out_close;
1438 	}
1439 
1440 	ret = KSFT_PASS;
1441 out_close:
1442 	close(xfrm_listen);
1443 	return ret;
1444 }
1445 
1446 static int xfrm_expire_state(int xfrm_sock, uint32_t *seq,
1447 		unsigned int nr, struct xfrm_desc *desc)
1448 {
1449 	struct {
1450 		struct nlmsghdr nh;
1451 		union {
1452 			struct xfrm_user_expire expire;
1453 			int error;
1454 		};
1455 	} req;
1456 	struct in_addr src, dst;
1457 	int xfrm_listen = -1, ret = KSFT_FAIL;
1458 	uint32_t seq_listen;
1459 
1460 	src = inet_makeaddr(INADDR_B, child_ip(nr));
1461 	dst = inet_makeaddr(INADDR_B, grchild_ip(nr));
1462 
1463 	if (xfrm_state_add(xfrm_sock, (*seq)++, gen_spi(src), src, dst, desc)) {
1464 		printk("Failed to add xfrm state");
1465 		return KSFT_FAIL;
1466 	}
1467 
1468 	if (netlink_sock_bind(&xfrm_listen, &seq_listen, NETLINK_XFRM, XFRMNLGRP_EXPIRE))
1469 		return KSFT_FAIL;
1470 
1471 	memset(&req, 0, sizeof(req));
1472 	req.nh.nlmsg_len	= NLMSG_LENGTH(sizeof(req.expire));
1473 	req.nh.nlmsg_type	= XFRM_MSG_EXPIRE;
1474 	req.nh.nlmsg_flags	= NLM_F_REQUEST | NLM_F_ACK;
1475 	req.nh.nlmsg_seq	= (*seq)++;
1476 
1477 	memcpy(&req.expire.state.id.daddr, &dst, sizeof(dst));
1478 	req.expire.state.id.spi		= gen_spi(src);
1479 	req.expire.state.id.proto	= desc->proto;
1480 	req.expire.state.family		= AF_INET;
1481 	req.expire.hard			= 0xff;
1482 
1483 	if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
1484 		pr_err("send()");
1485 		goto out_close;
1486 	}
1487 
1488 	if (recv(xfrm_sock, &req, sizeof(req), 0) < 0) {
1489 		pr_err("recv()");
1490 		goto out_close;
1491 	} else if (req.nh.nlmsg_type != NLMSG_ERROR) {
1492 		printk("expected NLMSG_ERROR, got %d", (int)req.nh.nlmsg_type);
1493 		goto out_close;
1494 	}
1495 
1496 	if (req.error) {
1497 		printk("NLMSG_ERROR: %d: %s", req.error, strerror(-req.error));
1498 		ret = req.error;
1499 		goto out_close;
1500 	}
1501 
1502 	if (recv(xfrm_listen, &req, sizeof(req), 0) < 0) {
1503 		pr_err("recv()");
1504 		goto out_close;
1505 	}
1506 
1507 	if (req.expire.hard != 0x1) {
1508 		printk("expire.hard is not set: %x", req.expire.hard);
1509 		goto out_close;
1510 	}
1511 
1512 	ret = KSFT_PASS;
1513 out_close:
1514 	close(xfrm_listen);
1515 	return ret;
1516 }
1517 
1518 static int xfrm_expire_policy(int xfrm_sock, uint32_t *seq,
1519 		unsigned int nr, struct xfrm_desc *desc)
1520 {
1521 	struct {
1522 		struct nlmsghdr nh;
1523 		union {
1524 			struct xfrm_user_polexpire expire;
1525 			int error;
1526 		};
1527 	} req;
1528 	struct in_addr src, dst, tunsrc, tundst;
1529 	int xfrm_listen = -1, ret = KSFT_FAIL;
1530 	uint32_t seq_listen;
1531 
1532 	src = inet_makeaddr(INADDR_B, child_ip(nr));
1533 	dst = inet_makeaddr(INADDR_B, grchild_ip(nr));
1534 	tunsrc = inet_makeaddr(INADDR_A, child_ip(nr));
1535 	tundst = inet_makeaddr(INADDR_A, grchild_ip(nr));
1536 
1537 	if (xfrm_policy_add(xfrm_sock, (*seq)++, gen_spi(src), src, dst,
1538 				XFRM_POLICY_OUT, tunsrc, tundst, desc->proto)) {
1539 		printk("Failed to add xfrm policy");
1540 		return KSFT_FAIL;
1541 	}
1542 
1543 	if (netlink_sock_bind(&xfrm_listen, &seq_listen, NETLINK_XFRM, XFRMNLGRP_EXPIRE))
1544 		return KSFT_FAIL;
1545 
1546 	memset(&req, 0, sizeof(req));
1547 	req.nh.nlmsg_len	= NLMSG_LENGTH(sizeof(req.expire));
1548 	req.nh.nlmsg_type	= XFRM_MSG_POLEXPIRE;
1549 	req.nh.nlmsg_flags	= NLM_F_REQUEST | NLM_F_ACK;
1550 	req.nh.nlmsg_seq	= (*seq)++;
1551 
1552 	/* Fill selector. */
1553 	memcpy(&req.expire.pol.sel.daddr, &dst, sizeof(tundst));
1554 	memcpy(&req.expire.pol.sel.saddr, &src, sizeof(tunsrc));
1555 	req.expire.pol.sel.family	= AF_INET;
1556 	req.expire.pol.sel.prefixlen_d	= PREFIX_LEN;
1557 	req.expire.pol.sel.prefixlen_s	= PREFIX_LEN;
1558 	req.expire.pol.dir		= XFRM_POLICY_OUT;
1559 	req.expire.hard			= 0xff;
1560 
1561 	if (send(xfrm_sock, &req, req.nh.nlmsg_len, 0) < 0) {
1562 		pr_err("send()");
1563 		goto out_close;
1564 	}
1565 
1566 	if (recv(xfrm_sock, &req, sizeof(req), 0) < 0) {
1567 		pr_err("recv()");
1568 		goto out_close;
1569 	} else if (req.nh.nlmsg_type != NLMSG_ERROR) {
1570 		printk("expected NLMSG_ERROR, got %d", (int)req.nh.nlmsg_type);
1571 		goto out_close;
1572 	}
1573 
1574 	if (req.error) {
1575 		printk("NLMSG_ERROR: %d: %s", req.error, strerror(-req.error));
1576 		ret = req.error;
1577 		goto out_close;
1578 	}
1579 
1580 	if (recv(xfrm_listen, &req, sizeof(req), 0) < 0) {
1581 		pr_err("recv()");
1582 		goto out_close;
1583 	}
1584 
1585 	if (req.expire.hard != 0x1) {
1586 		printk("expire.hard is not set: %x", req.expire.hard);
1587 		goto out_close;
1588 	}
1589 
1590 	ret = KSFT_PASS;
1591 out_close:
1592 	close(xfrm_listen);
1593 	return ret;
1594 }
1595 
1596 static int child_serv(int xfrm_sock, uint32_t *seq,
1597 		unsigned int nr, int cmd_fd, void *buf, struct xfrm_desc *desc)
1598 {
1599 	struct in_addr src, dst, tunsrc, tundst;
1600 	struct test_desc msg;
1601 	int ret = KSFT_FAIL;
1602 
1603 	src = inet_makeaddr(INADDR_B, child_ip(nr));
1604 	dst = inet_makeaddr(INADDR_B, grchild_ip(nr));
1605 	tunsrc = inet_makeaddr(INADDR_A, child_ip(nr));
1606 	tundst = inet_makeaddr(INADDR_A, grchild_ip(nr));
1607 
1608 	/* UDP pinging without xfrm */
1609 	if (do_ping(cmd_fd, buf, page_size, src, true, 0, 0, udp_ping_send)) {
1610 		printk("ping failed before setting xfrm");
1611 		return KSFT_FAIL;
1612 	}
1613 
1614 	memset(&msg, 0, sizeof(msg));
1615 	msg.type = MSG_XFRM_PREPARE;
1616 	memcpy(&msg.body.xfrm_desc, desc, sizeof(*desc));
1617 	write_msg(cmd_fd, &msg, 1);
1618 
1619 	if (xfrm_prepare(xfrm_sock, seq, src, dst, tunsrc, tundst, desc->proto)) {
1620 		printk("failed to prepare xfrm");
1621 		goto cleanup;
1622 	}
1623 
1624 	memset(&msg, 0, sizeof(msg));
1625 	msg.type = MSG_XFRM_ADD;
1626 	memcpy(&msg.body.xfrm_desc, desc, sizeof(*desc));
1627 	write_msg(cmd_fd, &msg, 1);
1628 	if (xfrm_set(xfrm_sock, seq, src, dst, tunsrc, tundst, desc)) {
1629 		printk("failed to set xfrm");
1630 		goto delete;
1631 	}
1632 
1633 	/* UDP pinging with xfrm tunnel */
1634 	if (do_ping(cmd_fd, buf, page_size, tunsrc,
1635 				true, 0, 0, udp_ping_send)) {
1636 		printk("ping failed for xfrm");
1637 		goto delete;
1638 	}
1639 
1640 	ret = KSFT_PASS;
1641 delete:
1642 	/* xfrm delete */
1643 	memset(&msg, 0, sizeof(msg));
1644 	msg.type = MSG_XFRM_DEL;
1645 	memcpy(&msg.body.xfrm_desc, desc, sizeof(*desc));
1646 	write_msg(cmd_fd, &msg, 1);
1647 
1648 	if (xfrm_delete(xfrm_sock, seq, src, dst, tunsrc, tundst, desc->proto)) {
1649 		printk("failed ping to remove xfrm");
1650 		ret = KSFT_FAIL;
1651 	}
1652 
1653 cleanup:
1654 	memset(&msg, 0, sizeof(msg));
1655 	msg.type = MSG_XFRM_CLEANUP;
1656 	memcpy(&msg.body.xfrm_desc, desc, sizeof(*desc));
1657 	write_msg(cmd_fd, &msg, 1);
1658 	if (xfrm_cleanup(xfrm_sock, seq, src, dst, tunsrc, tundst)) {
1659 		printk("failed ping to cleanup xfrm");
1660 		ret = KSFT_FAIL;
1661 	}
1662 	return ret;
1663 }
1664 
1665 static int child_f(unsigned int nr, int test_desc_fd, int cmd_fd, void *buf)
1666 {
1667 	struct xfrm_desc desc;
1668 	struct test_desc msg;
1669 	int xfrm_sock = -1;
1670 	uint32_t seq;
1671 
1672 	if (switch_ns(nsfd_childa))
1673 		exit(KSFT_FAIL);
1674 
1675 	if (netlink_sock(&xfrm_sock, &seq, NETLINK_XFRM)) {
1676 		printk("Failed to open xfrm netlink socket");
1677 		exit(KSFT_FAIL);
1678 	}
1679 
1680 	/* Check that seq sock is ready, just for sure. */
1681 	memset(&msg, 0, sizeof(msg));
1682 	msg.type = MSG_ACK;
1683 	write_msg(cmd_fd, &msg, 1);
1684 	read_msg(cmd_fd, &msg, 1);
1685 	if (msg.type != MSG_ACK) {
1686 		printk("Ack failed");
1687 		exit(KSFT_FAIL);
1688 	}
1689 
1690 	for (;;) {
1691 		ssize_t received = read(test_desc_fd, &desc, sizeof(desc));
1692 		int ret;
1693 
1694 		if (received == 0) /* EOF */
1695 			break;
1696 
1697 		if (received != sizeof(desc)) {
1698 			pr_err("read() returned %zd", received);
1699 			exit(KSFT_FAIL);
1700 		}
1701 
1702 		switch (desc.type) {
1703 		case CREATE_TUNNEL:
1704 			ret = child_serv(xfrm_sock, &seq, nr,
1705 					 cmd_fd, buf, &desc);
1706 			break;
1707 		case ALLOCATE_SPI:
1708 			ret = xfrm_state_allocspi(xfrm_sock, &seq,
1709 						  -1, desc.proto);
1710 			break;
1711 		case MONITOR_ACQUIRE:
1712 			ret = xfrm_monitor_acquire(xfrm_sock, &seq, nr);
1713 			break;
1714 		case EXPIRE_STATE:
1715 			ret = xfrm_expire_state(xfrm_sock, &seq, nr, &desc);
1716 			break;
1717 		case EXPIRE_POLICY:
1718 			ret = xfrm_expire_policy(xfrm_sock, &seq, nr, &desc);
1719 			break;
1720 		default:
1721 			printk("Unknown desc type %d", desc.type);
1722 			exit(KSFT_FAIL);
1723 		}
1724 		write_test_result(ret, &desc);
1725 	}
1726 
1727 	close(xfrm_sock);
1728 
1729 	msg.type = MSG_EXIT;
1730 	write_msg(cmd_fd, &msg, 1);
1731 	exit(KSFT_PASS);
1732 }
1733 
1734 static void grand_child_serv(unsigned int nr, int cmd_fd, void *buf,
1735 		struct test_desc *msg, int xfrm_sock, uint32_t *seq)
1736 {
1737 	struct in_addr src, dst, tunsrc, tundst;
1738 	bool tun_reply;
1739 	struct xfrm_desc *desc = &msg->body.xfrm_desc;
1740 
1741 	src = inet_makeaddr(INADDR_B, grchild_ip(nr));
1742 	dst = inet_makeaddr(INADDR_B, child_ip(nr));
1743 	tunsrc = inet_makeaddr(INADDR_A, grchild_ip(nr));
1744 	tundst = inet_makeaddr(INADDR_A, child_ip(nr));
1745 
1746 	switch (msg->type) {
1747 	case MSG_EXIT:
1748 		exit(KSFT_PASS);
1749 	case MSG_ACK:
1750 		write_msg(cmd_fd, msg, 1);
1751 		break;
1752 	case MSG_PING:
1753 		tun_reply = memcmp(&dst, &msg->body.ping.reply_ip, sizeof(in_addr_t));
1754 		/* UDP pinging without xfrm */
1755 		if (do_ping(cmd_fd, buf, page_size, tun_reply ? tunsrc : src,
1756 				false, msg->body.ping.port,
1757 				msg->body.ping.reply_ip, udp_ping_reply)) {
1758 			printk("ping failed before setting xfrm");
1759 		}
1760 		break;
1761 	case MSG_XFRM_PREPARE:
1762 		if (xfrm_prepare(xfrm_sock, seq, src, dst, tunsrc, tundst,
1763 					desc->proto)) {
1764 			xfrm_cleanup(xfrm_sock, seq, src, dst, tunsrc, tundst);
1765 			printk("failed to prepare xfrm");
1766 		}
1767 		break;
1768 	case MSG_XFRM_ADD:
1769 		if (xfrm_set(xfrm_sock, seq, src, dst, tunsrc, tundst, desc)) {
1770 			xfrm_cleanup(xfrm_sock, seq, src, dst, tunsrc, tundst);
1771 			printk("failed to set xfrm");
1772 		}
1773 		break;
1774 	case MSG_XFRM_DEL:
1775 		if (xfrm_delete(xfrm_sock, seq, src, dst, tunsrc, tundst,
1776 					desc->proto)) {
1777 			xfrm_cleanup(xfrm_sock, seq, src, dst, tunsrc, tundst);
1778 			printk("failed to remove xfrm");
1779 		}
1780 		break;
1781 	case MSG_XFRM_CLEANUP:
1782 		if (xfrm_cleanup(xfrm_sock, seq, src, dst, tunsrc, tundst)) {
1783 			printk("failed to cleanup xfrm");
1784 		}
1785 		break;
1786 	default:
1787 		printk("got unknown msg type %d", msg->type);
1788 	};
1789 }
1790 
1791 static int grand_child_f(unsigned int nr, int cmd_fd, void *buf)
1792 {
1793 	struct test_desc msg;
1794 	int xfrm_sock = -1;
1795 	uint32_t seq;
1796 
1797 	if (switch_ns(nsfd_childb))
1798 		exit(KSFT_FAIL);
1799 
1800 	if (netlink_sock(&xfrm_sock, &seq, NETLINK_XFRM)) {
1801 		printk("Failed to open xfrm netlink socket");
1802 		exit(KSFT_FAIL);
1803 	}
1804 
1805 	do {
1806 		read_msg(cmd_fd, &msg, 1);
1807 		grand_child_serv(nr, cmd_fd, buf, &msg, xfrm_sock, &seq);
1808 	} while (1);
1809 
1810 	close(xfrm_sock);
1811 	exit(KSFT_FAIL);
1812 }
1813 
1814 static int start_child(unsigned int nr, char *veth, int test_desc_fd[2])
1815 {
1816 	int cmd_sock[2];
1817 	void *data_map;
1818 	pid_t child;
1819 
1820 	if (init_child(nsfd_childa, veth, child_ip(nr), grchild_ip(nr)))
1821 		return -1;
1822 
1823 	if (init_child(nsfd_childb, veth, grchild_ip(nr), child_ip(nr)))
1824 		return -1;
1825 
1826 	child = fork();
1827 	if (child < 0) {
1828 		pr_err("fork()");
1829 		return -1;
1830 	} else if (child) {
1831 		/* in parent - selftest */
1832 		return switch_ns(nsfd_parent);
1833 	}
1834 
1835 	if (close(test_desc_fd[1])) {
1836 		pr_err("close()");
1837 		return -1;
1838 	}
1839 
1840 	/* child */
1841 	data_map = mmap(0, page_size, PROT_READ | PROT_WRITE,
1842 			MAP_SHARED | MAP_ANONYMOUS, -1, 0);
1843 	if (data_map == MAP_FAILED) {
1844 		pr_err("mmap()");
1845 		return -1;
1846 	}
1847 
1848 	randomize_buffer(data_map, page_size);
1849 
1850 	if (socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, cmd_sock)) {
1851 		pr_err("socketpair()");
1852 		return -1;
1853 	}
1854 
1855 	child = fork();
1856 	if (child < 0) {
1857 		pr_err("fork()");
1858 		return -1;
1859 	} else if (child) {
1860 		if (close(cmd_sock[0])) {
1861 			pr_err("close()");
1862 			return -1;
1863 		}
1864 		return child_f(nr, test_desc_fd[0], cmd_sock[1], data_map);
1865 	}
1866 	if (close(cmd_sock[1])) {
1867 		pr_err("close()");
1868 		return -1;
1869 	}
1870 	return grand_child_f(nr, cmd_sock[0], data_map);
1871 }
1872 
1873 static void exit_usage(char **argv)
1874 {
1875 	printk("Usage: %s [nr_process]", argv[0]);
1876 	exit(KSFT_FAIL);
1877 }
1878 
1879 static int __write_desc(int test_desc_fd, struct xfrm_desc *desc)
1880 {
1881 	ssize_t ret;
1882 
1883 	ret = write(test_desc_fd, desc, sizeof(*desc));
1884 
1885 	if (ret == sizeof(*desc))
1886 		return 0;
1887 
1888 	pr_err("Writing test's desc failed %ld", ret);
1889 
1890 	return -1;
1891 }
1892 
1893 static int write_desc(int proto, int test_desc_fd,
1894 		char *a, char *e, char *c, char *ae)
1895 {
1896 	struct xfrm_desc desc = {};
1897 
1898 	desc.type = CREATE_TUNNEL;
1899 	desc.proto = proto;
1900 
1901 	if (a)
1902 		strncpy(desc.a_algo, a, ALGO_LEN - 1);
1903 	if (e)
1904 		strncpy(desc.e_algo, e, ALGO_LEN - 1);
1905 	if (c)
1906 		strncpy(desc.c_algo, c, ALGO_LEN - 1);
1907 	if (ae)
1908 		strncpy(desc.ae_algo, ae, ALGO_LEN - 1);
1909 
1910 	return __write_desc(test_desc_fd, &desc);
1911 }
1912 
1913 int proto_list[] = { IPPROTO_AH, IPPROTO_COMP, IPPROTO_ESP };
1914 char *ah_list[] = {
1915 	"digest_null", "hmac(md5)", "hmac(sha1)", "hmac(sha256)",
1916 	"hmac(sha384)", "hmac(sha512)", "hmac(rmd160)",
1917 	"xcbc(aes)", "cmac(aes)"
1918 };
1919 char *comp_list[] = {
1920 	"deflate",
1921 #if 0
1922 	/* No compression backend realization */
1923 	"lzs", "lzjh"
1924 #endif
1925 };
1926 char *e_list[] = {
1927 	"ecb(cipher_null)", "cbc(des)", "cbc(des3_ede)", "cbc(cast5)",
1928 	"cbc(blowfish)", "cbc(aes)", "cbc(serpent)", "cbc(camellia)",
1929 	"cbc(twofish)", "rfc3686(ctr(aes))"
1930 };
1931 char *ae_list[] = {
1932 #if 0
1933 	/* not implemented */
1934 	"rfc4106(gcm(aes))", "rfc4309(ccm(aes))", "rfc4543(gcm(aes))",
1935 	"rfc7539esp(chacha20,poly1305)"
1936 #endif
1937 };
1938 
1939 const unsigned int proto_plan = ARRAY_SIZE(ah_list) + ARRAY_SIZE(comp_list) \
1940 				+ (ARRAY_SIZE(ah_list) * ARRAY_SIZE(e_list)) \
1941 				+ ARRAY_SIZE(ae_list);
1942 
1943 static int write_proto_plan(int fd, int proto)
1944 {
1945 	unsigned int i;
1946 
1947 	switch (proto) {
1948 	case IPPROTO_AH:
1949 		for (i = 0; i < ARRAY_SIZE(ah_list); i++) {
1950 			if (write_desc(proto, fd, ah_list[i], 0, 0, 0))
1951 				return -1;
1952 		}
1953 		break;
1954 	case IPPROTO_COMP:
1955 		for (i = 0; i < ARRAY_SIZE(comp_list); i++) {
1956 			if (write_desc(proto, fd, 0, 0, comp_list[i], 0))
1957 				return -1;
1958 		}
1959 		break;
1960 	case IPPROTO_ESP:
1961 		for (i = 0; i < ARRAY_SIZE(ah_list); i++) {
1962 			int j;
1963 
1964 			for (j = 0; j < ARRAY_SIZE(e_list); j++) {
1965 				if (write_desc(proto, fd, ah_list[i],
1966 							e_list[j], 0, 0))
1967 					return -1;
1968 			}
1969 		}
1970 		for (i = 0; i < ARRAY_SIZE(ae_list); i++) {
1971 			if (write_desc(proto, fd, 0, 0, 0, ae_list[i]))
1972 				return -1;
1973 		}
1974 		break;
1975 	default:
1976 		printk("BUG: Specified unknown proto %d", proto);
1977 		return -1;
1978 	}
1979 
1980 	return 0;
1981 }
1982 
1983 /*
1984  * Some structures in xfrm uapi header differ in size between
1985  * 64-bit and 32-bit ABI:
1986  *
1987  *             32-bit UABI               |            64-bit UABI
1988  *  -------------------------------------|-------------------------------------
1989  *   sizeof(xfrm_usersa_info)     = 220  |  sizeof(xfrm_usersa_info)     = 224
1990  *   sizeof(xfrm_userpolicy_info) = 164  |  sizeof(xfrm_userpolicy_info) = 168
1991  *   sizeof(xfrm_userspi_info)    = 228  |  sizeof(xfrm_userspi_info)    = 232
1992  *   sizeof(xfrm_user_acquire)    = 276  |  sizeof(xfrm_user_acquire)    = 280
1993  *   sizeof(xfrm_user_expire)     = 224  |  sizeof(xfrm_user_expire)     = 232
1994  *   sizeof(xfrm_user_polexpire)  = 168  |  sizeof(xfrm_user_polexpire)  = 176
1995  *
1996  * Check the affected by the UABI difference structures.
1997  */
1998 const unsigned int compat_plan = 4;
1999 static int write_compat_struct_tests(int test_desc_fd)
2000 {
2001 	struct xfrm_desc desc = {};
2002 
2003 	desc.type = ALLOCATE_SPI;
2004 	desc.proto = IPPROTO_AH;
2005 	strncpy(desc.a_algo, ah_list[0], ALGO_LEN - 1);
2006 
2007 	if (__write_desc(test_desc_fd, &desc))
2008 		return -1;
2009 
2010 	desc.type = MONITOR_ACQUIRE;
2011 	if (__write_desc(test_desc_fd, &desc))
2012 		return -1;
2013 
2014 	desc.type = EXPIRE_STATE;
2015 	if (__write_desc(test_desc_fd, &desc))
2016 		return -1;
2017 
2018 	desc.type = EXPIRE_POLICY;
2019 	if (__write_desc(test_desc_fd, &desc))
2020 		return -1;
2021 
2022 	return 0;
2023 }
2024 
2025 static int write_test_plan(int test_desc_fd)
2026 {
2027 	unsigned int i;
2028 	pid_t child;
2029 
2030 	child = fork();
2031 	if (child < 0) {
2032 		pr_err("fork()");
2033 		return -1;
2034 	}
2035 	if (child) {
2036 		if (close(test_desc_fd))
2037 			printk("close(): %m");
2038 		return 0;
2039 	}
2040 
2041 	if (write_compat_struct_tests(test_desc_fd))
2042 		exit(KSFT_FAIL);
2043 
2044 	for (i = 0; i < ARRAY_SIZE(proto_list); i++) {
2045 		if (write_proto_plan(test_desc_fd, proto_list[i]))
2046 			exit(KSFT_FAIL);
2047 	}
2048 
2049 	exit(KSFT_PASS);
2050 }
2051 
2052 static int children_cleanup(void)
2053 {
2054 	unsigned ret = KSFT_PASS;
2055 
2056 	while (1) {
2057 		int status;
2058 		pid_t p = wait(&status);
2059 
2060 		if ((p < 0) && errno == ECHILD)
2061 			break;
2062 
2063 		if (p < 0) {
2064 			pr_err("wait()");
2065 			return KSFT_FAIL;
2066 		}
2067 
2068 		if (!WIFEXITED(status)) {
2069 			ret = KSFT_FAIL;
2070 			continue;
2071 		}
2072 
2073 		if (WEXITSTATUS(status) == KSFT_FAIL)
2074 			ret = KSFT_FAIL;
2075 	}
2076 
2077 	return ret;
2078 }
2079 
2080 typedef void (*print_res)(const char *, ...);
2081 
2082 static int check_results(void)
2083 {
2084 	struct test_result tr = {};
2085 	struct xfrm_desc *d = &tr.desc;
2086 	int ret = KSFT_PASS;
2087 
2088 	while (1) {
2089 		ssize_t received = read(results_fd[0], &tr, sizeof(tr));
2090 		print_res result;
2091 
2092 		if (received == 0) /* EOF */
2093 			break;
2094 
2095 		if (received != sizeof(tr)) {
2096 			pr_err("read() returned %zd", received);
2097 			return KSFT_FAIL;
2098 		}
2099 
2100 		switch (tr.res) {
2101 		case KSFT_PASS:
2102 			result = ksft_test_result_pass;
2103 			break;
2104 		case KSFT_FAIL:
2105 		default:
2106 			result = ksft_test_result_fail;
2107 			ret = KSFT_FAIL;
2108 		}
2109 
2110 		result(" %s: [%u, '%s', '%s', '%s', '%s', %u]\n",
2111 		       desc_name[d->type], (unsigned int)d->proto, d->a_algo,
2112 		       d->e_algo, d->c_algo, d->ae_algo, d->icv_len);
2113 	}
2114 
2115 	return ret;
2116 }
2117 
2118 int main(int argc, char **argv)
2119 {
2120 	unsigned int nr_process = 1;
2121 	int route_sock = -1, ret = KSFT_SKIP;
2122 	int test_desc_fd[2];
2123 	uint32_t route_seq;
2124 	unsigned int i;
2125 
2126 	if (argc > 2)
2127 		exit_usage(argv);
2128 
2129 	if (argc > 1) {
2130 		char *endptr;
2131 
2132 		errno = 0;
2133 		nr_process = strtol(argv[1], &endptr, 10);
2134 		if ((errno == ERANGE && (nr_process == LONG_MAX || nr_process == LONG_MIN))
2135 				|| (errno != 0 && nr_process == 0)
2136 				|| (endptr == argv[1]) || (*endptr != '\0')) {
2137 			printk("Failed to parse [nr_process]");
2138 			exit_usage(argv);
2139 		}
2140 
2141 		if (nr_process > MAX_PROCESSES || !nr_process) {
2142 			printk("nr_process should be between [1; %u]",
2143 					MAX_PROCESSES);
2144 			exit_usage(argv);
2145 		}
2146 	}
2147 
2148 	srand(time(NULL));
2149 	page_size = sysconf(_SC_PAGESIZE);
2150 	if (page_size < 1)
2151 		ksft_exit_skip("sysconf(): %m\n");
2152 
2153 	if (pipe2(test_desc_fd, O_DIRECT) < 0)
2154 		ksft_exit_skip("pipe(): %m\n");
2155 
2156 	if (pipe2(results_fd, O_DIRECT) < 0)
2157 		ksft_exit_skip("pipe(): %m\n");
2158 
2159 	if (init_namespaces())
2160 		ksft_exit_skip("Failed to create namespaces\n");
2161 
2162 	if (netlink_sock(&route_sock, &route_seq, NETLINK_ROUTE))
2163 		ksft_exit_skip("Failed to open netlink route socket\n");
2164 
2165 	for (i = 0; i < nr_process; i++) {
2166 		char veth[VETH_LEN];
2167 
2168 		snprintf(veth, VETH_LEN, VETH_FMT, i);
2169 
2170 		if (veth_add(route_sock, route_seq++, veth, nsfd_childa, veth, nsfd_childb)) {
2171 			close(route_sock);
2172 			ksft_exit_fail_msg("Failed to create veth device");
2173 		}
2174 
2175 		if (start_child(i, veth, test_desc_fd)) {
2176 			close(route_sock);
2177 			ksft_exit_fail_msg("Child %u failed to start", i);
2178 		}
2179 	}
2180 
2181 	if (close(route_sock) || close(test_desc_fd[0]) || close(results_fd[1]))
2182 		ksft_exit_fail_msg("close(): %m");
2183 
2184 	ksft_set_plan(proto_plan + compat_plan);
2185 
2186 	if (write_test_plan(test_desc_fd[1]))
2187 		ksft_exit_fail_msg("Failed to write test plan to pipe");
2188 
2189 	ret = check_results();
2190 
2191 	if (children_cleanup() == KSFT_FAIL)
2192 		exit(KSFT_FAIL);
2193 
2194 	exit(ret);
2195 }
2196