|
@@ -161,21 +161,27 @@ unsigned int dccp_sync_mss(struct sock *sk, u32 pmtu)
|
|
|
struct inet_connection_sock *icsk = inet_csk(sk);
|
|
|
struct dccp_sock *dp = dccp_sk(sk);
|
|
|
u32 ccmps = dccp_determine_ccmps(dp);
|
|
|
- int cur_mps = ccmps ? min(pmtu, ccmps) : pmtu;
|
|
|
+ u32 cur_mps = ccmps ? min(pmtu, ccmps) : pmtu;
|
|
|
|
|
|
/* Account for header lengths and IPv4/v6 option overhead */
|
|
|
cur_mps -= (icsk->icsk_af_ops->net_header_len + icsk->icsk_ext_hdr_len +
|
|
|
sizeof(struct dccp_hdr) + sizeof(struct dccp_hdr_ext));
|
|
|
|
|
|
/*
|
|
|
- * FIXME: this should come from the CCID infrastructure, where, say,
|
|
|
- * TFRC will say it wants TIMESTAMPS, ELAPSED time, etc, for now lets
|
|
|
- * put a rough estimate for NDP + TIMESTAMP + TIMESTAMP_ECHO + ELAPSED
|
|
|
- * TIME + TFRC_OPT_LOSS_EVENT_RATE + TFRC_OPT_RECEIVE_RATE + padding to
|
|
|
- * make it a multiple of 4
|
|
|
+ * Leave enough headroom for common DCCP header options.
|
|
|
+ * This only considers options which may appear on DCCP-Data packets, as
|
|
|
+ * per table 3 in RFC 4340, 5.8. When running out of space for other
|
|
|
+ * options (eg. Ack Vector which can take up to 255 bytes), it is better
|
|
|
+ * to schedule a separate Ack. Thus we leave headroom for the following:
|
|
|
+ * - 1 byte for Slow Receiver (11.6)
|
|
|
+ * - 6 bytes for Timestamp (13.1)
|
|
|
+ * - 10 bytes for Timestamp Echo (13.3)
|
|
|
+ * - 8 bytes for NDP count (7.7, when activated)
|
|
|
+ * - 6 bytes for Data Checksum (9.3)
|
|
|
+ * - %DCCPAV_MIN_OPTLEN bytes for Ack Vector size (11.4, when enabled)
|
|
|
*/
|
|
|
-
|
|
|
- cur_mps -= roundup(5 + 6 + 10 + 6 + 6 + 6, 4);
|
|
|
+ cur_mps -= roundup(1 + 6 + 10 + dp->dccps_send_ndp_count * 8 + 6 +
|
|
|
+ (dp->dccps_hc_rx_ackvec ? DCCPAV_MIN_OPTLEN : 0), 4);
|
|
|
|
|
|
/* And store cached results */
|
|
|
icsk->icsk_pmtu_cookie = pmtu;
|