@@ -128,6 +128,9 @@ static bool mptcp_try_coalesce(struct sock *sk, struct sk_buff *to,
128
128
!skb_try_coalesce (to , from , & fragstolen , & delta ))
129
129
return false;
130
130
131
+ pr_debug ("colesced seq %llx into %llx new len %d new end seq %llx" ,
132
+ MPTCP_SKB_CB (from )-> map_seq , MPTCP_SKB_CB (to )-> map_seq ,
133
+ to -> len , MPTCP_SKB_CB (from )-> end_seq );
131
134
MPTCP_SKB_CB (to )-> end_seq = MPTCP_SKB_CB (from )-> end_seq ;
132
135
kfree_skb_partial (from , fragstolen );
133
136
atomic_add (delta , & sk -> sk_rmem_alloc );
@@ -160,13 +163,17 @@ static void mptcp_data_queue_ofo(struct mptcp_sock *msk, struct sk_buff *skb)
160
163
max_seq = tcp_space (sk );
161
164
max_seq = max_seq > 0 ? max_seq + msk -> ack_seq : msk -> ack_seq ;
162
165
166
+ pr_debug ("msk=%p seq=%llx limit=%llx empty=%d" , msk , seq , max_seq ,
167
+ RB_EMPTY_ROOT (& msk -> out_of_order_queue ));
163
168
if (after64 (seq , max_seq )) {
164
169
/* out of window */
165
170
mptcp_drop (sk , skb );
171
+ MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_NODSSWINDOW );
166
172
return ;
167
173
}
168
174
169
175
p = & msk -> out_of_order_queue .rb_node ;
176
+ MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_OFOQUEUE );
170
177
if (RB_EMPTY_ROOT (& msk -> out_of_order_queue )) {
171
178
rb_link_node (& skb -> rbnode , NULL , p );
172
179
rb_insert_color (& skb -> rbnode , & msk -> out_of_order_queue );
@@ -177,11 +184,15 @@ static void mptcp_data_queue_ofo(struct mptcp_sock *msk, struct sk_buff *skb)
177
184
/* with 2 subflows, adding at end of ooo queue is quite likely
178
185
* Use of ooo_last_skb avoids the O(Log(N)) rbtree lookup.
179
186
*/
180
- if (mptcp_ooo_try_coalesce (msk , msk -> ooo_last_skb , skb ))
187
+ if (mptcp_ooo_try_coalesce (msk , msk -> ooo_last_skb , skb )) {
188
+ MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_OFOMERGE );
189
+ MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_OFOQUEUETAIL );
181
190
return ;
191
+ }
182
192
183
193
/* Can avoid an rbtree lookup if we are adding skb after ooo_last_skb */
184
194
if (!before64 (seq , MPTCP_SKB_CB (msk -> ooo_last_skb )-> end_seq )) {
195
+ MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_OFOQUEUETAIL );
185
196
parent = & msk -> ooo_last_skb -> rbnode ;
186
197
p = & parent -> rb_right ;
187
198
goto insert ;
@@ -200,6 +211,7 @@ static void mptcp_data_queue_ofo(struct mptcp_sock *msk, struct sk_buff *skb)
200
211
if (!after64 (end_seq , MPTCP_SKB_CB (skb1 )-> end_seq )) {
201
212
/* All the bits are present. Drop. */
202
213
mptcp_drop (sk , skb );
214
+ MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_DUPDATA );
203
215
return ;
204
216
}
205
217
if (after64 (seq , MPTCP_SKB_CB (skb1 )-> map_seq )) {
@@ -215,13 +227,16 @@ static void mptcp_data_queue_ofo(struct mptcp_sock *msk, struct sk_buff *skb)
215
227
rb_replace_node (& skb1 -> rbnode , & skb -> rbnode ,
216
228
& msk -> out_of_order_queue );
217
229
mptcp_drop (sk , skb1 );
230
+ MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_DUPDATA );
218
231
goto merge_right ;
219
232
}
220
233
} else if (mptcp_ooo_try_coalesce (msk , skb1 , skb )) {
234
+ MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_OFOMERGE );
221
235
return ;
222
236
}
223
237
p = & parent -> rb_right ;
224
238
}
239
+
225
240
insert :
226
241
/* Insert segment into RB tree. */
227
242
rb_link_node (& skb -> rbnode , parent , p );
@@ -234,6 +249,7 @@ static void mptcp_data_queue_ofo(struct mptcp_sock *msk, struct sk_buff *skb)
234
249
break ;
235
250
rb_erase (& skb1 -> rbnode , & msk -> out_of_order_queue );
236
251
mptcp_drop (sk , skb1 );
252
+ MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_DUPDATA );
237
253
}
238
254
/* If there is no skb after us, we are the last_skb ! */
239
255
if (!skb1 )
@@ -283,6 +299,7 @@ static bool __mptcp_move_skb(struct mptcp_sock *msk, struct sock *ssk,
283
299
/* old data, keep it simple and drop the whole pkt, sender
284
300
* will retransmit as needed, if needed.
285
301
*/
302
+ MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_DUPDATA );
286
303
mptcp_drop (sk , skb );
287
304
return false;
288
305
}
@@ -511,6 +528,7 @@ static bool mptcp_ofo_queue(struct mptcp_sock *msk)
511
528
u64 end_seq ;
512
529
513
530
p = rb_first (& msk -> out_of_order_queue );
531
+ pr_debug ("msk=%p empty=%d" , msk , RB_EMPTY_ROOT (& msk -> out_of_order_queue ));
514
532
while (p ) {
515
533
skb = rb_to_skb (p );
516
534
if (after64 (MPTCP_SKB_CB (skb )-> map_seq , msk -> ack_seq ))
@@ -522,6 +540,7 @@ static bool mptcp_ofo_queue(struct mptcp_sock *msk)
522
540
if (unlikely (!after64 (MPTCP_SKB_CB (skb )-> end_seq ,
523
541
msk -> ack_seq ))) {
524
542
mptcp_drop (sk , skb );
543
+ MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_DUPDATA );
525
544
continue ;
526
545
}
527
546
@@ -531,6 +550,9 @@ static bool mptcp_ofo_queue(struct mptcp_sock *msk)
531
550
int delta = msk -> ack_seq - MPTCP_SKB_CB (skb )-> map_seq ;
532
551
533
552
/* skip overlapping data, if any */
553
+ pr_debug ("uncoalesced seq=%llx ack seq=%llx delta=%d" ,
554
+ MPTCP_SKB_CB (skb )-> map_seq , msk -> ack_seq ,
555
+ delta );
534
556
MPTCP_SKB_CB (skb )-> offset += delta ;
535
557
__skb_queue_tail (& sk -> sk_receive_queue , skb );
536
558
}
0 commit comments