diff options
Diffstat (limited to 'net/dccp/timer.c')
| -rw-r--r-- | net/dccp/timer.c | 42 |
1 files changed, 16 insertions, 26 deletions
diff --git a/net/dccp/timer.c b/net/dccp/timer.c index 54b3c7e9e016..16359e29e7f5 100644 --- a/net/dccp/timer.c +++ b/net/dccp/timer.c | |||
| @@ -87,17 +87,6 @@ static void dccp_retransmit_timer(struct sock *sk) | |||
| 87 | { | 87 | { |
| 88 | struct inet_connection_sock *icsk = inet_csk(sk); | 88 | struct inet_connection_sock *icsk = inet_csk(sk); |
| 89 | 89 | ||
| 90 | /* retransmit timer is used for feature negotiation throughout | ||
| 91 | * connection. In this case, no packet is re-transmitted, but rather an | ||
| 92 | * ack is generated and pending changes are placed into its options. | ||
| 93 | */ | ||
| 94 | if (sk->sk_send_head == NULL) { | ||
| 95 | dccp_pr_debug("feat negotiation retransmit timeout %p\n", sk); | ||
| 96 | if (sk->sk_state == DCCP_OPEN) | ||
| 97 | dccp_send_ack(sk); | ||
| 98 | goto backoff; | ||
| 99 | } | ||
| 100 | |||
| 101 | /* | 90 | /* |
| 102 | * More than than 4MSL (8 minutes) has passed, a RESET(aborted) was | 91 | * More than than 4MSL (8 minutes) has passed, a RESET(aborted) was |
| 103 | * sent, no need to retransmit, this sock is dead. | 92 | * sent, no need to retransmit, this sock is dead. |
| @@ -126,7 +115,6 @@ static void dccp_retransmit_timer(struct sock *sk) | |||
| 126 | return; | 115 | return; |
| 127 | } | 116 | } |
| 128 | 117 | ||
| 129 | backoff: | ||
| 130 | icsk->icsk_backoff++; | 118 | icsk->icsk_backoff++; |
| 131 | 119 | ||
| 132 | icsk->icsk_rto = min(icsk->icsk_rto << 1, DCCP_RTO_MAX); | 120 | icsk->icsk_rto = min(icsk->icsk_rto << 1, DCCP_RTO_MAX); |
| @@ -249,32 +237,35 @@ out: | |||
| 249 | sock_put(sk); | 237 | sock_put(sk); |
| 250 | } | 238 | } |
| 251 | 239 | ||
| 252 | /* Transmit-delay timer: used by the CCIDs to delay actual send time */ | 240 | /** |
| 253 | static void dccp_write_xmit_timer(unsigned long data) | 241 | * dccp_write_xmitlet - Workhorse for CCID packet dequeueing interface |
| 242 | * See the comments above %ccid_dequeueing_decision for supported modes. | ||
| 243 | */ | ||
| 244 | static void dccp_write_xmitlet(unsigned long data) | ||
| 254 | { | 245 | { |
| 255 | struct sock *sk = (struct sock *)data; | 246 | struct sock *sk = (struct sock *)data; |
| 256 | struct dccp_sock *dp = dccp_sk(sk); | ||
| 257 | 247 | ||
| 258 | bh_lock_sock(sk); | 248 | bh_lock_sock(sk); |
| 259 | if (sock_owned_by_user(sk)) | 249 | if (sock_owned_by_user(sk)) |
| 260 | sk_reset_timer(sk, &dp->dccps_xmit_timer, jiffies+1); | 250 | sk_reset_timer(sk, &dccp_sk(sk)->dccps_xmit_timer, jiffies + 1); |
| 261 | else | 251 | else |
| 262 | dccp_write_xmit(sk, 0); | 252 | dccp_write_xmit(sk); |
| 263 | bh_unlock_sock(sk); | 253 | bh_unlock_sock(sk); |
| 264 | sock_put(sk); | ||
| 265 | } | 254 | } |
| 266 | 255 | ||
| 267 | static void dccp_init_write_xmit_timer(struct sock *sk) | 256 | static void dccp_write_xmit_timer(unsigned long data) |
| 268 | { | 257 | { |
| 269 | struct dccp_sock *dp = dccp_sk(sk); | 258 | dccp_write_xmitlet(data); |
| 270 | 259 | sock_put((struct sock *)data); | |
| 271 | setup_timer(&dp->dccps_xmit_timer, dccp_write_xmit_timer, | ||
| 272 | (unsigned long)sk); | ||
| 273 | } | 260 | } |
| 274 | 261 | ||
| 275 | void dccp_init_xmit_timers(struct sock *sk) | 262 | void dccp_init_xmit_timers(struct sock *sk) |
| 276 | { | 263 | { |
| 277 | dccp_init_write_xmit_timer(sk); | 264 | struct dccp_sock *dp = dccp_sk(sk); |
| 265 | |||
| 266 | tasklet_init(&dp->dccps_xmitlet, dccp_write_xmitlet, (unsigned long)sk); | ||
| 267 | setup_timer(&dp->dccps_xmit_timer, dccp_write_xmit_timer, | ||
| 268 | (unsigned long)sk); | ||
| 278 | inet_csk_init_xmit_timers(sk, &dccp_write_timer, &dccp_delack_timer, | 269 | inet_csk_init_xmit_timers(sk, &dccp_write_timer, &dccp_delack_timer, |
| 279 | &dccp_keepalive_timer); | 270 | &dccp_keepalive_timer); |
| 280 | } | 271 | } |
| @@ -290,8 +281,7 @@ u32 dccp_timestamp(void) | |||
| 290 | { | 281 | { |
| 291 | s64 delta = ktime_us_delta(ktime_get_real(), dccp_timestamp_seed); | 282 | s64 delta = ktime_us_delta(ktime_get_real(), dccp_timestamp_seed); |
| 292 | 283 | ||
| 293 | do_div(delta, 10); | 284 | return div_u64(delta, DCCP_TIME_RESOLUTION); |
| 294 | return delta; | ||
| 295 | } | 285 | } |
| 296 | EXPORT_SYMBOL_GPL(dccp_timestamp); | 286 | EXPORT_SYMBOL_GPL(dccp_timestamp); |
| 297 | 287 | ||
