24
24
* Retransmit terminal ACK or ABORT of the previous call.
25
25
*/
26
26
static void rxrpc_conn_retransmit_call (struct rxrpc_connection * conn ,
27
- struct sk_buff * skb )
27
+ struct sk_buff * skb ,
28
+ unsigned int channel )
28
29
{
29
- struct rxrpc_skb_priv * sp = rxrpc_skb (skb );
30
+ struct rxrpc_skb_priv * sp = skb ? rxrpc_skb (skb ) : NULL ;
30
31
struct rxrpc_channel * chan ;
31
32
struct msghdr msg ;
32
33
struct kvec iov ;
@@ -48,15 +49,15 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
48
49
49
50
_enter ("%d" , conn -> debug_id );
50
51
51
- chan = & conn -> channels [sp -> hdr . cid & RXRPC_CHANNELMASK ];
52
+ chan = & conn -> channels [channel ];
52
53
53
54
/* If the last call got moved on whilst we were waiting to run, just
54
55
* ignore this packet.
55
56
*/
56
57
call_id = READ_ONCE (chan -> last_call );
57
58
/* Sync with __rxrpc_disconnect_call() */
58
59
smp_rmb ();
59
- if (call_id != sp -> hdr .callNumber )
60
+ if (skb && call_id != sp -> hdr .callNumber )
60
61
return ;
61
62
62
63
msg .msg_name = & conn -> params .peer -> srx .transport ;
@@ -65,9 +66,9 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
65
66
msg .msg_controllen = 0 ;
66
67
msg .msg_flags = 0 ;
67
68
68
- pkt .whdr .epoch = htonl (sp -> hdr .epoch );
69
- pkt .whdr .cid = htonl (sp -> hdr .cid );
70
- pkt .whdr .callNumber = htonl (sp -> hdr . callNumber );
69
+ pkt .whdr .epoch = htonl (conn -> proto .epoch );
70
+ pkt .whdr .cid = htonl (conn -> proto .cid );
71
+ pkt .whdr .callNumber = htonl (call_id );
71
72
pkt .whdr .seq = 0 ;
72
73
pkt .whdr .type = chan -> last_type ;
73
74
pkt .whdr .flags = conn -> out_clientflag ;
@@ -87,11 +88,11 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
87
88
mtu = conn -> params .peer -> if_mtu ;
88
89
mtu -= conn -> params .peer -> hdrsize ;
89
90
pkt .ack .bufferSpace = 0 ;
90
- pkt .ack .maxSkew = htons (skb -> priority );
91
- pkt .ack .firstPacket = htonl (chan -> last_seq );
92
- pkt .ack .previousPacket = htonl (chan -> last_seq - 1 );
93
- pkt .ack .serial = htonl (sp -> hdr .serial );
94
- pkt .ack .reason = RXRPC_ACK_DUPLICATE ;
91
+ pkt .ack .maxSkew = htons (skb ? skb -> priority : 0 );
92
+ pkt .ack .firstPacket = htonl (chan -> last_seq + 1 );
93
+ pkt .ack .previousPacket = htonl (chan -> last_seq );
94
+ pkt .ack .serial = htonl (skb ? sp -> hdr .serial : 0 );
95
+ pkt .ack .reason = skb ? RXRPC_ACK_DUPLICATE : RXRPC_ACK_IDLE ;
95
96
pkt .ack .nAcks = 0 ;
96
97
pkt .info .rxMTU = htonl (rxrpc_rx_mtu );
97
98
pkt .info .maxMTU = htonl (mtu );
@@ -272,7 +273,8 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
272
273
switch (sp -> hdr .type ) {
273
274
case RXRPC_PACKET_TYPE_DATA :
274
275
case RXRPC_PACKET_TYPE_ACK :
275
- rxrpc_conn_retransmit_call (conn , skb );
276
+ rxrpc_conn_retransmit_call (conn , skb ,
277
+ sp -> hdr .cid & RXRPC_CHANNELMASK );
276
278
return 0 ;
277
279
278
280
case RXRPC_PACKET_TYPE_BUSY :
@@ -378,6 +380,48 @@ static void rxrpc_secure_connection(struct rxrpc_connection *conn)
378
380
_leave (" [aborted]" );
379
381
}
380
382
383
+ /*
384
+ * Process delayed final ACKs that we haven't subsumed into a subsequent call.
385
+ */
386
+ static void rxrpc_process_delayed_final_acks (struct rxrpc_connection * conn )
387
+ {
388
+ unsigned long j = jiffies , next_j ;
389
+ unsigned int channel ;
390
+ bool set ;
391
+
392
+ again :
393
+ next_j = j + LONG_MAX ;
394
+ set = false;
395
+ for (channel = 0 ; channel < RXRPC_MAXCALLS ; channel ++ ) {
396
+ struct rxrpc_channel * chan = & conn -> channels [channel ];
397
+ unsigned long ack_at ;
398
+
399
+ if (!test_bit (RXRPC_CONN_FINAL_ACK_0 + channel , & conn -> flags ))
400
+ continue ;
401
+
402
+ smp_rmb (); /* vs rxrpc_disconnect_client_call */
403
+ ack_at = READ_ONCE (chan -> final_ack_at );
404
+
405
+ if (time_before (j , ack_at )) {
406
+ if (time_before (ack_at , next_j )) {
407
+ next_j = ack_at ;
408
+ set = true;
409
+ }
410
+ continue ;
411
+ }
412
+
413
+ if (test_and_clear_bit (RXRPC_CONN_FINAL_ACK_0 + channel ,
414
+ & conn -> flags ))
415
+ rxrpc_conn_retransmit_call (conn , NULL , channel );
416
+ }
417
+
418
+ j = jiffies ;
419
+ if (time_before_eq (next_j , j ))
420
+ goto again ;
421
+ if (set )
422
+ rxrpc_reduce_conn_timer (conn , next_j );
423
+ }
424
+
381
425
/*
382
426
* connection-level event processor
383
427
*/
@@ -394,6 +438,10 @@ void rxrpc_process_connection(struct work_struct *work)
394
438
if (test_and_clear_bit (RXRPC_CONN_EV_CHALLENGE , & conn -> events ))
395
439
rxrpc_secure_connection (conn );
396
440
441
+ /* Process delayed ACKs whose time has come. */
442
+ if (conn -> flags & RXRPC_CONN_FINAL_ACK_MASK )
443
+ rxrpc_process_delayed_final_acks (conn );
444
+
397
445
/* go through the conn-level event packets, releasing the ref on this
398
446
* connection that each one has when we've finished with it */
399
447
while ((skb = skb_dequeue (& conn -> rx_queue ))) {
0 commit comments