|
@@ -3280,6 +3280,15 @@ static inline bool tcp_may_update_window(const struct tcp_sock *tp,
|
|
|
(ack_seq == tp->snd_wl1 && nwin > tp->snd_wnd);
|
|
|
}
|
|
|
|
|
|
+/* If we update tp->snd_una, also update tp->bytes_acked */
|
|
|
+static void tcp_snd_una_update(struct tcp_sock *tp, u32 ack)
|
|
|
+{
|
|
|
+ u32 delta = ack - tp->snd_una;
|
|
|
+
|
|
|
+ tp->bytes_acked += delta;
|
|
|
+ tp->snd_una = ack;
|
|
|
+}
|
|
|
+
|
|
|
/* Update our send window.
|
|
|
*
|
|
|
* Window update algorithm, described in RFC793/RFC1122 (used in linux-2.2
|
|
@@ -3315,7 +3324,7 @@ static int tcp_ack_update_window(struct sock *sk, const struct sk_buff *skb, u32
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- tp->snd_una = ack;
|
|
|
+ tcp_snd_una_update(tp, ack);
|
|
|
|
|
|
return flag;
|
|
|
}
|
|
@@ -3497,7 +3506,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
|
|
|
* Note, we use the fact that SND.UNA>=SND.WL2.
|
|
|
*/
|
|
|
tcp_update_wl(tp, ack_seq);
|
|
|
- tp->snd_una = ack;
|
|
|
+ tcp_snd_una_update(tp, ack);
|
|
|
flag |= FLAG_WIN_UPDATE;
|
|
|
|
|
|
tcp_in_ack_event(sk, CA_ACK_WIN_UPDATE);
|