9
9
10
10
#include "ar-internal.h"
11
11
12
+ /* Override priority when generating ACKs for received DATA */
13
+ static const u8 rxrpc_ack_priority [RXRPC_ACK__INVALID ] = {
14
+ [RXRPC_ACK_IDLE ] = 1 ,
15
+ [RXRPC_ACK_DELAY ] = 2 ,
16
+ [RXRPC_ACK_REQUESTED ] = 3 ,
17
+ [RXRPC_ACK_DUPLICATE ] = 4 ,
18
+ [RXRPC_ACK_EXCEEDS_WINDOW ] = 5 ,
19
+ [RXRPC_ACK_NOSPACE ] = 6 ,
20
+ [RXRPC_ACK_OUT_OF_SEQUENCE ] = 7 ,
21
+ };
22
+
12
23
static void rxrpc_proto_abort (struct rxrpc_call * call , rxrpc_seq_t seq ,
13
24
enum rxrpc_abort_reason why )
14
25
{
@@ -365,7 +376,7 @@ static void rxrpc_input_queue_data(struct rxrpc_call *call, struct sk_buff *skb,
365
376
* Process a DATA packet.
366
377
*/
367
378
static void rxrpc_input_data_one (struct rxrpc_call * call , struct sk_buff * skb ,
368
- bool * _notify )
379
+ bool * _notify , rxrpc_serial_t * _ack_serial , int * _ack_reason )
369
380
{
370
381
struct rxrpc_skb_priv * sp = rxrpc_skb (skb );
371
382
struct sk_buff * oos ;
@@ -418,8 +429,6 @@ static void rxrpc_input_data_one(struct rxrpc_call *call, struct sk_buff *skb,
418
429
/* Send an immediate ACK if we fill in a hole */
419
430
else if (!skb_queue_empty (& call -> rx_oos_queue ))
420
431
ack_reason = RXRPC_ACK_DELAY ;
421
- else
422
- call -> ackr_nr_unacked ++ ;
423
432
424
433
window ++ ;
425
434
if (after (window , wtop )) {
@@ -497,12 +506,16 @@ static void rxrpc_input_data_one(struct rxrpc_call *call, struct sk_buff *skb,
497
506
}
498
507
499
508
send_ack :
500
- if (ack_reason >= 0 )
501
- rxrpc_send_ACK (call , ack_reason , serial ,
502
- rxrpc_propose_ack_input_data );
503
- else
504
- rxrpc_propose_delay_ACK (call , serial ,
505
- rxrpc_propose_ack_input_data );
509
+ if (ack_reason >= 0 ) {
510
+ if (rxrpc_ack_priority [ack_reason ] > rxrpc_ack_priority [* _ack_reason ]) {
511
+ * _ack_serial = serial ;
512
+ * _ack_reason = ack_reason ;
513
+ } else if (rxrpc_ack_priority [ack_reason ] == rxrpc_ack_priority [* _ack_reason ] &&
514
+ ack_reason == RXRPC_ACK_REQUESTED ) {
515
+ * _ack_serial = serial ;
516
+ * _ack_reason = ack_reason ;
517
+ }
518
+ }
506
519
}
507
520
508
521
/*
@@ -513,9 +526,11 @@ static bool rxrpc_input_split_jumbo(struct rxrpc_call *call, struct sk_buff *skb
513
526
struct rxrpc_jumbo_header jhdr ;
514
527
struct rxrpc_skb_priv * sp = rxrpc_skb (skb ), * jsp ;
515
528
struct sk_buff * jskb ;
529
+ rxrpc_serial_t ack_serial = 0 ;
516
530
unsigned int offset = sizeof (struct rxrpc_wire_header );
517
531
unsigned int len = skb -> len - offset ;
518
532
bool notify = false;
533
+ int ack_reason = 0 ;
519
534
520
535
while (sp -> hdr .flags & RXRPC_JUMBO_PACKET ) {
521
536
if (len < RXRPC_JUMBO_SUBPKTLEN )
@@ -535,7 +550,7 @@ static bool rxrpc_input_split_jumbo(struct rxrpc_call *call, struct sk_buff *skb
535
550
jsp = rxrpc_skb (jskb );
536
551
jsp -> offset = offset ;
537
552
jsp -> len = RXRPC_JUMBO_DATALEN ;
538
- rxrpc_input_data_one (call , jskb , & notify );
553
+ rxrpc_input_data_one (call , jskb , & notify , & ack_serial , & ack_reason );
539
554
rxrpc_free_skb (jskb , rxrpc_skb_put_jumbo_subpacket );
540
555
541
556
sp -> hdr .flags = jhdr .flags ;
@@ -548,7 +563,16 @@ static bool rxrpc_input_split_jumbo(struct rxrpc_call *call, struct sk_buff *skb
548
563
549
564
sp -> offset = offset ;
550
565
sp -> len = len ;
551
- rxrpc_input_data_one (call , skb , & notify );
566
+ rxrpc_input_data_one (call , skb , & notify , & ack_serial , & ack_reason );
567
+
568
+ if (ack_reason > 0 ) {
569
+ rxrpc_send_ACK (call , ack_reason , ack_serial ,
570
+ rxrpc_propose_ack_input_data );
571
+ } else {
572
+ call -> ackr_nr_unacked ++ ;
573
+ rxrpc_propose_delay_ACK (call , sp -> hdr .serial ,
574
+ rxrpc_propose_ack_input_data );
575
+ }
552
576
if (notify ) {
553
577
trace_rxrpc_notify_socket (call -> debug_id , sp -> hdr .serial );
554
578
rxrpc_notify_socket (call );
@@ -685,9 +709,6 @@ static void rxrpc_input_ack_trailer(struct rxrpc_call *call, struct sk_buff *skb
685
709
call -> tx_winsize = rwind ;
686
710
}
687
711
688
- if (call -> cong_ssthresh > rwind )
689
- call -> cong_ssthresh = rwind ;
690
-
691
712
mtu = min (ntohl (trailer -> maxMTU ), ntohl (trailer -> ifMTU ));
692
713
693
714
peer = call -> peer ;
0 commit comments