diff options
Diffstat (limited to 'net/dccp/output.c')
-rw-r--r-- | net/dccp/output.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/net/dccp/output.c b/net/dccp/output.c index 0aab919dafe6..9888f61f9b0b 100644 --- a/net/dccp/output.c +++ b/net/dccp/output.c | |||
@@ -276,7 +276,20 @@ void dccp_write_xmit(struct sock *sk, int block) | |||
276 | const int len = skb->len; | 276 | const int len = skb->len; |
277 | 277 | ||
278 | if (sk->sk_state == DCCP_PARTOPEN) { | 278 | if (sk->sk_state == DCCP_PARTOPEN) { |
279 | /* See 8.1.5. Handshake Completion */ | 279 | const u32 cur_mps = dp->dccps_mss_cache - DCCP_FEATNEG_OVERHEAD; |
280 | /* | ||
281 | * See 8.1.5 - Handshake Completion. | ||
282 | * | ||
283 | * For robustness we resend Confirm options until the client has | ||
284 | * entered OPEN. During the initial feature negotiation, the MPS | ||
285 | * is smaller than usual, reduced by the Change/Confirm options. | ||
286 | */ | ||
287 | if (!list_empty(&dp->dccps_featneg) && len > cur_mps) { | ||
288 | DCCP_WARN("Payload too large (%d) for featneg.\n", len); | ||
289 | dccp_send_ack(sk); | ||
290 | dccp_feat_list_purge(&dp->dccps_featneg); | ||
291 | } | ||
292 | |||
280 | inet_csk_schedule_ack(sk); | 293 | inet_csk_schedule_ack(sk); |
281 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, | 294 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, |
282 | inet_csk(sk)->icsk_rto, | 295 | inet_csk(sk)->icsk_rto, |