|
@@ -228,11 +228,10 @@ static void ccid3_hc_tx_no_feedback_timer(unsigned long data)
|
|
}
|
|
}
|
|
/*
|
|
/*
|
|
* Schedule no feedback timer to expire in
|
|
* Schedule no feedback timer to expire in
|
|
- * max(4 * R, 2 * s / X)
|
|
|
|
|
|
+ * max(4 * t_RTO, 2 * s/X) = max(4 * t_RTO, 2 * t_ipi)
|
|
|
|
+ * XXX This is non-standard, RFC 3448, 4.3 uses 4 * R
|
|
*/
|
|
*/
|
|
- next_tmout = max_t(u32, hctx->ccid3hctx_t_rto,
|
|
|
|
- 2 * usecs_div(hctx->ccid3hctx_s,
|
|
|
|
- hctx->ccid3hctx_x));
|
|
|
|
|
|
+ next_tmout = max(hctx->ccid3hctx_t_rto, 2*hctx->ccid3hctx_t_ipi);
|
|
break;
|
|
break;
|
|
case TFRC_SSTATE_NO_SENT:
|
|
case TFRC_SSTATE_NO_SENT:
|
|
DCCP_BUG("Illegal %s state NO_SENT, sk=%p", dccp_role(sk), sk);
|
|
DCCP_BUG("Illegal %s state NO_SENT, sk=%p", dccp_role(sk), sk);
|
|
@@ -460,10 +459,6 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
|
|
"r_sample=%us\n", dccp_role(sk), sk,
|
|
"r_sample=%us\n", dccp_role(sk), sk,
|
|
hctx->ccid3hctx_rtt, r_sample);
|
|
hctx->ccid3hctx_rtt, r_sample);
|
|
|
|
|
|
- /* Update timeout interval */
|
|
|
|
- hctx->ccid3hctx_t_rto = max_t(u32, 4 * hctx->ccid3hctx_rtt,
|
|
|
|
- USEC_PER_SEC);
|
|
|
|
-
|
|
|
|
/* Update receive rate */
|
|
/* Update receive rate */
|
|
hctx->ccid3hctx_x_recv = x_recv;/* X_recv in bytes per sec */
|
|
hctx->ccid3hctx_x_recv = x_recv;/* X_recv in bytes per sec */
|
|
|
|
|
|
@@ -491,17 +486,22 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
|
|
&hctx->ccid3hctx_hist, packet);
|
|
&hctx->ccid3hctx_hist, packet);
|
|
/*
|
|
/*
|
|
* As we have calculated new ipi, delta, t_nom it is possible that
|
|
* As we have calculated new ipi, delta, t_nom it is possible that
|
|
- * we now can send a packet, so wake up dccp_wait_for_ccids.
|
|
|
|
|
|
+ * we now can send a packet, so wake up dccp_wait_for_ccid
|
|
*/
|
|
*/
|
|
sk->sk_write_space(sk);
|
|
sk->sk_write_space(sk);
|
|
|
|
|
|
|
|
+
|
|
|
|
+ /* Update timeout interval. We use the alternative variant of
|
|
|
|
+ * [RFC 3448, 3.1] which sets the upper bound of t_rto to one
|
|
|
|
+ * second, as it is suggested for TCP (see RFC 2988, 2.4). */
|
|
|
|
+ hctx->ccid3hctx_t_rto = max_t(u32, 4 * hctx->ccid3hctx_rtt,
|
|
|
|
+ USEC_PER_SEC );
|
|
/*
|
|
/*
|
|
* Schedule no feedback timer to expire in
|
|
* Schedule no feedback timer to expire in
|
|
- * max(4 * R, 2 * s / X)
|
|
|
|
|
|
+ * max(4 * t_RTO, 2 * s/X) = max(4 * t_RTO, 2 * t_ipi)
|
|
|
|
+ * XXX This is non-standard, RFC 3448, 4.3 uses 4 * R
|
|
*/
|
|
*/
|
|
- next_tmout = max(hctx->ccid3hctx_t_rto,
|
|
|
|
- 2 * usecs_div(hctx->ccid3hctx_s,
|
|
|
|
- hctx->ccid3hctx_x));
|
|
|
|
|
|
+ next_tmout = max(hctx->ccid3hctx_t_rto, 2*hctx->ccid3hctx_t_ipi);
|
|
|
|
|
|
ccid3_pr_debug("%s, sk=%p, Scheduled no feedback timer to "
|
|
ccid3_pr_debug("%s, sk=%p, Scheduled no feedback timer to "
|
|
"expire in %lu jiffies (%luus)\n",
|
|
"expire in %lu jiffies (%luus)\n",
|
|
@@ -509,7 +509,7 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
|
|
usecs_to_jiffies(next_tmout), next_tmout);
|
|
usecs_to_jiffies(next_tmout), next_tmout);
|
|
|
|
|
|
sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
|
|
sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
|
|
- jiffies + max_t(u32, 1, usecs_to_jiffies(next_tmout)));
|
|
|
|
|
|
+ jiffies + usecs_to_jiffies(next_tmout));
|
|
|
|
|
|
/* set idle flag */
|
|
/* set idle flag */
|
|
hctx->ccid3hctx_idle = 1;
|
|
hctx->ccid3hctx_idle = 1;
|
|
@@ -607,7 +607,6 @@ static int ccid3_hc_tx_init(struct ccid *ccid, struct sock *sk)
|
|
|
|
|
|
/* Set transmission rate to 1 packet per second */
|
|
/* Set transmission rate to 1 packet per second */
|
|
hctx->ccid3hctx_x = hctx->ccid3hctx_s;
|
|
hctx->ccid3hctx_x = hctx->ccid3hctx_s;
|
|
- hctx->ccid3hctx_t_rto = USEC_PER_SEC;
|
|
|
|
hctx->ccid3hctx_state = TFRC_SSTATE_NO_SENT;
|
|
hctx->ccid3hctx_state = TFRC_SSTATE_NO_SENT;
|
|
INIT_LIST_HEAD(&hctx->ccid3hctx_hist);
|
|
INIT_LIST_HEAD(&hctx->ccid3hctx_hist);
|
|
|
|
|