4 static inline void dctcp_ece_ack_cwr(struct sock
*sk
, u32 ce_state
)
6 struct tcp_sock
*tp
= tcp_sk(sk
);
9 tp
->ecn_flags
|= TCP_ECN_DEMAND_CWR
;
11 tp
->ecn_flags
&= ~TCP_ECN_DEMAND_CWR
;
14 /* Minimal DCTP CE state machine:
16 * S: 0 <- last pkt was non-CE
17 * 1 <- last pkt was CE
19 static inline void dctcp_ece_ack_update(struct sock
*sk
, enum tcp_ca_event evt
,
20 u32
*prior_rcv_nxt
, u32
*ce_state
)
22 u32 new_ce_state
= (evt
== CA_EVENT_ECN_IS_CE
) ? 1 : 0;
24 if (*ce_state
!= new_ce_state
) {
25 /* CE state has changed, force an immediate ACK to
26 * reflect the new CE state. If an ACK was delayed,
27 * send that first to reflect the prior CE state.
29 if (inet_csk(sk
)->icsk_ack
.pending
& ICSK_ACK_TIMER
) {
30 dctcp_ece_ack_cwr(sk
, *ce_state
);
31 __tcp_send_ack(sk
, *prior_rcv_nxt
);
33 inet_csk(sk
)->icsk_ack
.pending
|= ICSK_ACK_NOW
;
35 *prior_rcv_nxt
= tcp_sk(sk
)->rcv_nxt
;
36 *ce_state
= new_ce_state
;
37 dctcp_ece_ack_cwr(sk
, new_ce_state
);