hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/rxrpc/conn_event.c
....@@ -1,12 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /* connection-level event handling
23 *
34 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
45 * Written by David Howells (dhowells@redhat.com)
5
- *
6
- * This program is free software; you can redistribute it and/or
7
- * modify it under the terms of the GNU General Public License
8
- * as published by the Free Software Foundation; either version
9
- * 2 of the License, or (at your option) any later version.
106 */
117
128 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
....@@ -153,19 +149,20 @@
153149 * pass a connection-level abort onto all calls on that connection
154150 */
155151 static void rxrpc_abort_calls(struct rxrpc_connection *conn,
156
- enum rxrpc_call_completion compl)
152
+ enum rxrpc_call_completion compl,
153
+ rxrpc_serial_t serial)
157154 {
158155 struct rxrpc_call *call;
159156 int i;
160157
161158 _enter("{%d},%x", conn->debug_id, conn->abort_code);
162159
163
- spin_lock(&conn->channel_lock);
160
+ spin_lock(&conn->bundle->channel_lock);
164161
165162 for (i = 0; i < RXRPC_MAXCALLS; i++) {
166163 call = rcu_dereference_protected(
167164 conn->channels[i].call,
168
- lockdep_is_held(&conn->channel_lock));
165
+ lockdep_is_held(&conn->bundle->channel_lock));
169166 if (call) {
170167 if (compl == RXRPC_CALL_LOCALLY_ABORTED)
171168 trace_rxrpc_abort(call->debug_id,
....@@ -173,14 +170,16 @@
173170 call->call_id, 0,
174171 conn->abort_code,
175172 conn->error);
176
- if (rxrpc_set_call_completion(call, compl,
177
- conn->abort_code,
178
- conn->error))
179
- rxrpc_notify_socket(call);
173
+ else
174
+ trace_rxrpc_rx_abort(call, serial,
175
+ conn->abort_code);
176
+ rxrpc_set_call_completion(call, compl,
177
+ conn->abort_code,
178
+ conn->error);
180179 }
181180 }
182181
183
- spin_unlock(&conn->channel_lock);
182
+ spin_unlock(&conn->bundle->channel_lock);
184183 _leave("");
185184 }
186185
....@@ -211,9 +210,8 @@
211210 conn->error = error;
212211 conn->abort_code = abort_code;
213212 conn->state = RXRPC_CONN_LOCALLY_ABORTED;
213
+ set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags);
214214 spin_unlock_bh(&conn->state_lock);
215
-
216
- rxrpc_abort_calls(conn, RXRPC_CALL_LOCALLY_ABORTED);
217215
218216 msg.msg_name = &conn->params.peer->srx.transport;
219217 msg.msg_namelen = conn->params.peer->srx.transport_len;
....@@ -242,6 +240,7 @@
242240 len = iov[0].iov_len + iov[1].iov_len;
243241
244242 serial = atomic_inc_return(&conn->serial);
243
+ rxrpc_abort_calls(conn, RXRPC_CALL_LOCALLY_ABORTED, serial);
245244 whdr.serial = htonl(serial);
246245 _proto("Tx CONN ABORT %%%u { %d }", serial, conn->abort_code);
247246
....@@ -271,7 +270,7 @@
271270 if (call) {
272271 write_lock_bh(&call->state_lock);
273272 if (call->state == RXRPC_CALL_SERVER_SECURING) {
274
- call->state = RXRPC_CALL_SERVER_ACCEPTING;
273
+ call->state = RXRPC_CALL_SERVER_RECV_REQUEST;
275274 rxrpc_notify_socket(call);
276275 }
277276 write_unlock_bh(&call->state_lock);
....@@ -321,7 +320,8 @@
321320 conn->error = -ECONNABORTED;
322321 conn->abort_code = abort_code;
323322 conn->state = RXRPC_CONN_REMOTELY_ABORTED;
324
- rxrpc_abort_calls(conn, RXRPC_CALL_REMOTELY_ABORTED);
323
+ set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags);
324
+ rxrpc_abort_calls(conn, RXRPC_CALL_REMOTELY_ABORTED, sp->hdr.serial);
325325 return -ECONNABORTED;
326326
327327 case RXRPC_PACKET_TYPE_CHALLENGE:
....@@ -341,7 +341,7 @@
341341 if (ret < 0)
342342 return ret;
343343
344
- spin_lock(&conn->channel_lock);
344
+ spin_lock(&conn->bundle->channel_lock);
345345 spin_lock_bh(&conn->state_lock);
346346
347347 if (conn->state == RXRPC_CONN_SERVICE_CHALLENGING) {
....@@ -351,12 +351,12 @@
351351 rxrpc_call_is_secure(
352352 rcu_dereference_protected(
353353 conn->channels[loop].call,
354
- lockdep_is_held(&conn->channel_lock)));
354
+ lockdep_is_held(&conn->bundle->channel_lock)));
355355 } else {
356356 spin_unlock_bh(&conn->state_lock);
357357 }
358358
359
- spin_unlock(&conn->channel_lock);
359
+ spin_unlock(&conn->bundle->channel_lock);
360360 return 0;
361361
362362 default:
....@@ -377,21 +377,7 @@
377377 _enter("{%d}", conn->debug_id);
378378
379379 ASSERT(conn->security_ix != 0);
380
-
381
- if (!conn->params.key) {
382
- _debug("set up security");
383
- ret = rxrpc_init_server_conn_security(conn);
384
- switch (ret) {
385
- case 0:
386
- break;
387
- case -ENOENT:
388
- abort_code = RX_CALL_DEAD;
389
- goto abort;
390
- default:
391
- abort_code = RXKADNOAUTH;
392
- goto abort;
393
- }
394
- }
380
+ ASSERT(conn->server_key);
395381
396382 if (conn->security->issue_challenge(conn) < 0) {
397383 abort_code = RX_CALL_DEAD;
....@@ -411,7 +397,7 @@
411397 /*
412398 * Process delayed final ACKs that we haven't subsumed into a subsequent call.
413399 */
414
-static void rxrpc_process_delayed_final_acks(struct rxrpc_connection *conn)
400
+void rxrpc_process_delayed_final_acks(struct rxrpc_connection *conn, bool force)
415401 {
416402 unsigned long j = jiffies, next_j;
417403 unsigned int channel;
....@@ -430,7 +416,7 @@
430416 smp_rmb(); /* vs rxrpc_disconnect_client_call */
431417 ack_at = READ_ONCE(chan->final_ack_at);
432418
433
- if (time_before(j, ack_at)) {
419
+ if (time_before(j, ack_at) && !force) {
434420 if (time_before(ack_at, next_j)) {
435421 next_j = ack_at;
436422 set = true;
....@@ -464,12 +450,12 @@
464450
465451 /* Process delayed ACKs whose time has come. */
466452 if (conn->flags & RXRPC_CONN_FINAL_ACK_MASK)
467
- rxrpc_process_delayed_final_acks(conn);
453
+ rxrpc_process_delayed_final_acks(conn, false);
468454
469455 /* go through the conn-level event packets, releasing the ref on this
470456 * connection that each one has when we've finished with it */
471457 while ((skb = skb_dequeue(&conn->rx_queue))) {
472
- rxrpc_see_skb(skb, rxrpc_skb_rx_seen);
458
+ rxrpc_see_skb(skb, rxrpc_skb_seen);
473459 ret = rxrpc_process_event(conn, skb, &abort_code);
474460 switch (ret) {
475461 case -EPROTO:
....@@ -481,7 +467,7 @@
481467 goto requeue_and_leave;
482468 case -ECONNABORTED:
483469 default:
484
- rxrpc_free_skb(skb, rxrpc_skb_rx_freed);
470
+ rxrpc_free_skb(skb, rxrpc_skb_freed);
485471 break;
486472 }
487473 }
....@@ -495,7 +481,7 @@
495481 protocol_error:
496482 if (rxrpc_abort_connection(conn, ret, abort_code) < 0)
497483 goto requeue_and_leave;
498
- rxrpc_free_skb(skb, rxrpc_skb_rx_freed);
484
+ rxrpc_free_skb(skb, rxrpc_skb_freed);
499485 return;
500486 }
501487
....@@ -515,4 +501,3 @@
515501 _leave("");
516502 return;
517503 }
518
-