diff options
Diffstat (limited to 'net/ipv4/tcp_htcp.c')
| -rw-r--r-- | net/ipv4/tcp_htcp.c | 53 |
1 files changed, 31 insertions, 22 deletions
diff --git a/net/ipv4/tcp_htcp.c b/net/ipv4/tcp_htcp.c index 40168275acf9..e47b37984e95 100644 --- a/net/ipv4/tcp_htcp.c +++ b/net/ipv4/tcp_htcp.c | |||
| @@ -55,18 +55,21 @@ static inline void htcp_reset(struct htcp *ca) | |||
| 55 | ca->snd_cwnd_cnt2 = 0; | 55 | ca->snd_cwnd_cnt2 = 0; |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | static u32 htcp_cwnd_undo(struct tcp_sock *tp) | 58 | static u32 htcp_cwnd_undo(struct sock *sk) |
| 59 | { | 59 | { |
| 60 | struct htcp *ca = tcp_ca(tp); | 60 | const struct tcp_sock *tp = tcp_sk(sk); |
| 61 | struct htcp *ca = inet_csk_ca(sk); | ||
| 61 | ca->ccount = ca->undo_ccount; | 62 | ca->ccount = ca->undo_ccount; |
| 62 | ca->maxRTT = ca->undo_maxRTT; | 63 | ca->maxRTT = ca->undo_maxRTT; |
| 63 | ca->old_maxB = ca->undo_old_maxB; | 64 | ca->old_maxB = ca->undo_old_maxB; |
| 64 | return max(tp->snd_cwnd, (tp->snd_ssthresh<<7)/ca->beta); | 65 | return max(tp->snd_cwnd, (tp->snd_ssthresh<<7)/ca->beta); |
| 65 | } | 66 | } |
| 66 | 67 | ||
| 67 | static inline void measure_rtt(struct tcp_sock *tp) | 68 | static inline void measure_rtt(struct sock *sk) |
| 68 | { | 69 | { |
| 69 | struct htcp *ca = tcp_ca(tp); | 70 | const struct inet_connection_sock *icsk = inet_csk(sk); |
| 71 | const struct tcp_sock *tp = tcp_sk(sk); | ||
| 72 | struct htcp *ca = inet_csk_ca(sk); | ||
| 70 | u32 srtt = tp->srtt>>3; | 73 | u32 srtt = tp->srtt>>3; |
| 71 | 74 | ||
| 72 | /* keep track of minimum RTT seen so far, minRTT is zero at first */ | 75 | /* keep track of minimum RTT seen so far, minRTT is zero at first */ |
| @@ -74,7 +77,7 @@ static inline void measure_rtt(struct tcp_sock *tp) | |||
| 74 | ca->minRTT = srtt; | 77 | ca->minRTT = srtt; |
| 75 | 78 | ||
| 76 | /* max RTT */ | 79 | /* max RTT */ |
| 77 | if (tp->ca_state == TCP_CA_Open && tp->snd_ssthresh < 0xFFFF && ca->ccount > 3) { | 80 | if (icsk->icsk_ca_state == TCP_CA_Open && tp->snd_ssthresh < 0xFFFF && ca->ccount > 3) { |
| 78 | if (ca->maxRTT < ca->minRTT) | 81 | if (ca->maxRTT < ca->minRTT) |
| 79 | ca->maxRTT = ca->minRTT; | 82 | ca->maxRTT = ca->minRTT; |
| 80 | if (ca->maxRTT < srtt && srtt <= ca->maxRTT+HZ/50) | 83 | if (ca->maxRTT < srtt && srtt <= ca->maxRTT+HZ/50) |
| @@ -82,13 +85,16 @@ static inline void measure_rtt(struct tcp_sock *tp) | |||
| 82 | } | 85 | } |
| 83 | } | 86 | } |
| 84 | 87 | ||
| 85 | static void measure_achieved_throughput(struct tcp_sock *tp, u32 pkts_acked) | 88 | static void measure_achieved_throughput(struct sock *sk, u32 pkts_acked) |
| 86 | { | 89 | { |
| 87 | struct htcp *ca = tcp_ca(tp); | 90 | const struct inet_connection_sock *icsk = inet_csk(sk); |
| 91 | const struct tcp_sock *tp = tcp_sk(sk); | ||
| 92 | struct htcp *ca = inet_csk_ca(sk); | ||
| 88 | u32 now = tcp_time_stamp; | 93 | u32 now = tcp_time_stamp; |
| 89 | 94 | ||
| 90 | /* achieved throughput calculations */ | 95 | /* achieved throughput calculations */ |
| 91 | if (tp->ca_state != TCP_CA_Open && tp->ca_state != TCP_CA_Disorder) { | 96 | if (icsk->icsk_ca_state != TCP_CA_Open && |
| 97 | icsk->icsk_ca_state != TCP_CA_Disorder) { | ||
| 92 | ca->packetcount = 0; | 98 | ca->packetcount = 0; |
| 93 | ca->lasttime = now; | 99 | ca->lasttime = now; |
| 94 | return; | 100 | return; |
| @@ -173,9 +179,9 @@ static inline void htcp_alpha_update(struct htcp *ca) | |||
| 173 | * that point do we really have a real sense of maxRTT (the queues en route | 179 | * that point do we really have a real sense of maxRTT (the queues en route |
| 174 | * were getting just too full now). | 180 | * were getting just too full now). |
| 175 | */ | 181 | */ |
| 176 | static void htcp_param_update(struct tcp_sock *tp) | 182 | static void htcp_param_update(struct sock *sk) |
| 177 | { | 183 | { |
| 178 | struct htcp *ca = tcp_ca(tp); | 184 | struct htcp *ca = inet_csk_ca(sk); |
| 179 | u32 minRTT = ca->minRTT; | 185 | u32 minRTT = ca->minRTT; |
| 180 | u32 maxRTT = ca->maxRTT; | 186 | u32 maxRTT = ca->maxRTT; |
| 181 | 187 | ||
| @@ -187,17 +193,19 @@ static void htcp_param_update(struct tcp_sock *tp) | |||
| 187 | ca->maxRTT = minRTT + ((maxRTT-minRTT)*95)/100; | 193 | ca->maxRTT = minRTT + ((maxRTT-minRTT)*95)/100; |
| 188 | } | 194 | } |
| 189 | 195 | ||
| 190 | static u32 htcp_recalc_ssthresh(struct tcp_sock *tp) | 196 | static u32 htcp_recalc_ssthresh(struct sock *sk) |
| 191 | { | 197 | { |
| 192 | struct htcp *ca = tcp_ca(tp); | 198 | const struct tcp_sock *tp = tcp_sk(sk); |
| 193 | htcp_param_update(tp); | 199 | const struct htcp *ca = inet_csk_ca(sk); |
| 200 | htcp_param_update(sk); | ||
| 194 | return max((tp->snd_cwnd * ca->beta) >> 7, 2U); | 201 | return max((tp->snd_cwnd * ca->beta) >> 7, 2U); |
| 195 | } | 202 | } |
| 196 | 203 | ||
| 197 | static void htcp_cong_avoid(struct tcp_sock *tp, u32 ack, u32 rtt, | 204 | static void htcp_cong_avoid(struct sock *sk, u32 ack, u32 rtt, |
| 198 | u32 in_flight, int data_acked) | 205 | u32 in_flight, int data_acked) |
| 199 | { | 206 | { |
| 200 | struct htcp *ca = tcp_ca(tp); | 207 | struct tcp_sock *tp = tcp_sk(sk); |
| 208 | struct htcp *ca = inet_csk_ca(sk); | ||
| 201 | 209 | ||
| 202 | if (in_flight < tp->snd_cwnd) | 210 | if (in_flight < tp->snd_cwnd) |
| 203 | return; | 211 | return; |
| @@ -207,7 +215,7 @@ static void htcp_cong_avoid(struct tcp_sock *tp, u32 ack, u32 rtt, | |||
| 207 | if (tp->snd_cwnd < tp->snd_cwnd_clamp) | 215 | if (tp->snd_cwnd < tp->snd_cwnd_clamp) |
| 208 | tp->snd_cwnd++; | 216 | tp->snd_cwnd++; |
| 209 | } else { | 217 | } else { |
| 210 | measure_rtt(tp); | 218 | measure_rtt(sk); |
| 211 | 219 | ||
| 212 | /* keep track of number of round-trip times since last backoff event */ | 220 | /* keep track of number of round-trip times since last backoff event */ |
| 213 | if (ca->snd_cwnd_cnt2++ > tp->snd_cwnd) { | 221 | if (ca->snd_cwnd_cnt2++ > tp->snd_cwnd) { |
| @@ -229,28 +237,29 @@ static void htcp_cong_avoid(struct tcp_sock *tp, u32 ack, u32 rtt, | |||
| 229 | } | 237 | } |
| 230 | 238 | ||
| 231 | /* Lower bound on congestion window. */ | 239 | /* Lower bound on congestion window. */ |
| 232 | static u32 htcp_min_cwnd(struct tcp_sock *tp) | 240 | static u32 htcp_min_cwnd(struct sock *sk) |
| 233 | { | 241 | { |
| 242 | const struct tcp_sock *tp = tcp_sk(sk); | ||
| 234 | return tp->snd_ssthresh; | 243 | return tp->snd_ssthresh; |
| 235 | } | 244 | } |
| 236 | 245 | ||
| 237 | 246 | ||
| 238 | static void htcp_init(struct tcp_sock *tp) | 247 | static void htcp_init(struct sock *sk) |
| 239 | { | 248 | { |
| 240 | struct htcp *ca = tcp_ca(tp); | 249 | struct htcp *ca = inet_csk_ca(sk); |
| 241 | 250 | ||
| 242 | memset(ca, 0, sizeof(struct htcp)); | 251 | memset(ca, 0, sizeof(struct htcp)); |
| 243 | ca->alpha = ALPHA_BASE; | 252 | ca->alpha = ALPHA_BASE; |
| 244 | ca->beta = BETA_MIN; | 253 | ca->beta = BETA_MIN; |
| 245 | } | 254 | } |
| 246 | 255 | ||
| 247 | static void htcp_state(struct tcp_sock *tp, u8 new_state) | 256 | static void htcp_state(struct sock *sk, u8 new_state) |
| 248 | { | 257 | { |
| 249 | switch (new_state) { | 258 | switch (new_state) { |
| 250 | case TCP_CA_CWR: | 259 | case TCP_CA_CWR: |
| 251 | case TCP_CA_Recovery: | 260 | case TCP_CA_Recovery: |
| 252 | case TCP_CA_Loss: | 261 | case TCP_CA_Loss: |
| 253 | htcp_reset(tcp_ca(tp)); | 262 | htcp_reset(inet_csk_ca(sk)); |
| 254 | break; | 263 | break; |
| 255 | } | 264 | } |
| 256 | } | 265 | } |
| @@ -269,7 +278,7 @@ static struct tcp_congestion_ops htcp = { | |||
| 269 | 278 | ||
| 270 | static int __init htcp_register(void) | 279 | static int __init htcp_register(void) |
| 271 | { | 280 | { |
| 272 | BUG_ON(sizeof(struct htcp) > TCP_CA_PRIV_SIZE); | 281 | BUG_ON(sizeof(struct htcp) > ICSK_CA_PRIV_SIZE); |
| 273 | BUILD_BUG_ON(BETA_MIN >= BETA_MAX); | 282 | BUILD_BUG_ON(BETA_MIN >= BETA_MAX); |
| 274 | if (!use_bandwidth_switch) | 283 | if (!use_bandwidth_switch) |
| 275 | htcp.pkts_acked = NULL; | 284 | htcp.pkts_acked = NULL; |
