xref: /openbmc/linux/net/rxrpc/rxperf.c (revision 3f58ff6b)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* In-kernel rxperf server for testing purposes.
3  *
4  * Copyright (C) 2022 Red Hat, Inc. All Rights Reserved.
5  * Written by David Howells (dhowells@redhat.com)
6  */
7 
8 #define pr_fmt(fmt) "rxperf: " fmt
9 #include <linux/module.h>
10 #include <linux/slab.h>
11 #include <net/sock.h>
12 #include <net/af_rxrpc.h>
13 
14 MODULE_DESCRIPTION("rxperf test server (afs)");
15 MODULE_AUTHOR("Red Hat, Inc.");
16 MODULE_LICENSE("GPL");
17 
18 #define RXPERF_PORT		7009
19 #define RX_PERF_SERVICE		147
20 #define RX_PERF_VERSION		3
21 #define RX_PERF_SEND		0
22 #define RX_PERF_RECV		1
23 #define RX_PERF_RPC		3
24 #define RX_PERF_FILE		4
25 #define RX_PERF_MAGIC_COOKIE	0x4711
26 
27 struct rxperf_proto_params {
28 	__be32		version;
29 	__be32		type;
30 	__be32		rsize;
31 	__be32		wsize;
32 } __packed;
33 
34 static const u8 rxperf_magic_cookie[] = { 0x00, 0x00, 0x47, 0x11 };
35 static const u8 secret[8] = { 0xa7, 0x83, 0x8a, 0xcb, 0xc7, 0x83, 0xec, 0x94 };
36 
37 enum rxperf_call_state {
38 	RXPERF_CALL_SV_AWAIT_PARAMS,	/* Server: Awaiting parameter block */
39 	RXPERF_CALL_SV_AWAIT_REQUEST,	/* Server: Awaiting request data */
40 	RXPERF_CALL_SV_REPLYING,	/* Server: Replying */
41 	RXPERF_CALL_SV_AWAIT_ACK,	/* Server: Awaiting final ACK */
42 	RXPERF_CALL_COMPLETE,		/* Completed or failed */
43 };
44 
45 struct rxperf_call {
46 	struct rxrpc_call	*rxcall;
47 	struct iov_iter		iter;
48 	struct kvec		kvec[1];
49 	struct work_struct	work;
50 	const char		*type;
51 	size_t			iov_len;
52 	size_t			req_len;	/* Size of request blob */
53 	size_t			reply_len;	/* Size of reply blob */
54 	unsigned int		debug_id;
55 	unsigned int		operation_id;
56 	struct rxperf_proto_params params;
57 	__be32			tmp[2];
58 	s32			abort_code;
59 	enum rxperf_call_state	state;
60 	short			error;
61 	unsigned short		unmarshal;
62 	u16			service_id;
63 	int (*deliver)(struct rxperf_call *call);
64 	void (*processor)(struct work_struct *work);
65 };
66 
67 static struct socket *rxperf_socket;
68 static struct key *rxperf_sec_keyring;	/* Ring of security/crypto keys */
69 static struct workqueue_struct *rxperf_workqueue;
70 
71 static void rxperf_deliver_to_call(struct work_struct *work);
72 static int rxperf_deliver_param_block(struct rxperf_call *call);
73 static int rxperf_deliver_request(struct rxperf_call *call);
74 static int rxperf_process_call(struct rxperf_call *call);
75 static void rxperf_charge_preallocation(struct work_struct *work);
76 
77 static DECLARE_WORK(rxperf_charge_preallocation_work,
78 		    rxperf_charge_preallocation);
79 
80 static inline void rxperf_set_call_state(struct rxperf_call *call,
81 					 enum rxperf_call_state to)
82 {
83 	call->state = to;
84 }
85 
86 static inline void rxperf_set_call_complete(struct rxperf_call *call,
87 					    int error, s32 remote_abort)
88 {
89 	if (call->state != RXPERF_CALL_COMPLETE) {
90 		call->abort_code = remote_abort;
91 		call->error = error;
92 		call->state = RXPERF_CALL_COMPLETE;
93 	}
94 }
95 
96 static void rxperf_rx_discard_new_call(struct rxrpc_call *rxcall,
97 				       unsigned long user_call_ID)
98 {
99 	kfree((struct rxperf_call *)user_call_ID);
100 }
101 
102 static void rxperf_rx_new_call(struct sock *sk, struct rxrpc_call *rxcall,
103 			       unsigned long user_call_ID)
104 {
105 	queue_work(rxperf_workqueue, &rxperf_charge_preallocation_work);
106 }
107 
108 static void rxperf_queue_call_work(struct rxperf_call *call)
109 {
110 	queue_work(rxperf_workqueue, &call->work);
111 }
112 
113 static void rxperf_notify_rx(struct sock *sk, struct rxrpc_call *rxcall,
114 			     unsigned long call_user_ID)
115 {
116 	struct rxperf_call *call = (struct rxperf_call *)call_user_ID;
117 
118 	if (call->state != RXPERF_CALL_COMPLETE)
119 		rxperf_queue_call_work(call);
120 }
121 
122 static void rxperf_rx_attach(struct rxrpc_call *rxcall, unsigned long user_call_ID)
123 {
124 	struct rxperf_call *call = (struct rxperf_call *)user_call_ID;
125 
126 	call->rxcall = rxcall;
127 }
128 
129 static void rxperf_notify_end_reply_tx(struct sock *sock,
130 				       struct rxrpc_call *rxcall,
131 				       unsigned long call_user_ID)
132 {
133 	rxperf_set_call_state((struct rxperf_call *)call_user_ID,
134 			      RXPERF_CALL_SV_AWAIT_ACK);
135 }
136 
137 /*
138  * Charge the incoming call preallocation.
139  */
140 static void rxperf_charge_preallocation(struct work_struct *work)
141 {
142 	struct rxperf_call *call;
143 
144 	for (;;) {
145 		call = kzalloc(sizeof(*call), GFP_KERNEL);
146 		if (!call)
147 			break;
148 
149 		call->type		= "unset";
150 		call->debug_id		= atomic_inc_return(&rxrpc_debug_id);
151 		call->deliver		= rxperf_deliver_param_block;
152 		call->state		= RXPERF_CALL_SV_AWAIT_PARAMS;
153 		call->service_id	= RX_PERF_SERVICE;
154 		call->iov_len		= sizeof(call->params);
155 		call->kvec[0].iov_len	= sizeof(call->params);
156 		call->kvec[0].iov_base	= &call->params;
157 		iov_iter_kvec(&call->iter, READ, call->kvec, 1, call->iov_len);
158 		INIT_WORK(&call->work, rxperf_deliver_to_call);
159 
160 		if (rxrpc_kernel_charge_accept(rxperf_socket,
161 					       rxperf_notify_rx,
162 					       rxperf_rx_attach,
163 					       (unsigned long)call,
164 					       GFP_KERNEL,
165 					       call->debug_id) < 0)
166 			break;
167 		call = NULL;
168 	}
169 
170 	kfree(call);
171 }
172 
173 /*
174  * Open an rxrpc socket and bind it to be a server for callback notifications
175  * - the socket is left in blocking mode and non-blocking ops use MSG_DONTWAIT
176  */
177 static int rxperf_open_socket(void)
178 {
179 	struct sockaddr_rxrpc srx;
180 	struct socket *socket;
181 	int ret;
182 
183 	ret = sock_create_kern(&init_net, AF_RXRPC, SOCK_DGRAM, PF_INET6,
184 			       &socket);
185 	if (ret < 0)
186 		goto error_1;
187 
188 	socket->sk->sk_allocation = GFP_NOFS;
189 
190 	/* bind the callback manager's address to make this a server socket */
191 	memset(&srx, 0, sizeof(srx));
192 	srx.srx_family			= AF_RXRPC;
193 	srx.srx_service			= RX_PERF_SERVICE;
194 	srx.transport_type		= SOCK_DGRAM;
195 	srx.transport_len		= sizeof(srx.transport.sin6);
196 	srx.transport.sin6.sin6_family	= AF_INET6;
197 	srx.transport.sin6.sin6_port	= htons(RXPERF_PORT);
198 
199 	ret = rxrpc_sock_set_min_security_level(socket->sk,
200 						RXRPC_SECURITY_ENCRYPT);
201 	if (ret < 0)
202 		goto error_2;
203 
204 	ret = rxrpc_sock_set_security_keyring(socket->sk, rxperf_sec_keyring);
205 
206 	ret = kernel_bind(socket, (struct sockaddr *)&srx, sizeof(srx));
207 	if (ret < 0)
208 		goto error_2;
209 
210 	rxrpc_kernel_new_call_notification(socket, rxperf_rx_new_call,
211 					   rxperf_rx_discard_new_call);
212 
213 	ret = kernel_listen(socket, INT_MAX);
214 	if (ret < 0)
215 		goto error_2;
216 
217 	rxperf_socket = socket;
218 	rxperf_charge_preallocation(&rxperf_charge_preallocation_work);
219 	return 0;
220 
221 error_2:
222 	sock_release(socket);
223 error_1:
224 	pr_err("Can't set up rxperf socket: %d\n", ret);
225 	return ret;
226 }
227 
228 /*
229  * close the rxrpc socket rxperf was using
230  */
231 static void rxperf_close_socket(void)
232 {
233 	kernel_listen(rxperf_socket, 0);
234 	kernel_sock_shutdown(rxperf_socket, SHUT_RDWR);
235 	flush_workqueue(rxperf_workqueue);
236 	sock_release(rxperf_socket);
237 }
238 
239 /*
240  * Log remote abort codes that indicate that we have a protocol disagreement
241  * with the server.
242  */
243 static void rxperf_log_error(struct rxperf_call *call, s32 remote_abort)
244 {
245 	static int max = 0;
246 	const char *msg;
247 	int m;
248 
249 	switch (remote_abort) {
250 	case RX_EOF:		 msg = "unexpected EOF";	break;
251 	case RXGEN_CC_MARSHAL:	 msg = "client marshalling";	break;
252 	case RXGEN_CC_UNMARSHAL: msg = "client unmarshalling";	break;
253 	case RXGEN_SS_MARSHAL:	 msg = "server marshalling";	break;
254 	case RXGEN_SS_UNMARSHAL: msg = "server unmarshalling";	break;
255 	case RXGEN_DECODE:	 msg = "opcode decode";		break;
256 	case RXGEN_SS_XDRFREE:	 msg = "server XDR cleanup";	break;
257 	case RXGEN_CC_XDRFREE:	 msg = "client XDR cleanup";	break;
258 	case -32:		 msg = "insufficient data";	break;
259 	default:
260 		return;
261 	}
262 
263 	m = max;
264 	if (m < 3) {
265 		max = m + 1;
266 		pr_info("Peer reported %s failure on %s\n", msg, call->type);
267 	}
268 }
269 
270 /*
271  * deliver messages to a call
272  */
273 static void rxperf_deliver_to_call(struct work_struct *work)
274 {
275 	struct rxperf_call *call = container_of(work, struct rxperf_call, work);
276 	enum rxperf_call_state state;
277 	u32 abort_code, remote_abort = 0;
278 	int ret = 0;
279 
280 	if (call->state == RXPERF_CALL_COMPLETE)
281 		return;
282 
283 	while (state = call->state,
284 	       state == RXPERF_CALL_SV_AWAIT_PARAMS ||
285 	       state == RXPERF_CALL_SV_AWAIT_REQUEST ||
286 	       state == RXPERF_CALL_SV_AWAIT_ACK
287 	       ) {
288 		if (state == RXPERF_CALL_SV_AWAIT_ACK) {
289 			if (!rxrpc_kernel_check_life(rxperf_socket, call->rxcall))
290 				goto call_complete;
291 			return;
292 		}
293 
294 		ret = call->deliver(call);
295 		if (ret == 0)
296 			ret = rxperf_process_call(call);
297 
298 		switch (ret) {
299 		case 0:
300 			continue;
301 		case -EINPROGRESS:
302 		case -EAGAIN:
303 			return;
304 		case -ECONNABORTED:
305 			rxperf_log_error(call, call->abort_code);
306 			goto call_complete;
307 		case -EOPNOTSUPP:
308 			abort_code = RXGEN_OPCODE;
309 			rxrpc_kernel_abort_call(rxperf_socket, call->rxcall,
310 						abort_code, ret, "GOP");
311 			goto call_complete;
312 		case -ENOTSUPP:
313 			abort_code = RX_USER_ABORT;
314 			rxrpc_kernel_abort_call(rxperf_socket, call->rxcall,
315 						abort_code, ret, "GUA");
316 			goto call_complete;
317 		case -EIO:
318 			pr_err("Call %u in bad state %u\n",
319 			       call->debug_id, call->state);
320 			fallthrough;
321 		case -ENODATA:
322 		case -EBADMSG:
323 		case -EMSGSIZE:
324 		case -ENOMEM:
325 		case -EFAULT:
326 			rxrpc_kernel_abort_call(rxperf_socket, call->rxcall,
327 						RXGEN_SS_UNMARSHAL, ret, "GUM");
328 			goto call_complete;
329 		default:
330 			rxrpc_kernel_abort_call(rxperf_socket, call->rxcall,
331 						RX_CALL_DEAD, ret, "GER");
332 			goto call_complete;
333 		}
334 	}
335 
336 call_complete:
337 	rxperf_set_call_complete(call, ret, remote_abort);
338 	/* The call may have been requeued */
339 	rxrpc_kernel_end_call(rxperf_socket, call->rxcall);
340 	cancel_work(&call->work);
341 	kfree(call);
342 }
343 
344 /*
345  * Extract a piece of data from the received data socket buffers.
346  */
347 static int rxperf_extract_data(struct rxperf_call *call, bool want_more)
348 {
349 	u32 remote_abort = 0;
350 	int ret;
351 
352 	ret = rxrpc_kernel_recv_data(rxperf_socket, call->rxcall, &call->iter,
353 				     &call->iov_len, want_more, &remote_abort,
354 				     &call->service_id);
355 	pr_debug("Extract i=%zu l=%zu m=%u ret=%d\n",
356 		 iov_iter_count(&call->iter), call->iov_len, want_more, ret);
357 	if (ret == 0 || ret == -EAGAIN)
358 		return ret;
359 
360 	if (ret == 1) {
361 		switch (call->state) {
362 		case RXPERF_CALL_SV_AWAIT_REQUEST:
363 			rxperf_set_call_state(call, RXPERF_CALL_SV_REPLYING);
364 			break;
365 		case RXPERF_CALL_COMPLETE:
366 			pr_debug("premature completion %d", call->error);
367 			return call->error;
368 		default:
369 			break;
370 		}
371 		return 0;
372 	}
373 
374 	rxperf_set_call_complete(call, ret, remote_abort);
375 	return ret;
376 }
377 
378 /*
379  * Grab the operation ID from an incoming manager call.
380  */
381 static int rxperf_deliver_param_block(struct rxperf_call *call)
382 {
383 	u32 version;
384 	int ret;
385 
386 	/* Extract the parameter block */
387 	ret = rxperf_extract_data(call, true);
388 	if (ret < 0)
389 		return ret;
390 
391 	version			= ntohl(call->params.version);
392 	call->operation_id	= ntohl(call->params.type);
393 	call->deliver		= rxperf_deliver_request;
394 
395 	if (version != RX_PERF_VERSION) {
396 		pr_info("Version mismatch %x\n", version);
397 		return -ENOTSUPP;
398 	}
399 
400 	switch (call->operation_id) {
401 	case RX_PERF_SEND:
402 		call->type = "send";
403 		call->reply_len = 0;
404 		call->iov_len = 4;	/* Expect req size */
405 		break;
406 	case RX_PERF_RECV:
407 		call->type = "recv";
408 		call->req_len = 0;
409 		call->iov_len = 4;	/* Expect reply size */
410 		break;
411 	case RX_PERF_RPC:
412 		call->type = "rpc";
413 		call->iov_len = 8;	/* Expect req size and reply size */
414 		break;
415 	case RX_PERF_FILE:
416 		call->type = "file";
417 		fallthrough;
418 	default:
419 		return -EOPNOTSUPP;
420 	}
421 
422 	rxperf_set_call_state(call, RXPERF_CALL_SV_AWAIT_REQUEST);
423 	return call->deliver(call);
424 }
425 
426 /*
427  * Deliver the request data.
428  */
429 static int rxperf_deliver_request(struct rxperf_call *call)
430 {
431 	int ret;
432 
433 	switch (call->unmarshal) {
434 	case 0:
435 		call->kvec[0].iov_len	= call->iov_len;
436 		call->kvec[0].iov_base	= call->tmp;
437 		iov_iter_kvec(&call->iter, READ, call->kvec, 1, call->iov_len);
438 		call->unmarshal++;
439 		fallthrough;
440 	case 1:
441 		ret = rxperf_extract_data(call, true);
442 		if (ret < 0)
443 			return ret;
444 
445 		switch (call->operation_id) {
446 		case RX_PERF_SEND:
447 			call->type = "send";
448 			call->req_len	= ntohl(call->tmp[0]);
449 			call->reply_len	= 0;
450 			break;
451 		case RX_PERF_RECV:
452 			call->type = "recv";
453 			call->req_len = 0;
454 			call->reply_len	= ntohl(call->tmp[0]);
455 			break;
456 		case RX_PERF_RPC:
457 			call->type = "rpc";
458 			call->req_len	= ntohl(call->tmp[0]);
459 			call->reply_len	= ntohl(call->tmp[1]);
460 			break;
461 		default:
462 			pr_info("Can't parse extra params\n");
463 			return -EIO;
464 		}
465 
466 		pr_debug("CALL op=%s rq=%zx rp=%zx\n",
467 			 call->type, call->req_len, call->reply_len);
468 
469 		call->iov_len = call->req_len;
470 		iov_iter_discard(&call->iter, READ, call->req_len);
471 		call->unmarshal++;
472 		fallthrough;
473 	case 2:
474 		ret = rxperf_extract_data(call, false);
475 		if (ret < 0)
476 			return ret;
477 		call->unmarshal++;
478 		fallthrough;
479 	default:
480 		return 0;
481 	}
482 }
483 
484 /*
485  * Process a call for which we've received the request.
486  */
487 static int rxperf_process_call(struct rxperf_call *call)
488 {
489 	struct msghdr msg = {};
490 	struct bio_vec bv[1];
491 	struct kvec iov[1];
492 	ssize_t n;
493 	size_t reply_len = call->reply_len, len;
494 
495 	rxrpc_kernel_set_tx_length(rxperf_socket, call->rxcall,
496 				   reply_len + sizeof(rxperf_magic_cookie));
497 
498 	while (reply_len > 0) {
499 		len = min_t(size_t, reply_len, PAGE_SIZE);
500 		bv[0].bv_page	= ZERO_PAGE(0);
501 		bv[0].bv_offset	= 0;
502 		bv[0].bv_len	= len;
503 		iov_iter_bvec(&msg.msg_iter, WRITE, bv, 1, len);
504 		msg.msg_flags = MSG_MORE;
505 		n = rxrpc_kernel_send_data(rxperf_socket, call->rxcall, &msg,
506 					   len, rxperf_notify_end_reply_tx);
507 		if (n < 0)
508 			return n;
509 		if (n == 0)
510 			return -EIO;
511 		reply_len -= n;
512 	}
513 
514 	len = sizeof(rxperf_magic_cookie);
515 	iov[0].iov_base	= (void *)rxperf_magic_cookie;
516 	iov[0].iov_len	= len;
517 	iov_iter_kvec(&msg.msg_iter, WRITE, iov, 1, len);
518 	msg.msg_flags = 0;
519 	n = rxrpc_kernel_send_data(rxperf_socket, call->rxcall, &msg, len,
520 				   rxperf_notify_end_reply_tx);
521 	if (n >= 0)
522 		return 0; /* Success */
523 
524 	if (n == -ENOMEM)
525 		rxrpc_kernel_abort_call(rxperf_socket, call->rxcall,
526 					RXGEN_SS_MARSHAL, -ENOMEM, "GOM");
527 	return n;
528 }
529 
530 /*
531  * Add a key to the security keyring.
532  */
533 static int rxperf_add_key(struct key *keyring)
534 {
535 	key_ref_t kref;
536 	int ret;
537 
538 	kref = key_create_or_update(make_key_ref(keyring, true),
539 				    "rxrpc_s",
540 				    __stringify(RX_PERF_SERVICE) ":2",
541 				    secret,
542 				    sizeof(secret),
543 				    KEY_POS_VIEW | KEY_POS_READ | KEY_POS_SEARCH
544 				    | KEY_USR_VIEW,
545 				    KEY_ALLOC_NOT_IN_QUOTA);
546 
547 	if (IS_ERR(kref)) {
548 		pr_err("Can't allocate rxperf server key: %ld\n", PTR_ERR(kref));
549 		return PTR_ERR(kref);
550 	}
551 
552 	ret = key_link(keyring, key_ref_to_ptr(kref));
553 	if (ret < 0)
554 		pr_err("Can't link rxperf server key: %d\n", ret);
555 	key_ref_put(kref);
556 	return ret;
557 }
558 
559 /*
560  * Initialise the rxperf server.
561  */
562 static int __init rxperf_init(void)
563 {
564 	struct key *keyring;
565 	int ret = -ENOMEM;
566 
567 	pr_info("Server registering\n");
568 
569 	rxperf_workqueue = alloc_workqueue("rxperf", 0, 0);
570 	if (!rxperf_workqueue)
571 		goto error_workqueue;
572 
573 	keyring = keyring_alloc("rxperf_server",
574 				GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, current_cred(),
575 				KEY_POS_VIEW | KEY_POS_READ | KEY_POS_SEARCH |
576 				KEY_POS_WRITE |
577 				KEY_USR_VIEW | KEY_USR_READ | KEY_USR_SEARCH |
578 				KEY_USR_WRITE |
579 				KEY_OTH_VIEW | KEY_OTH_READ | KEY_OTH_SEARCH,
580 				KEY_ALLOC_NOT_IN_QUOTA,
581 				NULL, NULL);
582 	if (IS_ERR(keyring)) {
583 		pr_err("Can't allocate rxperf server keyring: %ld\n",
584 		       PTR_ERR(keyring));
585 		goto error_keyring;
586 	}
587 	rxperf_sec_keyring = keyring;
588 	ret = rxperf_add_key(keyring);
589 	if (ret < 0)
590 		goto error_key;
591 
592 	ret = rxperf_open_socket();
593 	if (ret < 0)
594 		goto error_socket;
595 	return 0;
596 
597 error_socket:
598 error_key:
599 	key_put(rxperf_sec_keyring);
600 error_keyring:
601 	destroy_workqueue(rxperf_workqueue);
602 	rcu_barrier();
603 error_workqueue:
604 	pr_err("Failed to register: %d\n", ret);
605 	return ret;
606 }
607 late_initcall(rxperf_init); /* Must be called after net/ to create socket */
608 
609 static void __exit rxperf_exit(void)
610 {
611 	pr_info("Server unregistering.\n");
612 
613 	rxperf_close_socket();
614 	key_put(rxperf_sec_keyring);
615 	destroy_workqueue(rxperf_workqueue);
616 	rcu_barrier();
617 }
618 module_exit(rxperf_exit);
619 
620