@@ -57,6 +57,12 @@ static struct socket *__mptcp_nmpc_socket(const struct mptcp_sock *msk)
57
57
return msk -> subflow ;
58
58
}
59
59
60
+ /* Returns end sequence number of the receiver's advertised window */
61
+ static u64 mptcp_wnd_end (const struct mptcp_sock * msk )
62
+ {
63
+ return atomic64_read (& msk -> wnd_end );
64
+ }
65
+
60
66
static bool mptcp_is_tcpsk (struct sock * sk )
61
67
{
62
68
struct socket * sock = sk -> sk_socket ;
@@ -174,6 +180,7 @@ static void mptcp_data_queue_ofo(struct mptcp_sock *msk, struct sk_buff *skb)
174
180
if (after64 (seq , max_seq )) {
175
181
/* out of window */
176
182
mptcp_drop (sk , skb );
183
+ pr_debug ("oow by %ld" , (unsigned long )seq - (unsigned long )max_seq );
177
184
MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_NODSSWINDOW );
178
185
return ;
179
186
}
@@ -847,6 +854,7 @@ static void mptcp_clean_una(struct sock *sk)
847
854
*/
848
855
if (__mptcp_check_fallback (msk ))
849
856
atomic64_set (& msk -> snd_una , msk -> snd_nxt );
857
+
850
858
snd_una = atomic64_read (& msk -> snd_una );
851
859
852
860
list_for_each_entry_safe (dfrag , dtmp , & msk -> rtx_queue , list ) {
@@ -944,12 +952,30 @@ struct mptcp_sendmsg_info {
944
952
unsigned int flags ;
945
953
};
946
954
955
+ static int mptcp_check_allowed_size (struct mptcp_sock * msk , u64 data_seq ,
956
+ int avail_size )
957
+ {
958
+ u64 window_end = mptcp_wnd_end (msk );
959
+
960
+ if (__mptcp_check_fallback (msk ))
961
+ return avail_size ;
962
+
963
+ if (!before64 (data_seq + avail_size , window_end )) {
964
+ u64 allowed_size = window_end - data_seq ;
965
+
966
+ return min_t (unsigned int , allowed_size , avail_size );
967
+ }
968
+
969
+ return avail_size ;
970
+ }
971
+
947
972
static int mptcp_sendmsg_frag (struct sock * sk , struct sock * ssk ,
948
973
struct mptcp_data_frag * dfrag ,
949
974
struct mptcp_sendmsg_info * info )
950
975
{
951
976
u64 data_seq = dfrag -> data_seq + info -> sent ;
952
977
struct mptcp_sock * msk = mptcp_sk (sk );
978
+ bool zero_window_probe = false;
953
979
struct mptcp_ext * mpext = NULL ;
954
980
struct sk_buff * skb , * tail ;
955
981
bool can_collapse = false;
@@ -979,6 +1005,16 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk,
979
1005
avail_size = info -> size_goal - skb -> len ;
980
1006
}
981
1007
1008
+ /* Zero window and all data acked? Probe. */
1009
+ avail_size = mptcp_check_allowed_size (msk , data_seq , avail_size );
1010
+ if (avail_size == 0 ) {
1011
+ if (skb || atomic64_read (& msk -> snd_una ) != msk -> snd_nxt )
1012
+ return 0 ;
1013
+ zero_window_probe = true;
1014
+ data_seq = atomic64_read (& msk -> snd_una ) - 1 ;
1015
+ avail_size = 1 ;
1016
+ }
1017
+
982
1018
if (WARN_ON_ONCE (info -> sent > info -> limit ||
983
1019
info -> limit > dfrag -> data_len ))
984
1020
return 0 ;
@@ -996,6 +1032,7 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk,
996
1032
if (skb == tail ) {
997
1033
WARN_ON_ONCE (!can_collapse );
998
1034
mpext -> data_len += ret ;
1035
+ WARN_ON_ONCE (zero_window_probe );
999
1036
goto out ;
1000
1037
}
1001
1038
@@ -1013,6 +1050,12 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk,
1013
1050
mpext -> data_seq , mpext -> subflow_seq , mpext -> data_len ,
1014
1051
mpext -> dsn64 );
1015
1052
1053
+ if (zero_window_probe ) {
1054
+ mptcp_subflow_ctx (ssk )-> rel_write_seq += ret ;
1055
+ mpext -> frozen = 1 ;
1056
+ ret = 0 ;
1057
+ tcp_push_pending_frames (ssk );
1058
+ }
1016
1059
out :
1017
1060
mptcp_subflow_ctx (ssk )-> rel_write_seq += ret ;
1018
1061
return ret ;
@@ -1866,7 +1909,7 @@ static void mptcp_worker(struct work_struct *work)
1866
1909
info .limit = dfrag -> already_sent ;
1867
1910
while (info .sent < dfrag -> already_sent ) {
1868
1911
ret = mptcp_sendmsg_frag (sk , ssk , dfrag , & info );
1869
- if (ret < 0 )
1912
+ if (ret <= 0 )
1870
1913
break ;
1871
1914
1872
1915
MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_RETRANSSEGS );
@@ -2226,6 +2269,8 @@ struct sock *mptcp_sk_clone(const struct sock *sk,
2226
2269
msk -> write_seq = subflow_req -> idsn + 1 ;
2227
2270
msk -> snd_nxt = msk -> write_seq ;
2228
2271
atomic64_set (& msk -> snd_una , msk -> write_seq );
2272
+ atomic64_set (& msk -> wnd_end , msk -> snd_nxt + req -> rsk_rcv_wnd );
2273
+
2229
2274
if (mp_opt -> mp_capable ) {
2230
2275
msk -> can_ack = true;
2231
2276
msk -> remote_key = mp_opt -> sndr_key ;
@@ -2258,6 +2303,8 @@ void mptcp_rcv_space_init(struct mptcp_sock *msk, const struct sock *ssk)
2258
2303
TCP_INIT_CWND * tp -> advmss );
2259
2304
if (msk -> rcvq_space .space == 0 )
2260
2305
msk -> rcvq_space .space = TCP_INIT_CWND * TCP_MSS_DEFAULT ;
2306
+
2307
+ atomic64_set (& msk -> wnd_end , msk -> snd_nxt + tcp_sk (ssk )-> snd_wnd );
2261
2308
}
2262
2309
2263
2310
static struct sock * mptcp_accept (struct sock * sk , int flags , int * err ,
0 commit comments