@@ -143,6 +143,14 @@ static void __mptcp_move_skb(struct mptcp_sock *msk, struct sock *ssk,
143
143
MPTCP_SKB_CB (skb )-> offset = offset ;
144
144
}
145
145
146
+ static void mptcp_stop_timer (struct sock * sk )
147
+ {
148
+ struct inet_connection_sock * icsk = inet_csk (sk );
149
+
150
+ sk_stop_timer (sk , & icsk -> icsk_retransmit_timer );
151
+ mptcp_sk (sk )-> timer_ival = 0 ;
152
+ }
153
+
146
154
/* both sockets must be locked */
147
155
static bool mptcp_subflow_dsn_valid (const struct mptcp_sock * msk ,
148
156
struct sock * ssk )
@@ -164,6 +172,42 @@ static bool mptcp_subflow_dsn_valid(const struct mptcp_sock *msk,
164
172
return mptcp_subflow_data_available (ssk );
165
173
}
166
174
175
+ static void mptcp_check_data_fin_ack (struct sock * sk )
176
+ {
177
+ struct mptcp_sock * msk = mptcp_sk (sk );
178
+
179
+ if (__mptcp_check_fallback (msk ))
180
+ return ;
181
+
182
+ /* Look for an acknowledged DATA_FIN */
183
+ if (((1 << sk -> sk_state ) &
184
+ (TCPF_FIN_WAIT1 | TCPF_CLOSING | TCPF_LAST_ACK )) &&
185
+ msk -> write_seq == atomic64_read (& msk -> snd_una )) {
186
+ mptcp_stop_timer (sk );
187
+
188
+ WRITE_ONCE (msk -> snd_data_fin_enable , 0 );
189
+
190
+ switch (sk -> sk_state ) {
191
+ case TCP_FIN_WAIT1 :
192
+ inet_sk_state_store (sk , TCP_FIN_WAIT2 );
193
+ sk -> sk_state_change (sk );
194
+ break ;
195
+ case TCP_CLOSING :
196
+ fallthrough ;
197
+ case TCP_LAST_ACK :
198
+ inet_sk_state_store (sk , TCP_CLOSE );
199
+ sk -> sk_state_change (sk );
200
+ break ;
201
+ }
202
+
203
+ if (sk -> sk_shutdown == SHUTDOWN_MASK ||
204
+ sk -> sk_state == TCP_CLOSE )
205
+ sk_wake_async (sk , SOCK_WAKE_WAITD , POLL_HUP );
206
+ else
207
+ sk_wake_async (sk , SOCK_WAKE_WAITD , POLL_IN );
208
+ }
209
+ }
210
+
167
211
static bool mptcp_pending_data_fin (struct sock * sk , u64 * seq )
168
212
{
169
213
struct mptcp_sock * msk = mptcp_sk (sk );
@@ -222,6 +266,8 @@ static void mptcp_check_data_fin(struct sock *sk)
222
266
WRITE_ONCE (msk -> rcv_data_fin , 0 );
223
267
224
268
sk -> sk_shutdown |= RCV_SHUTDOWN ;
269
+ smp_mb__before_atomic (); /* SHUTDOWN must be visible first */
270
+ set_bit (MPTCP_DATA_READY , & msk -> flags );
225
271
226
272
switch (sk -> sk_state ) {
227
273
case TCP_ESTABLISHED :
@@ -455,14 +501,6 @@ static void mptcp_check_for_eof(struct mptcp_sock *msk)
455
501
}
456
502
}
457
503
458
- static void mptcp_stop_timer (struct sock * sk )
459
- {
460
- struct inet_connection_sock * icsk = inet_csk (sk );
461
-
462
- sk_stop_timer (sk , & icsk -> icsk_retransmit_timer );
463
- mptcp_sk (sk )-> timer_ival = 0 ;
464
- }
465
-
466
504
static bool mptcp_ext_cache_refill (struct mptcp_sock * msk )
467
505
{
468
506
const struct sock * sk = (const struct sock * )msk ;
0 commit comments