|
|
@@ -652,6 +652,7 @@ static void rxrpc_input_ackinfo(struct rxrpc_call *call, struct sk_buff *skb,
|
|
|
struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
|
|
|
struct rxrpc_peer *peer;
|
|
|
unsigned int mtu;
|
|
|
+ bool wake = false;
|
|
|
u32 rwind = ntohl(ackinfo->rwind);
|
|
|
|
|
|
_proto("Rx ACK %%%u Info { rx=%u max=%u rwin=%u jm=%u }",
|
|
|
@@ -659,9 +660,14 @@ static void rxrpc_input_ackinfo(struct rxrpc_call *call, struct sk_buff *skb,
|
|
|
ntohl(ackinfo->rxMTU), ntohl(ackinfo->maxMTU),
|
|
|
rwind, ntohl(ackinfo->jumbo_max));
|
|
|
|
|
|
- if (rwind > RXRPC_RXTX_BUFF_SIZE - 1)
|
|
|
- rwind = RXRPC_RXTX_BUFF_SIZE - 1;
|
|
|
- call->tx_winsize = rwind;
|
|
|
+ if (call->tx_winsize != rwind) {
|
|
|
+ if (rwind > RXRPC_RXTX_BUFF_SIZE - 1)
|
|
|
+ rwind = RXRPC_RXTX_BUFF_SIZE - 1;
|
|
|
+ if (rwind > call->tx_winsize)
|
|
|
+ wake = true;
|
|
|
+ call->tx_winsize = rwind;
|
|
|
+ }
|
|
|
+
|
|
|
if (call->cong_ssthresh > rwind)
|
|
|
call->cong_ssthresh = rwind;
|
|
|
|
|
|
@@ -675,6 +681,9 @@ static void rxrpc_input_ackinfo(struct rxrpc_call *call, struct sk_buff *skb,
|
|
|
spin_unlock_bh(&peer->lock);
|
|
|
_net("Net MTU %u (maxdata %u)", peer->mtu, peer->maxdata);
|
|
|
}
|
|
|
+
|
|
|
+ if (wake)
|
|
|
+ wake_up(&call->waitq);
|
|
|
}
|
|
|
|
|
|
/*
|