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; 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