diff options
Diffstat (limited to 'net/dccp')
-rw-r--r-- | net/dccp/dccp.h | 5 | ||||
-rw-r--r-- | net/dccp/output.c | 15 |
2 files changed, 18 insertions, 2 deletions
diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h index 08a569ff02d1..d6bc47363b1c 100644 --- a/net/dccp/dccp.h +++ b/net/dccp/dccp.h | |||
@@ -63,11 +63,14 @@ extern void dccp_time_wait(struct sock *sk, int state, int timeo); | |||
63 | * - DCCP-Reset with ACK Subheader and 4 bytes of Reset Code fields | 63 | * - DCCP-Reset with ACK Subheader and 4 bytes of Reset Code fields |
64 | * Hence a safe upper bound for the maximum option length is 1020-28 = 992 | 64 | * Hence a safe upper bound for the maximum option length is 1020-28 = 992 |
65 | */ | 65 | */ |
66 | #define MAX_DCCP_SPECIFIC_HEADER (255 * sizeof(int)) | 66 | #define MAX_DCCP_SPECIFIC_HEADER (255 * sizeof(uint32_t)) |
67 | #define DCCP_MAX_PACKET_HDR 28 | 67 | #define DCCP_MAX_PACKET_HDR 28 |
68 | #define DCCP_MAX_OPT_LEN (MAX_DCCP_SPECIFIC_HEADER - DCCP_MAX_PACKET_HDR) | 68 | #define DCCP_MAX_OPT_LEN (MAX_DCCP_SPECIFIC_HEADER - DCCP_MAX_PACKET_HDR) |
69 | #define MAX_DCCP_HEADER (MAX_DCCP_SPECIFIC_HEADER + MAX_HEADER) | 69 | #define MAX_DCCP_HEADER (MAX_DCCP_SPECIFIC_HEADER + MAX_HEADER) |
70 | 70 | ||
71 | /* Upper bound for initial feature-negotiation overhead (padded to 32 bits) */ | ||
72 | #define DCCP_FEATNEG_OVERHEAD (32 * sizeof(uint32_t)) | ||
73 | |||
71 | #define DCCP_TIMEWAIT_LEN (60 * HZ) /* how long to wait to destroy TIME-WAIT | 74 | #define DCCP_TIMEWAIT_LEN (60 * HZ) /* how long to wait to destroy TIME-WAIT |
72 | * state, about 60 seconds */ | 75 | * state, about 60 seconds */ |
73 | 76 | ||
diff --git a/net/dccp/output.c b/net/dccp/output.c index 27c79bcc6a1e..36bcc00654d3 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, |