Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rxrpc: Clean up connection abort

Clean up connection abort, using the connection state_lock to gate access
to change that state, and use an rxrpc_call_completion value to indicate
the difference between local and remote aborts as these can be pasted
directly into the call state.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org

+188 -213
+2
include/trace/events/rxrpc.h
··· 111 111 EM(rxrpc_conn_get_call_input, "GET inp-call") \ 112 112 EM(rxrpc_conn_get_conn_input, "GET inp-conn") \ 113 113 EM(rxrpc_conn_get_idle, "GET idle ") \ 114 + EM(rxrpc_conn_get_poke_abort, "GET pk-abort") \ 114 115 EM(rxrpc_conn_get_poke_timer, "GET poke ") \ 115 116 EM(rxrpc_conn_get_service_conn, "GET svc-conn") \ 116 117 EM(rxrpc_conn_new_client, "NEW client ") \ ··· 129 128 EM(rxrpc_conn_put_unidle, "PUT unidle ") \ 130 129 EM(rxrpc_conn_put_work, "PUT work ") \ 131 130 EM(rxrpc_conn_queue_challenge, "QUE chall ") \ 131 + EM(rxrpc_conn_queue_retry_work, "QUE retry-wk") \ 132 132 EM(rxrpc_conn_queue_rx_work, "QUE rx-work ") \ 133 133 EM(rxrpc_conn_see_new_service_conn, "SEE new-svc ") \ 134 134 EM(rxrpc_conn_see_reap_service, "SEE reap-svc") \
+27 -19
net/rxrpc/ar-internal.h
··· 263 263 264 264 /* respond to a challenge */ 265 265 int (*respond_to_challenge)(struct rxrpc_connection *, 266 - struct sk_buff *, 267 - u32 *); 266 + struct sk_buff *); 268 267 269 268 /* verify a response */ 270 269 int (*verify_response)(struct rxrpc_connection *, 271 - struct sk_buff *, 272 - u32 *); 270 + struct sk_buff *); 273 271 274 272 /* clear connection security */ 275 273 void (*clear)(struct rxrpc_connection *); ··· 366 368 }; 367 369 368 370 /* 371 + * Call completion condition (state == RXRPC_CALL_COMPLETE). 372 + */ 373 + enum rxrpc_call_completion { 374 + RXRPC_CALL_SUCCEEDED, /* - Normal termination */ 375 + RXRPC_CALL_REMOTELY_ABORTED, /* - call aborted by peer */ 376 + RXRPC_CALL_LOCALLY_ABORTED, /* - call aborted locally on error or close */ 377 + RXRPC_CALL_LOCAL_ERROR, /* - call failed due to local error */ 378 + RXRPC_CALL_NETWORK_ERROR, /* - call terminated by network error */ 379 + NR__RXRPC_CALL_COMPLETIONS 380 + }; 381 + 382 + /* 369 383 * Bits in the connection flags. 370 384 */ 371 385 enum rxrpc_conn_flag { ··· 401 391 */ 402 392 enum rxrpc_conn_event { 403 393 RXRPC_CONN_EV_CHALLENGE, /* Send challenge packet */ 394 + RXRPC_CONN_EV_ABORT_CALLS, /* Abort attached calls */ 404 395 }; 405 396 406 397 /* ··· 414 403 RXRPC_CONN_SERVICE_UNSECURED, /* Service unsecured connection */ 415 404 RXRPC_CONN_SERVICE_CHALLENGING, /* Service challenging for security */ 416 405 RXRPC_CONN_SERVICE, /* Service secured connection */ 417 - RXRPC_CONN_REMOTELY_ABORTED, /* Conn aborted by peer */ 418 - RXRPC_CONN_LOCALLY_ABORTED, /* Conn aborted locally */ 406 + RXRPC_CONN_ABORTED, /* Conn aborted */ 419 407 RXRPC_CONN__NR_STATES 420 408 }; 421 409 ··· 497 487 unsigned long idle_timestamp; /* Time at which last became idle */ 498 488 spinlock_t state_lock; /* state-change lock */ 499 489 enum rxrpc_conn_proto_state state; /* current state of connection */ 500 - u32 abort_code; /* Abort code of connection abort */ 490 + enum rxrpc_call_completion completion; /* Completion condition */ 491 + s32 abort_code; /* Abort code of connection abort */ 501 492 int debug_id; /* debug ID for printks */ 502 493 atomic_t serial; /* packet serial number counter */ 503 494 unsigned int hi_serial; /* highest serial number received */ ··· 570 559 RXRPC_CALL_SERVER_AWAIT_ACK, /* - server awaiting final ACK */ 571 560 RXRPC_CALL_COMPLETE, /* - call complete */ 572 561 NR__RXRPC_CALL_STATES 573 - }; 574 - 575 - /* 576 - * Call completion condition (state == RXRPC_CALL_COMPLETE). 577 - */ 578 - enum rxrpc_call_completion { 579 - RXRPC_CALL_SUCCEEDED, /* - Normal termination */ 580 - RXRPC_CALL_REMOTELY_ABORTED, /* - call aborted by peer */ 581 - RXRPC_CALL_LOCALLY_ABORTED, /* - call aborted locally on error or close */ 582 - RXRPC_CALL_LOCAL_ERROR, /* - call failed due to local error */ 583 - RXRPC_CALL_NETWORK_ERROR, /* - call terminated by network error */ 584 - NR__RXRPC_CALL_COMPLETIONS 585 562 }; 586 563 587 564 /* ··· 904 905 */ 905 906 void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn, struct sk_buff *skb, 906 907 unsigned int channel); 908 + int rxrpc_abort_conn(struct rxrpc_connection *conn, struct sk_buff *skb, 909 + s32 abort_code, int err, const char *why); 907 910 void rxrpc_process_connection(struct work_struct *); 908 911 void rxrpc_process_delayed_final_acks(struct rxrpc_connection *, bool); 909 912 int rxrpc_input_conn_packet(struct rxrpc_connection *conn, struct sk_buff *skb); 910 913 void rxrpc_input_conn_event(struct rxrpc_connection *conn, struct sk_buff *skb); 914 + 915 + static inline bool rxrpc_is_conn_aborted(const struct rxrpc_connection *conn) 916 + { 917 + /* Order reading the abort info after the state check. */ 918 + return smp_load_acquire(&conn->state) == RXRPC_CONN_ABORTED; 919 + } 911 920 912 921 /* 913 922 * conn_object.c ··· 1066 1059 int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb); 1067 1060 int rxrpc_send_abort_packet(struct rxrpc_call *); 1068 1061 int rxrpc_send_data_packet(struct rxrpc_call *, struct rxrpc_txbuf *); 1062 + void rxrpc_send_conn_abort(struct rxrpc_connection *conn); 1069 1063 void rxrpc_reject_packet(struct rxrpc_local *local, struct sk_buff *skb); 1070 1064 void rxrpc_send_keepalive(struct rxrpc_peer *); 1071 1065 void rxrpc_transmit_one(struct rxrpc_call *call, struct rxrpc_txbuf *txb);
+2 -6
net/rxrpc/call_object.c
··· 443 443 call->state = RXRPC_CALL_SERVER_RECV_REQUEST; 444 444 break; 445 445 446 - case RXRPC_CONN_REMOTELY_ABORTED: 447 - __rxrpc_set_call_completion(call, RXRPC_CALL_REMOTELY_ABORTED, 446 + case RXRPC_CONN_ABORTED: 447 + __rxrpc_set_call_completion(call, conn->completion, 448 448 conn->abort_code, conn->error); 449 - break; 450 - case RXRPC_CONN_LOCALLY_ABORTED: 451 - __rxrpc_abort_call("CON", call, 1, 452 - conn->abort_code, conn->error); 453 449 break; 454 450 default: 455 451 BUG();
+81 -152
net/rxrpc/conn_event.c
··· 17 17 #include "ar-internal.h" 18 18 19 19 /* 20 + * Set the completion state on an aborted connection. 21 + */ 22 + static bool rxrpc_set_conn_aborted(struct rxrpc_connection *conn, struct sk_buff *skb, 23 + s32 abort_code, int err, 24 + enum rxrpc_call_completion compl) 25 + { 26 + bool aborted = false; 27 + 28 + if (conn->state != RXRPC_CONN_ABORTED) { 29 + spin_lock(&conn->state_lock); 30 + if (conn->state != RXRPC_CONN_ABORTED) { 31 + conn->abort_code = abort_code; 32 + conn->error = err; 33 + conn->completion = compl; 34 + /* Order the abort info before the state change. */ 35 + smp_store_release(&conn->state, RXRPC_CONN_ABORTED); 36 + set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); 37 + set_bit(RXRPC_CONN_EV_ABORT_CALLS, &conn->events); 38 + aborted = true; 39 + } 40 + spin_unlock(&conn->state_lock); 41 + } 42 + 43 + return aborted; 44 + } 45 + 46 + /* 47 + * Mark a socket buffer to indicate that the connection it's on should be aborted. 48 + */ 49 + int rxrpc_abort_conn(struct rxrpc_connection *conn, struct sk_buff *skb, 50 + s32 abort_code, int err, const char *why) 51 + { 52 + struct rxrpc_skb_priv *sp = rxrpc_skb(skb); 53 + 54 + if (rxrpc_set_conn_aborted(conn, skb, abort_code, err, 55 + RXRPC_CALL_LOCALLY_ABORTED)) { 56 + trace_rxrpc_abort(0, why, sp->hdr.cid, sp->hdr.callNumber, 57 + sp->hdr.seq, abort_code, err); 58 + rxrpc_poke_conn(conn, rxrpc_conn_get_poke_abort); 59 + } 60 + return -EPROTO; 61 + } 62 + 63 + /* 64 + * Mark a connection as being remotely aborted. 65 + */ 66 + static bool rxrpc_input_conn_abort(struct rxrpc_connection *conn, 67 + struct sk_buff *skb) 68 + { 69 + return rxrpc_set_conn_aborted(conn, skb, skb->priority, -ECONNABORTED, 70 + RXRPC_CALL_REMOTELY_ABORTED); 71 + } 72 + 73 + /* 20 74 * Retransmit terminal ACK or ABORT of the previous call. 21 75 */ 22 76 void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn, ··· 200 146 /* 201 147 * pass a connection-level abort onto all calls on that connection 202 148 */ 203 - static void rxrpc_abort_calls(struct rxrpc_connection *conn, 204 - enum rxrpc_call_completion compl, 205 - rxrpc_serial_t serial) 149 + static void rxrpc_abort_calls(struct rxrpc_connection *conn) 206 150 { 207 151 struct rxrpc_call *call; 208 152 int i; ··· 213 161 call = rcu_dereference_protected( 214 162 conn->channels[i].call, 215 163 lockdep_is_held(&conn->bundle->channel_lock)); 216 - if (call) { 217 - if (compl == RXRPC_CALL_LOCALLY_ABORTED) 218 - trace_rxrpc_abort(call->debug_id, 219 - "CON", call->cid, 220 - call->call_id, 0, 164 + if (call) 165 + rxrpc_set_call_completion(call, 166 + conn->completion, 221 167 conn->abort_code, 222 168 conn->error); 223 - else 224 - trace_rxrpc_rx_abort(call, serial, 225 - conn->abort_code); 226 - rxrpc_set_call_completion(call, compl, 227 - conn->abort_code, 228 - conn->error); 229 - } 230 169 } 231 170 232 171 spin_unlock(&conn->bundle->channel_lock); 233 172 _leave(""); 234 - } 235 - 236 - /* 237 - * generate a connection-level abort 238 - */ 239 - static int rxrpc_abort_connection(struct rxrpc_connection *conn, 240 - int error, u32 abort_code) 241 - { 242 - struct rxrpc_wire_header whdr; 243 - struct msghdr msg; 244 - struct kvec iov[2]; 245 - __be32 word; 246 - size_t len; 247 - u32 serial; 248 - int ret; 249 - 250 - _enter("%d,,%u,%u", conn->debug_id, error, abort_code); 251 - 252 - /* generate a connection-level abort */ 253 - spin_lock(&conn->state_lock); 254 - if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) { 255 - spin_unlock(&conn->state_lock); 256 - _leave(" = 0 [already dead]"); 257 - return 0; 258 - } 259 - 260 - conn->error = error; 261 - conn->abort_code = abort_code; 262 - conn->state = RXRPC_CONN_LOCALLY_ABORTED; 263 - set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); 264 - spin_unlock(&conn->state_lock); 265 - 266 - msg.msg_name = &conn->peer->srx.transport; 267 - msg.msg_namelen = conn->peer->srx.transport_len; 268 - msg.msg_control = NULL; 269 - msg.msg_controllen = 0; 270 - msg.msg_flags = 0; 271 - 272 - whdr.epoch = htonl(conn->proto.epoch); 273 - whdr.cid = htonl(conn->proto.cid); 274 - whdr.callNumber = 0; 275 - whdr.seq = 0; 276 - whdr.type = RXRPC_PACKET_TYPE_ABORT; 277 - whdr.flags = conn->out_clientflag; 278 - whdr.userStatus = 0; 279 - whdr.securityIndex = conn->security_ix; 280 - whdr._rsvd = 0; 281 - whdr.serviceId = htons(conn->service_id); 282 - 283 - word = htonl(conn->abort_code); 284 - 285 - iov[0].iov_base = &whdr; 286 - iov[0].iov_len = sizeof(whdr); 287 - iov[1].iov_base = &word; 288 - iov[1].iov_len = sizeof(word); 289 - 290 - len = iov[0].iov_len + iov[1].iov_len; 291 - 292 - serial = atomic_inc_return(&conn->serial); 293 - rxrpc_abort_calls(conn, RXRPC_CALL_LOCALLY_ABORTED, serial); 294 - whdr.serial = htonl(serial); 295 - 296 - ret = kernel_sendmsg(conn->local->socket, &msg, iov, 2, len); 297 - if (ret < 0) { 298 - trace_rxrpc_tx_fail(conn->debug_id, serial, ret, 299 - rxrpc_tx_point_conn_abort); 300 - _debug("sendmsg failed: %d", ret); 301 - return -EAGAIN; 302 - } 303 - 304 - trace_rxrpc_tx_packet(conn->debug_id, &whdr, rxrpc_tx_point_conn_abort); 305 - 306 - conn->peer->last_tx_at = ktime_get_seconds(); 307 - 308 - _leave(" = 0"); 309 - return 0; 310 173 } 311 174 312 175 /* ··· 245 278 * connection-level Rx packet processor 246 279 */ 247 280 static int rxrpc_process_event(struct rxrpc_connection *conn, 248 - struct sk_buff *skb, 249 - u32 *_abort_code) 281 + struct sk_buff *skb) 250 282 { 251 283 struct rxrpc_skb_priv *sp = rxrpc_skb(skb); 252 284 int loop, ret; 253 285 254 - if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) { 255 - _leave(" = -ECONNABORTED [%u]", conn->state); 286 + if (conn->state == RXRPC_CONN_ABORTED) 256 287 return -ECONNABORTED; 257 - } 258 288 259 289 _enter("{%d},{%u,%%%u},", conn->debug_id, sp->hdr.type, sp->hdr.serial); 260 290 261 291 switch (sp->hdr.type) { 262 292 case RXRPC_PACKET_TYPE_CHALLENGE: 263 - return conn->security->respond_to_challenge(conn, skb, 264 - _abort_code); 293 + return conn->security->respond_to_challenge(conn, skb); 265 294 266 295 case RXRPC_PACKET_TYPE_RESPONSE: 267 - ret = conn->security->verify_response(conn, skb, _abort_code); 296 + ret = conn->security->verify_response(conn, skb); 268 297 if (ret < 0) 269 298 return ret; 270 299 ··· 299 336 */ 300 337 static void rxrpc_secure_connection(struct rxrpc_connection *conn) 301 338 { 302 - u32 abort_code; 303 - int ret; 304 - 305 - _enter("{%d}", conn->debug_id); 306 - 307 - ASSERT(conn->security_ix != 0); 308 - 309 - if (conn->security->issue_challenge(conn) < 0) { 310 - abort_code = RX_CALL_DEAD; 311 - ret = -ENOMEM; 312 - goto abort; 313 - } 314 - 315 - _leave(""); 316 - return; 317 - 318 - abort: 319 - _debug("abort %d, %d", ret, abort_code); 320 - rxrpc_abort_connection(conn, ret, abort_code); 321 - _leave(" [aborted]"); 339 + if (conn->security->issue_challenge(conn) < 0) 340 + rxrpc_abort_conn(conn, NULL, RX_CALL_DEAD, -ENOMEM, "OOM"); 322 341 } 323 342 324 343 /* ··· 351 406 static void rxrpc_do_process_connection(struct rxrpc_connection *conn) 352 407 { 353 408 struct sk_buff *skb; 354 - u32 abort_code = RX_PROTOCOL_ERROR; 355 409 int ret; 356 410 357 411 if (test_and_clear_bit(RXRPC_CONN_EV_CHALLENGE, &conn->events)) ··· 360 416 * connection that each one has when we've finished with it */ 361 417 while ((skb = skb_dequeue(&conn->rx_queue))) { 362 418 rxrpc_see_skb(skb, rxrpc_skb_see_conn_work); 363 - ret = rxrpc_process_event(conn, skb, &abort_code); 419 + ret = rxrpc_process_event(conn, skb); 364 420 switch (ret) { 365 - case -EPROTO: 366 - case -EKEYEXPIRED: 367 - case -EKEYREJECTED: 368 - goto protocol_error; 369 421 case -ENOMEM: 370 422 case -EAGAIN: 371 - goto requeue_and_leave; 372 - case -ECONNABORTED: 423 + skb_queue_head(&conn->rx_queue, skb); 424 + rxrpc_queue_conn(conn, rxrpc_conn_queue_retry_work); 425 + break; 373 426 default: 374 427 rxrpc_free_skb(skb, rxrpc_skb_put_conn_work); 375 428 break; 376 429 } 377 430 } 378 - 379 - return; 380 - 381 - requeue_and_leave: 382 - skb_queue_head(&conn->rx_queue, skb); 383 - return; 384 - 385 - protocol_error: 386 - if (rxrpc_abort_connection(conn, ret, abort_code) < 0) 387 - goto requeue_and_leave; 388 - rxrpc_free_skb(skb, rxrpc_skb_put_conn_work); 389 - return; 390 431 } 391 432 392 433 void rxrpc_process_connection(struct work_struct *work) ··· 409 480 { 410 481 struct rxrpc_skb_priv *sp = rxrpc_skb(skb); 411 482 412 - if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) { 413 - _leave(" = -ECONNABORTED [%u]", conn->state); 414 - return 0; 415 - } 416 - 417 - _enter("{%d},{%u,%%%u},", conn->debug_id, sp->hdr.type, sp->hdr.serial); 418 - 419 483 switch (sp->hdr.type) { 420 484 case RXRPC_PACKET_TYPE_BUSY: 421 485 /* Just ignore BUSY packets for now. */ 422 486 return 0; 423 487 424 488 case RXRPC_PACKET_TYPE_ABORT: 425 - conn->error = -ECONNABORTED; 426 - conn->abort_code = skb->priority; 427 - conn->state = RXRPC_CONN_REMOTELY_ABORTED; 428 - set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); 429 - rxrpc_abort_calls(conn, RXRPC_CALL_REMOTELY_ABORTED, sp->hdr.serial); 430 - return 0; 489 + if (rxrpc_is_conn_aborted(conn)) 490 + return true; 491 + rxrpc_input_conn_abort(conn, skb); 492 + rxrpc_abort_calls(conn); 493 + return true; 431 494 432 495 case RXRPC_PACKET_TYPE_CHALLENGE: 433 496 case RXRPC_PACKET_TYPE_RESPONSE: 497 + if (rxrpc_is_conn_aborted(conn)) { 498 + if (conn->completion == RXRPC_CALL_LOCALLY_ABORTED) 499 + rxrpc_send_conn_abort(conn); 500 + return true; 501 + } 434 502 rxrpc_post_packet_to_conn(conn, skb); 435 503 return 0; 436 504 ··· 443 517 */ 444 518 void rxrpc_input_conn_event(struct rxrpc_connection *conn, struct sk_buff *skb) 445 519 { 520 + if (test_and_clear_bit(RXRPC_CONN_EV_ABORT_CALLS, &conn->events)) 521 + rxrpc_abort_calls(conn); 522 + 446 523 /* Process delayed ACKs whose time has come. */ 447 524 if (conn->flags & RXRPC_CONN_FINAL_ACK_MASK) 448 525 rxrpc_process_delayed_final_acks(conn, false);
+4 -14
net/rxrpc/insecure.c
··· 43 43 } 44 44 45 45 static int none_respond_to_challenge(struct rxrpc_connection *conn, 46 - struct sk_buff *skb, 47 - u32 *_abort_code) 46 + struct sk_buff *skb) 48 47 { 49 - struct rxrpc_skb_priv *sp = rxrpc_skb(skb); 50 - 51 - trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, 52 - tracepoint_string("chall_none")); 53 - return -EPROTO; 48 + return rxrpc_abort_conn(conn, skb, RX_PROTOCOL_ERROR, -EPROTO, "RXN"); 54 49 } 55 50 56 51 static int none_verify_response(struct rxrpc_connection *conn, 57 - struct sk_buff *skb, 58 - u32 *_abort_code) 52 + struct sk_buff *skb) 59 53 { 60 - struct rxrpc_skb_priv *sp = rxrpc_skb(skb); 61 - 62 - trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, 63 - tracepoint_string("resp_none")); 64 - return -EPROTO; 54 + return rxrpc_abort_conn(conn, skb, RX_PROTOCOL_ERROR, -EPROTO, "RXN"); 65 55 } 66 56 67 57 static void none_clear(struct rxrpc_connection *conn)
+56
net/rxrpc/output.c
··· 545 545 } 546 546 547 547 /* 548 + * Transmit a connection-level abort. 549 + */ 550 + void rxrpc_send_conn_abort(struct rxrpc_connection *conn) 551 + { 552 + struct rxrpc_wire_header whdr; 553 + struct msghdr msg; 554 + struct kvec iov[2]; 555 + __be32 word; 556 + size_t len; 557 + u32 serial; 558 + int ret; 559 + 560 + msg.msg_name = &conn->peer->srx.transport; 561 + msg.msg_namelen = conn->peer->srx.transport_len; 562 + msg.msg_control = NULL; 563 + msg.msg_controllen = 0; 564 + msg.msg_flags = 0; 565 + 566 + whdr.epoch = htonl(conn->proto.epoch); 567 + whdr.cid = htonl(conn->proto.cid); 568 + whdr.callNumber = 0; 569 + whdr.seq = 0; 570 + whdr.type = RXRPC_PACKET_TYPE_ABORT; 571 + whdr.flags = conn->out_clientflag; 572 + whdr.userStatus = 0; 573 + whdr.securityIndex = conn->security_ix; 574 + whdr._rsvd = 0; 575 + whdr.serviceId = htons(conn->service_id); 576 + 577 + word = htonl(conn->abort_code); 578 + 579 + iov[0].iov_base = &whdr; 580 + iov[0].iov_len = sizeof(whdr); 581 + iov[1].iov_base = &word; 582 + iov[1].iov_len = sizeof(word); 583 + 584 + len = iov[0].iov_len + iov[1].iov_len; 585 + 586 + serial = atomic_inc_return(&conn->serial); 587 + whdr.serial = htonl(serial); 588 + 589 + iov_iter_kvec(&msg.msg_iter, WRITE, iov, 2, len); 590 + ret = do_udp_sendmsg(conn->local->socket, &msg, len); 591 + if (ret < 0) { 592 + trace_rxrpc_tx_fail(conn->debug_id, serial, ret, 593 + rxrpc_tx_point_conn_abort); 594 + _debug("sendmsg failed: %d", ret); 595 + return; 596 + } 597 + 598 + trace_rxrpc_tx_packet(conn->debug_id, &whdr, rxrpc_tx_point_conn_abort); 599 + 600 + conn->peer->last_tx_at = ktime_get_seconds(); 601 + } 602 + 603 + /* 548 604 * Reject a packet through the local endpoint. 549 605 */ 550 606 void rxrpc_reject_packet(struct rxrpc_local *local, struct sk_buff *skb)
+6 -4
net/rxrpc/proc.c
··· 17 17 [RXRPC_CONN_SERVICE_UNSECURED] = "SvUnsec ", 18 18 [RXRPC_CONN_SERVICE_CHALLENGING] = "SvChall ", 19 19 [RXRPC_CONN_SERVICE] = "SvSecure", 20 - [RXRPC_CONN_REMOTELY_ABORTED] = "RmtAbort", 21 - [RXRPC_CONN_LOCALLY_ABORTED] = "LocAbort", 20 + [RXRPC_CONN_ABORTED] = "Aborted ", 22 21 }; 23 22 24 23 /* ··· 142 143 { 143 144 struct rxrpc_connection *conn; 144 145 struct rxrpc_net *rxnet = rxrpc_net(seq_file_net(seq)); 146 + const char *state; 145 147 char lbuff[50], rbuff[50]; 146 148 147 149 if (v == &rxnet->conn_proc_list) { ··· 163 163 } 164 164 165 165 sprintf(lbuff, "%pISpc", &conn->local->srx.transport); 166 - 167 166 sprintf(rbuff, "%pISpc", &conn->peer->srx.transport); 168 167 print: 168 + state = rxrpc_is_conn_aborted(conn) ? 169 + rxrpc_call_completions[conn->completion] : 170 + rxrpc_conn_states[conn->state]; 169 171 seq_printf(seq, 170 172 "UDP %-47.47s %-47.47s %4x %08x %s %3u %3d" 171 173 " %s %08x %08x %08x %08x %08x %08x %08x\n", ··· 178 176 rxrpc_conn_is_service(conn) ? "Svc" : "Clt", 179 177 refcount_read(&conn->ref), 180 178 atomic_read(&conn->active), 181 - rxrpc_conn_states[conn->state], 179 + state, 182 180 key_serial(conn->key), 183 181 atomic_read(&conn->serial), 184 182 conn->hi_serial,
+10 -18
net/rxrpc/rxkad.c
··· 821 821 * respond to a challenge packet 822 822 */ 823 823 static int rxkad_respond_to_challenge(struct rxrpc_connection *conn, 824 - struct sk_buff *skb, 825 - u32 *_abort_code) 824 + struct sk_buff *skb) 826 825 { 827 826 const struct rxrpc_key_token *token; 828 827 struct rxkad_challenge challenge; ··· 897 898 trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, eproto); 898 899 ret = -EPROTO; 899 900 other_error: 900 - *_abort_code = abort_code; 901 + rxrpc_abort_conn(conn, skb, abort_code, ret, "RXK"); 901 902 return ret; 902 903 } 903 904 ··· 909 910 struct sk_buff *skb, 910 911 void *ticket, size_t ticket_len, 911 912 struct rxrpc_crypt *_session_key, 912 - time64_t *_expiry, 913 - u32 *_abort_code) 913 + time64_t *_expiry) 914 914 { 915 915 struct skcipher_request *req; 916 916 struct rxrpc_skb_priv *sp = rxrpc_skb(skb); ··· 1040 1042 abort_code = RXKADBADTICKET; 1041 1043 ret = -EPROTO; 1042 1044 other_error: 1043 - *_abort_code = abort_code; 1044 - return ret; 1045 + return rxrpc_abort_conn(conn, skb, abort_code, ret, "RXK"); 1045 1046 temporary_error: 1046 1047 return ret; 1047 1048 } ··· 1083 1086 * verify a response 1084 1087 */ 1085 1088 static int rxkad_verify_response(struct rxrpc_connection *conn, 1086 - struct sk_buff *skb, 1087 - u32 *_abort_code) 1089 + struct sk_buff *skb) 1088 1090 { 1089 1091 struct rxkad_response *response; 1090 1092 struct rxrpc_skb_priv *sp = rxrpc_skb(skb); ··· 1111 1115 abort_code = RXKADNOAUTH; 1112 1116 break; 1113 1117 } 1114 - trace_rxrpc_abort(0, "SVK", 1115 - sp->hdr.cid, sp->hdr.callNumber, sp->hdr.seq, 1116 - abort_code, PTR_ERR(server_key)); 1117 - *_abort_code = abort_code; 1118 - return -EPROTO; 1118 + return rxrpc_abort_conn(conn, skb, abort_code, 1119 + PTR_ERR(server_key), "RXK"); 1119 1120 } 1120 1121 1121 1122 ret = -ENOMEM; ··· 1161 1168 goto temporary_error_free_ticket; 1162 1169 1163 1170 ret = rxkad_decrypt_ticket(conn, server_key, skb, ticket, ticket_len, 1164 - &session_key, &expiry, _abort_code); 1171 + &session_key, &expiry); 1165 1172 if (ret < 0) 1166 1173 goto temporary_error_free_ticket; 1167 1174 ··· 1239 1246 kfree(ticket); 1240 1247 protocol_error: 1241 1248 kfree(response); 1242 - trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, eproto); 1243 1249 key_put(server_key); 1244 - *_abort_code = abort_code; 1245 - return -EPROTO; 1250 + trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, eproto); 1251 + return rxrpc_abort_conn(conn, skb, abort_code, -EPROTO, "RXK"); 1246 1252 1247 1253 temporary_error_free_ticket: 1248 1254 kfree(ticket);