aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_input.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r--net/ipv4/tcp_input.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 8a38774cc66e..fc133178c787 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -233,14 +233,21 @@ static inline void TCP_ECN_check_ce(struct tcp_sock *tp, const struct sk_buff *s
233 tcp_enter_quickack_mode((struct sock *)tp); 233 tcp_enter_quickack_mode((struct sock *)tp);
234 break; 234 break;
235 case INET_ECN_CE: 235 case INET_ECN_CE:
236 if (tcp_ca_needs_ecn((struct sock *)tp))
237 tcp_ca_event((struct sock *)tp, CA_EVENT_ECN_IS_CE);
238
236 if (!(tp->ecn_flags & TCP_ECN_DEMAND_CWR)) { 239 if (!(tp->ecn_flags & TCP_ECN_DEMAND_CWR)) {
237 /* Better not delay acks, sender can have a very low cwnd */ 240 /* Better not delay acks, sender can have a very low cwnd */
238 tcp_enter_quickack_mode((struct sock *)tp); 241 tcp_enter_quickack_mode((struct sock *)tp);
239 tp->ecn_flags |= TCP_ECN_DEMAND_CWR; 242 tp->ecn_flags |= TCP_ECN_DEMAND_CWR;
240 } 243 }
241 /* fallinto */ 244 tp->ecn_flags |= TCP_ECN_SEEN;
245 break;
242 default: 246 default:
247 if (tcp_ca_needs_ecn((struct sock *)tp))
248 tcp_ca_event((struct sock *)tp, CA_EVENT_ECN_NO_CE);
243 tp->ecn_flags |= TCP_ECN_SEEN; 249 tp->ecn_flags |= TCP_ECN_SEEN;
250 break;
244 } 251 }
245} 252}
246 253
@@ -3429,10 +3436,12 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
3429 tp->snd_una = ack; 3436 tp->snd_una = ack;
3430 flag |= FLAG_WIN_UPDATE; 3437 flag |= FLAG_WIN_UPDATE;
3431 3438
3432 tcp_in_ack_event(sk, 0); 3439 tcp_in_ack_event(sk, CA_ACK_WIN_UPDATE);
3433 3440
3434 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPHPACKS); 3441 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPHPACKS);
3435 } else { 3442 } else {
3443 u32 ack_ev_flags = CA_ACK_SLOWPATH;
3444
3436 if (ack_seq != TCP_SKB_CB(skb)->end_seq) 3445 if (ack_seq != TCP_SKB_CB(skb)->end_seq)
3437 flag |= FLAG_DATA; 3446 flag |= FLAG_DATA;
3438 else 3447 else
@@ -3444,10 +3453,15 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
3444 flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una, 3453 flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una,
3445 &sack_rtt_us); 3454 &sack_rtt_us);
3446 3455
3447 if (TCP_ECN_rcv_ecn_echo(tp, tcp_hdr(skb))) 3456 if (TCP_ECN_rcv_ecn_echo(tp, tcp_hdr(skb))) {
3448 flag |= FLAG_ECE; 3457 flag |= FLAG_ECE;
3458 ack_ev_flags |= CA_ACK_ECE;
3459 }
3460
3461 if (flag & FLAG_WIN_UPDATE)
3462 ack_ev_flags |= CA_ACK_WIN_UPDATE;
3449 3463
3450 tcp_in_ack_event(sk, CA_ACK_SLOWPATH); 3464 tcp_in_ack_event(sk, ack_ev_flags);
3451 } 3465 }
3452 3466
3453 /* We passed data and got it acked, remove any soft error 3467 /* We passed data and got it acked, remove any soft error