|
@@ -2536,6 +2536,9 @@ static inline void tcp_end_cwnd_reduction(struct sock *sk)
|
|
{
|
|
{
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
|
|
|
|
|
|
+ if (inet_csk(sk)->icsk_ca_ops->cong_control)
|
|
|
|
+ return;
|
|
|
|
+
|
|
/* Reset cwnd to ssthresh in CWR or Recovery (unless it's undone) */
|
|
/* Reset cwnd to ssthresh in CWR or Recovery (unless it's undone) */
|
|
if (inet_csk(sk)->icsk_ca_state == TCP_CA_CWR ||
|
|
if (inet_csk(sk)->icsk_ca_state == TCP_CA_CWR ||
|
|
(tp->undo_marker && tp->snd_ssthresh < TCP_INFINITE_SSTHRESH)) {
|
|
(tp->undo_marker && tp->snd_ssthresh < TCP_INFINITE_SSTHRESH)) {
|
|
@@ -3312,8 +3315,15 @@ static inline bool tcp_may_raise_cwnd(const struct sock *sk, const int flag)
|
|
* information. All transmission or retransmission are delayed afterwards.
|
|
* information. All transmission or retransmission are delayed afterwards.
|
|
*/
|
|
*/
|
|
static void tcp_cong_control(struct sock *sk, u32 ack, u32 acked_sacked,
|
|
static void tcp_cong_control(struct sock *sk, u32 ack, u32 acked_sacked,
|
|
- int flag)
|
|
|
|
|
|
+ int flag, const struct rate_sample *rs)
|
|
{
|
|
{
|
|
|
|
+ const struct inet_connection_sock *icsk = inet_csk(sk);
|
|
|
|
+
|
|
|
|
+ if (icsk->icsk_ca_ops->cong_control) {
|
|
|
|
+ icsk->icsk_ca_ops->cong_control(sk, rs);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (tcp_in_cwnd_reduction(sk)) {
|
|
if (tcp_in_cwnd_reduction(sk)) {
|
|
/* Reduce cwnd if state mandates */
|
|
/* Reduce cwnd if state mandates */
|
|
tcp_cwnd_reduction(sk, acked_sacked, flag);
|
|
tcp_cwnd_reduction(sk, acked_sacked, flag);
|
|
@@ -3683,7 +3693,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
|
|
delivered = tp->delivered - delivered; /* freshly ACKed or SACKed */
|
|
delivered = tp->delivered - delivered; /* freshly ACKed or SACKed */
|
|
lost = tp->lost - lost; /* freshly marked lost */
|
|
lost = tp->lost - lost; /* freshly marked lost */
|
|
tcp_rate_gen(sk, delivered, lost, &now, &rs);
|
|
tcp_rate_gen(sk, delivered, lost, &now, &rs);
|
|
- tcp_cong_control(sk, ack, delivered, flag);
|
|
|
|
|
|
+ tcp_cong_control(sk, ack, delivered, flag, &rs);
|
|
tcp_xmit_recovery(sk, rexmit);
|
|
tcp_xmit_recovery(sk, rexmit);
|
|
return 1;
|
|
return 1;
|
|
|
|
|
|
@@ -5982,7 +5992,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
|
|
} else
|
|
} else
|
|
tcp_init_metrics(sk);
|
|
tcp_init_metrics(sk);
|
|
|
|
|
|
- tcp_update_pacing_rate(sk);
|
|
|
|
|
|
+ if (!inet_csk(sk)->icsk_ca_ops->cong_control)
|
|
|
|
+ tcp_update_pacing_rate(sk);
|
|
|
|
|
|
/* Prevent spurious tcp_cwnd_restart() on first data packet */
|
|
/* Prevent spurious tcp_cwnd_restart() on first data packet */
|
|
tp->lsndtime = tcp_time_stamp;
|
|
tp->lsndtime = tcp_time_stamp;
|