aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/dccp/ccids/ccid3.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
index 15c25f622000..80f12c990c00 100644
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -55,12 +55,10 @@ extern int ccid3_debug;
55#define TFRC_STD_PACKET_SIZE 256 55#define TFRC_STD_PACKET_SIZE 256
56#define TFRC_MAX_PACKET_SIZE 65535 56#define TFRC_MAX_PACKET_SIZE 65535
57 57
58#define USEC_IN_SEC 1000000 58#define TFRC_INITIAL_TIMEOUT (2 * USEC_PER_SEC)
59
60#define TFRC_INITIAL_TIMEOUT (2 * USEC_IN_SEC)
61/* two seconds as per CCID3 spec 11 */ 59/* two seconds as per CCID3 spec 11 */
62 60
63#define TFRC_OPSYS_HALF_TIME_GRAN (USEC_IN_SEC / (2 * HZ)) 61#define TFRC_OPSYS_HALF_TIME_GRAN (USEC_PER_SEC / (2 * HZ))
64/* above is in usecs - half the scheduling granularity as per RFC3448 4.6 */ 62/* above is in usecs - half the scheduling granularity as per RFC3448 4.6 */
65 63
66#define TFRC_WIN_COUNT_PER_RTT 4 64#define TFRC_WIN_COUNT_PER_RTT 4
@@ -155,20 +153,23 @@ static inline void ccid3_hc_tx_set_state(struct sock *sk, enum ccid3_hc_tx_state
155 hctx->ccid3hctx_state = state; 153 hctx->ccid3hctx_state = state;
156} 154}
157 155
158static void timeval_sub(struct timeval large, struct timeval small, struct timeval *result) { 156static void timeval_sub(struct timeval large, struct timeval small,
159 157 struct timeval *result)
158{
160 result->tv_sec = large.tv_sec-small.tv_sec; 159 result->tv_sec = large.tv_sec-small.tv_sec;
161 if (large.tv_usec < small.tv_usec) { 160 if (large.tv_usec < small.tv_usec) {
162 (result->tv_sec)--; 161 (result->tv_sec)--;
163 result->tv_usec = USEC_IN_SEC+large.tv_usec-small.tv_usec; 162 result->tv_usec = USEC_PER_SEC +
163 large.tv_usec - small.tv_usec;
164 } else 164 } else
165 result->tv_usec = large.tv_usec-small.tv_usec; 165 result->tv_usec = large.tv_usec-small.tv_usec;
166} 166}
167 167
168static inline void timeval_fix(struct timeval *tv) { 168static inline void timeval_fix(struct timeval *tv)
169 if (tv->tv_usec >= USEC_IN_SEC) { 169{
170 if (tv->tv_usec >= USEC_PER_SEC) {
170 tv->tv_sec++; 171 tv->tv_sec++;
171 tv->tv_usec -= USEC_IN_SEC; 172 tv->tv_usec -= USEC_PER_SEC;
172 } 173 }
173} 174}
174 175
@@ -1185,7 +1186,8 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
1185 r_sample); 1186 r_sample);
1186 1187
1187 /* Update timeout interval */ 1188 /* Update timeout interval */
1188 inet_csk(sk)->icsk_rto = max_t(u32, 4 * hctx->ccid3hctx_rtt, USEC_IN_SEC); 1189 inet_csk(sk)->icsk_rto = max_t(u32, 4 * hctx->ccid3hctx_rtt,
1190 USEC_PER_SEC);
1189 1191
1190 /* Update receive rate */ 1192 /* Update receive rate */
1191 hctx->ccid3hctx_x_recv = x_recv; /* x_recv in bytes per second */ 1193 hctx->ccid3hctx_x_recv = x_recv; /* x_recv in bytes per second */
@@ -1210,7 +1212,7 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
1210 1212
1211 /* Update next send time */ 1213 /* Update next send time */
1212 if (hctx->ccid3hctx_t_ipi > (hctx->ccid3hctx_t_nom).tv_usec) { 1214 if (hctx->ccid3hctx_t_ipi > (hctx->ccid3hctx_t_nom).tv_usec) {
1213 (hctx->ccid3hctx_t_nom).tv_usec += USEC_IN_SEC; 1215 hctx->ccid3hctx_t_nom.tv_usec += USEC_PER_SEC;
1214 (hctx->ccid3hctx_t_nom).tv_sec--; 1216 (hctx->ccid3hctx_t_nom).tv_sec--;
1215 } 1217 }
1216 /* FIXME - if no feedback then t_ipi can go > 1 second */ 1218 /* FIXME - if no feedback then t_ipi can go > 1 second */
@@ -1344,7 +1346,7 @@ static int ccid3_hc_tx_init(struct sock *sk)
1344 1346
1345 hctx->ccid3hctx_x = hctx->ccid3hctx_s; /* set transmission rate to 1 packet per second */ 1347 hctx->ccid3hctx_x = hctx->ccid3hctx_s; /* set transmission rate to 1 packet per second */
1346 hctx->ccid3hctx_rtt = 4; /* See ccid3_hc_tx_packet_sent win_count calculatation */ 1348 hctx->ccid3hctx_rtt = 4; /* See ccid3_hc_tx_packet_sent win_count calculatation */
1347 inet_csk(sk)->icsk_rto = USEC_IN_SEC; 1349 inet_csk(sk)->icsk_rto = USEC_PER_SEC;
1348 hctx->ccid3hctx_state = TFRC_SSTATE_NO_SENT; 1350 hctx->ccid3hctx_state = TFRC_SSTATE_NO_SENT;
1349 INIT_LIST_HEAD(&hctx->ccid3hctx_hist); 1351 INIT_LIST_HEAD(&hctx->ccid3hctx_hist);
1350 init_timer(&hctx->ccid3hctx_no_feedback_timer); 1352 init_timer(&hctx->ccid3hctx_no_feedback_timer);
@@ -1531,7 +1533,8 @@ static void ccid3_hc_rx_send_feedback(struct sock *sk)
1531 1533
1532 if (delta == 0) 1534 if (delta == 0)
1533 delta = 1; /* to prevent divide by zero */ 1535 delta = 1; /* to prevent divide by zero */
1534 hcrx->ccid3hcrx_x_recv = (hcrx->ccid3hcrx_bytes_recv * USEC_IN_SEC) / delta; 1536 hcrx->ccid3hcrx_x_recv = (hcrx->ccid3hcrx_bytes_recv *
1537 USEC_PER_SEC) / delta;
1535 } 1538 }
1536 break; 1539 break;
1537 default: 1540 default:
@@ -1669,7 +1672,7 @@ static u32 ccid3_hc_rx_calc_first_li(struct sock *sk)
1669 } 1672 }
1670found: 1673found:
1671 timeval_sub(tstamp,tail->dccphrx_tstamp,&tmp_tv); 1674 timeval_sub(tstamp,tail->dccphrx_tstamp,&tmp_tv);
1672 rtt = (tmp_tv.tv_sec * USEC_IN_SEC + tmp_tv.tv_usec) * 4 / interval; 1675 rtt = (tmp_tv.tv_sec * USEC_PER_SEC + tmp_tv.tv_usec) * 4 / interval;
1673 ccid3_pr_debug("%s, sk=%p, approximated RTT to %uus\n", 1676 ccid3_pr_debug("%s, sk=%p, approximated RTT to %uus\n",
1674 dccp_role(sk), sk, rtt); 1677 dccp_role(sk), sk, rtt);
1675 if (rtt == 0) 1678 if (rtt == 0)
@@ -1679,7 +1682,7 @@ found:
1679 if (delta == 0) 1682 if (delta == 0)
1680 delta = 1; 1683 delta = 1;
1681 1684
1682 x_recv = (hcrx->ccid3hcrx_bytes_recv * USEC_IN_SEC) / delta; 1685 x_recv = (hcrx->ccid3hcrx_bytes_recv * USEC_PER_SEC) / delta;
1683 1686
1684 tmp1 = (u64)x_recv * (u64)rtt; 1687 tmp1 = (u64)x_recv * (u64)rtt;
1685 do_div(tmp1,10000000); 1688 do_div(tmp1,10000000);