OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [net/] [ipv4/] [tcp_timer.c] - Blame information for rev 1774

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 * INET         An implementation of the TCP/IP protocol suite for the LINUX
3
 *              operating system.  INET is implemented using the  BSD Socket
4
 *              interface as the means of communication with the user level.
5
 *
6
 *              Implementation of the Transmission Control Protocol(TCP).
7
 *
8
 * Version:     $Id: tcp_timer.c,v 1.1.1.1 2004-04-15 01:13:54 phoenix Exp $
9
 *
10
 * Authors:     Ross Biro, <bir7@leland.Stanford.Edu>
11
 *              Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
12
 *              Mark Evans, <evansmp@uhura.aston.ac.uk>
13
 *              Corey Minyard <wf-rch!minyard@relay.EU.net>
14
 *              Florian La Roche, <flla@stud.uni-sb.de>
15
 *              Charles Hedrick, <hedrick@klinzhai.rutgers.edu>
16
 *              Linus Torvalds, <torvalds@cs.helsinki.fi>
17
 *              Alan Cox, <gw4pts@gw4pts.ampr.org>
18
 *              Matthew Dillon, <dillon@apollo.west.oic.com>
19
 *              Arnt Gulbrandsen, <agulbra@nvg.unit.no>
20
 *              Jorge Cwik, <jorge@laser.satlink.net>
21
 */
22
 
23
#include <net/tcp.h>
24
 
25
int sysctl_tcp_syn_retries = TCP_SYN_RETRIES;
26
int sysctl_tcp_synack_retries = TCP_SYNACK_RETRIES;
27
int sysctl_tcp_keepalive_time = TCP_KEEPALIVE_TIME;
28
int sysctl_tcp_keepalive_probes = TCP_KEEPALIVE_PROBES;
29
int sysctl_tcp_keepalive_intvl = TCP_KEEPALIVE_INTVL;
30
int sysctl_tcp_retries1 = TCP_RETR1;
31
int sysctl_tcp_retries2 = TCP_RETR2;
32
int sysctl_tcp_orphan_retries;
33
 
34
static void tcp_write_timer(unsigned long);
35
static void tcp_delack_timer(unsigned long);
36
static void tcp_keepalive_timer (unsigned long data);
37
 
38
const char timer_bug_msg[] = KERN_DEBUG "tcpbug: unknown timer value\n";
39
 
40
/*
41
 * Using different timers for retransmit, delayed acks and probes
42
 * We may wish use just one timer maintaining a list of expire jiffies
43
 * to optimize.
44
 */
45
 
46
void tcp_init_xmit_timers(struct sock *sk)
47
{
48
        struct tcp_opt *tp = &sk->tp_pinfo.af_tcp;
49
 
50
        init_timer(&tp->retransmit_timer);
51
        tp->retransmit_timer.function=&tcp_write_timer;
52
        tp->retransmit_timer.data = (unsigned long) sk;
53
        tp->pending = 0;
54
 
55
        init_timer(&tp->delack_timer);
56
        tp->delack_timer.function=&tcp_delack_timer;
57
        tp->delack_timer.data = (unsigned long) sk;
58
        tp->ack.pending = 0;
59
 
60
        init_timer(&sk->timer);
61
        sk->timer.function=&tcp_keepalive_timer;
62
        sk->timer.data = (unsigned long) sk;
63
}
64
 
65
void tcp_clear_xmit_timers(struct sock *sk)
66
{
67
        struct tcp_opt *tp = &sk->tp_pinfo.af_tcp;
68
 
69
        tp->pending = 0;
70
        if (timer_pending(&tp->retransmit_timer) &&
71
            del_timer(&tp->retransmit_timer))
72
                __sock_put(sk);
73
 
74
        tp->ack.pending = 0;
75
        tp->ack.blocked = 0;
76
        if (timer_pending(&tp->delack_timer) &&
77
            del_timer(&tp->delack_timer))
78
                __sock_put(sk);
79
 
80
        if(timer_pending(&sk->timer) && del_timer(&sk->timer))
81
                __sock_put(sk);
82
}
83
 
84
static void tcp_write_err(struct sock *sk)
85
{
86
        sk->err = sk->err_soft ? : ETIMEDOUT;
87
        sk->error_report(sk);
88
 
89
        tcp_done(sk);
90
        NET_INC_STATS_BH(TCPAbortOnTimeout);
91
}
92
 
93
/* Do not allow orphaned sockets to eat all our resources.
94
 * This is direct violation of TCP specs, but it is required
95
 * to prevent DoS attacks. It is called when a retransmission timeout
96
 * or zero probe timeout occurs on orphaned socket.
97
 *
98
 * Criterium is still not confirmed experimentally and may change.
99
 * We kill the socket, if:
100
 * 1. If number of orphaned sockets exceeds an administratively configured
101
 *    limit.
102
 * 2. If we have strong memory pressure.
103
 */
104
static int tcp_out_of_resources(struct sock *sk, int do_reset)
105
{
106
        struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp);
107
        int orphans = atomic_read(&tcp_orphan_count);
108
 
109
        /* If peer does not open window for long time, or did not transmit
110
         * anything for long time, penalize it. */
111
        if ((s32)(tcp_time_stamp - tp->lsndtime) > 2*TCP_RTO_MAX || !do_reset)
112
                orphans <<= 1;
113
 
114
        /* If some dubious ICMP arrived, penalize even more. */
115
        if (sk->err_soft)
116
                orphans <<= 1;
117
 
118
        if (orphans >= sysctl_tcp_max_orphans ||
119
            (sk->wmem_queued > SOCK_MIN_SNDBUF &&
120
             atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2])) {
121
                if (net_ratelimit())
122
                        printk(KERN_INFO "Out of socket memory\n");
123
 
124
                /* Catch exceptional cases, when connection requires reset.
125
                 *      1. Last segment was sent recently. */
126
                if ((s32)(tcp_time_stamp - tp->lsndtime) <= TCP_TIMEWAIT_LEN ||
127
                    /*  2. Window is closed. */
128
                    (!tp->snd_wnd && !tp->packets_out))
129
                        do_reset = 1;
130
                if (do_reset)
131
                        tcp_send_active_reset(sk, GFP_ATOMIC);
132
                tcp_done(sk);
133
                NET_INC_STATS_BH(TCPAbortOnMemory);
134
                return 1;
135
        }
136
        return 0;
137
}
138
 
139
/* Calculate maximal number or retries on an orphaned socket. */
140
static int tcp_orphan_retries(struct sock *sk, int alive)
141
{
142
        int retries = sysctl_tcp_orphan_retries; /* May be zero. */
143
 
144
        /* We know from an ICMP that something is wrong. */
145
        if (sk->err_soft && !alive)
146
                retries = 0;
147
 
148
        /* However, if socket sent something recently, select some safe
149
         * number of retries. 8 corresponds to >100 seconds with minimal
150
         * RTO of 200msec. */
151
        if (retries == 0 && alive)
152
                retries = 8;
153
        return retries;
154
}
155
 
156
/* A write timeout has occurred. Process the after effects. */
157
static int tcp_write_timeout(struct sock *sk)
158
{
159
        struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp);
160
        int retry_until;
161
 
162
        if ((1<<sk->state)&(TCPF_SYN_SENT|TCPF_SYN_RECV)) {
163
                if (tp->retransmits)
164
                        dst_negative_advice(&sk->dst_cache);
165
                retry_until = tp->syn_retries ? : sysctl_tcp_syn_retries;
166
        } else {
167
                if (tp->retransmits >= sysctl_tcp_retries1) {
168
                        /* NOTE. draft-ietf-tcpimpl-pmtud-01.txt requires pmtu black
169
                           hole detection. :-(
170
 
171
                           It is place to make it. It is not made. I do not want
172
                           to make it. It is disguisting. It does not work in any
173
                           case. Let me to cite the same draft, which requires for
174
                           us to implement this:
175
 
176
   "The one security concern raised by this memo is that ICMP black holes
177
   are often caused by over-zealous security administrators who block
178
   all ICMP messages.  It is vitally important that those who design and
179
   deploy security systems understand the impact of strict filtering on
180
   upper-layer protocols.  The safest web site in the world is worthless
181
   if most TCP implementations cannot transfer data from it.  It would
182
   be far nicer to have all of the black holes fixed rather than fixing
183
   all of the TCP implementations."
184
 
185
                           Golden words :-).
186
                   */
187
 
188
                        dst_negative_advice(&sk->dst_cache);
189
                }
190
 
191
                retry_until = sysctl_tcp_retries2;
192
                if (sk->dead) {
193
                        int alive = (tp->rto < TCP_RTO_MAX);
194
 
195
                        retry_until = tcp_orphan_retries(sk, alive);
196
 
197
                        if (tcp_out_of_resources(sk, alive || tp->retransmits < retry_until))
198
                                return 1;
199
                }
200
        }
201
 
202
        if (tp->retransmits >= retry_until) {
203
                /* Has it gone just too far? */
204
                tcp_write_err(sk);
205
                return 1;
206
        }
207
        return 0;
208
}
209
 
210
static void tcp_delack_timer(unsigned long data)
211
{
212
        struct sock *sk = (struct sock*)data;
213
        struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp);
214
 
215
        bh_lock_sock(sk);
216
        if (sk->lock.users) {
217
                /* Try again later. */
218
                tp->ack.blocked = 1;
219
                NET_INC_STATS_BH(DelayedACKLocked);
220
                if (!mod_timer(&tp->delack_timer, jiffies + TCP_DELACK_MIN))
221
                        sock_hold(sk);
222
                goto out_unlock;
223
        }
224
 
225
        tcp_mem_reclaim(sk);
226
 
227
        if (sk->state == TCP_CLOSE || !(tp->ack.pending&TCP_ACK_TIMER))
228
                goto out;
229
 
230
        if ((long)(tp->ack.timeout - jiffies) > 0) {
231
                if (!mod_timer(&tp->delack_timer, tp->ack.timeout))
232
                        sock_hold(sk);
233
                goto out;
234
        }
235
        tp->ack.pending &= ~TCP_ACK_TIMER;
236
 
237
        if (skb_queue_len(&tp->ucopy.prequeue)) {
238
                struct sk_buff *skb;
239
 
240
                net_statistics[smp_processor_id()*2].TCPSchedulerFailed += skb_queue_len(&tp->ucopy.prequeue);
241
 
242
                while ((skb = __skb_dequeue(&tp->ucopy.prequeue)) != NULL)
243
                        sk->backlog_rcv(sk, skb);
244
 
245
                tp->ucopy.memory = 0;
246
        }
247
 
248
        if (tcp_ack_scheduled(tp)) {
249
                if (!tp->ack.pingpong) {
250
                        /* Delayed ACK missed: inflate ATO. */
251
                        tp->ack.ato = min(tp->ack.ato << 1, tp->rto);
252
                } else {
253
                        /* Delayed ACK missed: leave pingpong mode and
254
                         * deflate ATO.
255
                         */
256
                        tp->ack.pingpong = 0;
257
                        tp->ack.ato = TCP_ATO_MIN;
258
                }
259
                tcp_send_ack(sk);
260
                NET_INC_STATS_BH(DelayedACKs);
261
        }
262
        TCP_CHECK_TIMER(sk);
263
 
264
out:
265
        if (tcp_memory_pressure)
266
                tcp_mem_reclaim(sk);
267
out_unlock:
268
        bh_unlock_sock(sk);
269
        sock_put(sk);
270
}
271
 
272
static void tcp_probe_timer(struct sock *sk)
273
{
274
        struct tcp_opt *tp = &sk->tp_pinfo.af_tcp;
275
        int max_probes;
276
 
277
        if (tp->packets_out || !tp->send_head) {
278
                tp->probes_out = 0;
279
                return;
280
        }
281
 
282
        /* *WARNING* RFC 1122 forbids this
283
         *
284
         * It doesn't AFAIK, because we kill the retransmit timer -AK
285
         *
286
         * FIXME: We ought not to do it, Solaris 2.5 actually has fixing
287
         * this behaviour in Solaris down as a bug fix. [AC]
288
         *
289
         * Let me to explain. probes_out is zeroed by incoming ACKs
290
         * even if they advertise zero window. Hence, connection is killed only
291
         * if we received no ACKs for normal connection timeout. It is not killed
292
         * only because window stays zero for some time, window may be zero
293
         * until armageddon and even later. We are in full accordance
294
         * with RFCs, only probe timer combines both retransmission timeout
295
         * and probe timeout in one bottle.                             --ANK
296
         */
297
        max_probes = sysctl_tcp_retries2;
298
 
299
        if (sk->dead) {
300
                int alive = ((tp->rto<<tp->backoff) < TCP_RTO_MAX);
301
 
302
                max_probes = tcp_orphan_retries(sk, alive);
303
 
304
                if (tcp_out_of_resources(sk, alive || tp->probes_out <= max_probes))
305
                        return;
306
        }
307
 
308
        if (tp->probes_out > max_probes) {
309
                tcp_write_err(sk);
310
        } else {
311
                /* Only send another probe if we didn't close things up. */
312
                tcp_send_probe0(sk);
313
        }
314
}
315
 
316
/*
317
 *      The TCP retransmit timer.
318
 */
319
 
320
static void tcp_retransmit_timer(struct sock *sk)
321
{
322
        struct tcp_opt *tp = &sk->tp_pinfo.af_tcp;
323
 
324
        if (tp->packets_out == 0)
325
                goto out;
326
 
327
        BUG_TRAP(!skb_queue_empty(&sk->write_queue));
328
 
329
        if (tp->snd_wnd == 0 && !sk->dead &&
330
            !((1<<sk->state)&(TCPF_SYN_SENT|TCPF_SYN_RECV))) {
331
                /* Receiver dastardly shrinks window. Our retransmits
332
                 * become zero probes, but we should not timeout this
333
                 * connection. If the socket is an orphan, time it out,
334
                 * we cannot allow such beasts to hang infinitely.
335
                 */
336
#ifdef TCP_DEBUG
337
                if (net_ratelimit())
338
                        printk(KERN_DEBUG "TCP: Treason uncloaked! Peer %u.%u.%u.%u:%u/%u shrinks window %u:%u. Repaired.\n",
339
                               NIPQUAD(sk->daddr), htons(sk->dport), sk->num,
340
                               tp->snd_una, tp->snd_nxt);
341
#endif
342
                if (tcp_time_stamp - tp->rcv_tstamp > TCP_RTO_MAX) {
343
                        tcp_write_err(sk);
344
                        goto out;
345
                }
346
                tcp_enter_loss(sk, 0);
347
                tcp_retransmit_skb(sk, skb_peek(&sk->write_queue));
348
                __sk_dst_reset(sk);
349
                goto out_reset_timer;
350
        }
351
 
352
        if (tcp_write_timeout(sk))
353
                goto out;
354
 
355
        if (tp->retransmits == 0) {
356
                if (tp->ca_state == TCP_CA_Disorder || tp->ca_state == TCP_CA_Recovery) {
357
                        if (tp->sack_ok) {
358
                                if (tp->ca_state == TCP_CA_Recovery)
359
                                        NET_INC_STATS_BH(TCPSackRecoveryFail);
360
                                else
361
                                        NET_INC_STATS_BH(TCPSackFailures);
362
                        } else {
363
                                if (tp->ca_state == TCP_CA_Recovery)
364
                                        NET_INC_STATS_BH(TCPRenoRecoveryFail);
365
                                else
366
                                        NET_INC_STATS_BH(TCPRenoFailures);
367
                        }
368
                } else if (tp->ca_state == TCP_CA_Loss) {
369
                        NET_INC_STATS_BH(TCPLossFailures);
370
                } else {
371
                        NET_INC_STATS_BH(TCPTimeouts);
372
                }
373
        }
374
 
375
        if (tcp_use_frto(sk)) {
376
                tcp_enter_frto(sk);
377
        } else {
378
                tcp_enter_loss(sk, 0);
379
        }
380
 
381
        if (tcp_retransmit_skb(sk, skb_peek(&sk->write_queue)) > 0) {
382
                /* Retransmission failed because of local congestion,
383
                 * do not backoff.
384
                 */
385
                if (!tp->retransmits)
386
                        tp->retransmits=1;
387
                tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS,
388
                                     min(tp->rto, TCP_RESOURCE_PROBE_INTERVAL));
389
                goto out;
390
        }
391
 
392
        /* Increase the timeout each time we retransmit.  Note that
393
         * we do not increase the rtt estimate.  rto is initialized
394
         * from rtt, but increases here.  Jacobson (SIGCOMM 88) suggests
395
         * that doubling rto each time is the least we can get away with.
396
         * In KA9Q, Karn uses this for the first few times, and then
397
         * goes to quadratic.  netBSD doubles, but only goes up to *64,
398
         * and clamps at 1 to 64 sec afterwards.  Note that 120 sec is
399
         * defined in the protocol as the maximum possible RTT.  I guess
400
         * we'll have to use something other than TCP to talk to the
401
         * University of Mars.
402
         *
403
         * PAWS allows us longer timeouts and large windows, so once
404
         * implemented ftp to mars will work nicely. We will have to fix
405
         * the 120 second clamps though!
406
         */
407
        tp->backoff++;
408
        tp->retransmits++;
409
 
410
out_reset_timer:
411
        tp->rto = min(tp->rto << 1, TCP_RTO_MAX);
412
        tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, tp->rto);
413
        if (tp->retransmits > sysctl_tcp_retries1)
414
                __sk_dst_reset(sk);
415
 
416
out:;
417
}
418
 
419
static void tcp_write_timer(unsigned long data)
420
{
421
        struct sock *sk = (struct sock*)data;
422
        struct tcp_opt *tp = &sk->tp_pinfo.af_tcp;
423
        int event;
424
 
425
        bh_lock_sock(sk);
426
        if (sk->lock.users) {
427
                /* Try again later */
428
                if (!mod_timer(&tp->retransmit_timer, jiffies + (HZ/20)))
429
                        sock_hold(sk);
430
                goto out_unlock;
431
        }
432
 
433
        if (sk->state == TCP_CLOSE || !tp->pending)
434
                goto out;
435
 
436
        if ((long)(tp->timeout - jiffies) > 0) {
437
                if (!mod_timer(&tp->retransmit_timer, tp->timeout))
438
                        sock_hold(sk);
439
                goto out;
440
        }
441
 
442
        event = tp->pending;
443
        tp->pending = 0;
444
 
445
        switch (event) {
446
        case TCP_TIME_RETRANS:
447
                tcp_retransmit_timer(sk);
448
                break;
449
        case TCP_TIME_PROBE0:
450
                tcp_probe_timer(sk);
451
                break;
452
        }
453
        TCP_CHECK_TIMER(sk);
454
 
455
out:
456
        tcp_mem_reclaim(sk);
457
out_unlock:
458
        bh_unlock_sock(sk);
459
        sock_put(sk);
460
}
461
 
462
/*
463
 *      Timer for listening sockets
464
 */
465
 
466
static void tcp_synack_timer(struct sock *sk)
467
{
468
        struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp);
469
        struct tcp_listen_opt *lopt = tp->listen_opt;
470
        int max_retries = tp->syn_retries ? : sysctl_tcp_synack_retries;
471
        int thresh = max_retries;
472
        unsigned long now = jiffies;
473
        struct open_request **reqp, *req;
474
        int i, budget;
475
 
476
        if (lopt == NULL || lopt->qlen == 0)
477
                return;
478
 
479
        /* Normally all the openreqs are young and become mature
480
         * (i.e. converted to established socket) for first timeout.
481
         * If synack was not acknowledged for 3 seconds, it means
482
         * one of the following things: synack was lost, ack was lost,
483
         * rtt is high or nobody planned to ack (i.e. synflood).
484
         * When server is a bit loaded, queue is populated with old
485
         * open requests, reducing effective size of queue.
486
         * When server is well loaded, queue size reduces to zero
487
         * after several minutes of work. It is not synflood,
488
         * it is normal operation. The solution is pruning
489
         * too old entries overriding normal timeout, when
490
         * situation becomes dangerous.
491
         *
492
         * Essentially, we reserve half of room for young
493
         * embrions; and abort old ones without pity, if old
494
         * ones are about to clog our table.
495
         */
496
        if (lopt->qlen>>(lopt->max_qlen_log-1)) {
497
                int young = (lopt->qlen_young<<1);
498
 
499
                while (thresh > 2) {
500
                        if (lopt->qlen < young)
501
                                break;
502
                        thresh--;
503
                        young <<= 1;
504
                }
505
        }
506
 
507
        if (tp->defer_accept)
508
                max_retries = tp->defer_accept;
509
 
510
        budget = 2*(TCP_SYNQ_HSIZE/(TCP_TIMEOUT_INIT/TCP_SYNQ_INTERVAL));
511
        i = lopt->clock_hand;
512
 
513
        do {
514
                reqp=&lopt->syn_table[i];
515
                while ((req = *reqp) != NULL) {
516
                        if ((long)(now - req->expires) >= 0) {
517
                                if ((req->retrans < thresh ||
518
                                     (req->acked && req->retrans < max_retries))
519
                                    && !req->class->rtx_syn_ack(sk, req, NULL)) {
520
                                        unsigned long timeo;
521
 
522
                                        if (req->retrans++ == 0)
523
                                                lopt->qlen_young--;
524
                                        timeo = min((TCP_TIMEOUT_INIT << req->retrans),
525
                                                    TCP_RTO_MAX);
526
                                        req->expires = now + timeo;
527
                                        reqp = &req->dl_next;
528
                                        continue;
529
                                }
530
 
531
                                /* Drop this request */
532
                                write_lock(&tp->syn_wait_lock);
533
                                *reqp = req->dl_next;
534
                                write_unlock(&tp->syn_wait_lock);
535
                                lopt->qlen--;
536
                                if (req->retrans == 0)
537
                                        lopt->qlen_young--;
538
                                tcp_openreq_free(req);
539
                                continue;
540
                        }
541
                        reqp = &req->dl_next;
542
                }
543
 
544
                i = (i+1)&(TCP_SYNQ_HSIZE-1);
545
 
546
        } while (--budget > 0);
547
 
548
        lopt->clock_hand = i;
549
 
550
        if (lopt->qlen)
551
                tcp_reset_keepalive_timer(sk, TCP_SYNQ_INTERVAL);
552
}
553
 
554
void tcp_delete_keepalive_timer (struct sock *sk)
555
{
556
        if (timer_pending(&sk->timer) && del_timer (&sk->timer))
557
                __sock_put(sk);
558
}
559
 
560
void tcp_reset_keepalive_timer (struct sock *sk, unsigned long len)
561
{
562
        if (!mod_timer(&sk->timer, jiffies+len))
563
                sock_hold(sk);
564
}
565
 
566
void tcp_set_keepalive(struct sock *sk, int val)
567
{
568
        if ((1<<sk->state)&(TCPF_CLOSE|TCPF_LISTEN))
569
                return;
570
 
571
        if (val && !sk->keepopen)
572
                tcp_reset_keepalive_timer(sk, keepalive_time_when(&sk->tp_pinfo.af_tcp));
573
        else if (!val)
574
                tcp_delete_keepalive_timer(sk);
575
}
576
 
577
 
578
static void tcp_keepalive_timer (unsigned long data)
579
{
580
        struct sock *sk = (struct sock *) data;
581
        struct tcp_opt *tp = &sk->tp_pinfo.af_tcp;
582
        __u32 elapsed;
583
 
584
        /* Only process if socket is not in use. */
585
        bh_lock_sock(sk);
586
        if (sk->lock.users) {
587
                /* Try again later. */
588
                tcp_reset_keepalive_timer (sk, HZ/20);
589
                goto out;
590
        }
591
 
592
        if (sk->state == TCP_LISTEN) {
593
                tcp_synack_timer(sk);
594
                goto out;
595
        }
596
 
597
        if (sk->state == TCP_FIN_WAIT2 && sk->dead) {
598
                if (tp->linger2 >= 0) {
599
                        int tmo = tcp_fin_time(tp) - TCP_TIMEWAIT_LEN;
600
 
601
                        if (tmo > 0) {
602
                                tcp_time_wait(sk, TCP_FIN_WAIT2, tmo);
603
                                goto out;
604
                        }
605
                }
606
                tcp_send_active_reset(sk, GFP_ATOMIC);
607
                goto death;
608
        }
609
 
610
        if (!sk->keepopen || sk->state == TCP_CLOSE)
611
                goto out;
612
 
613
        elapsed = keepalive_time_when(tp);
614
 
615
        /* It is alive without keepalive 8) */
616
        if (tp->packets_out || tp->send_head)
617
                goto resched;
618
 
619
        elapsed = tcp_time_stamp - tp->rcv_tstamp;
620
 
621
        if (elapsed >= keepalive_time_when(tp)) {
622
                if ((!tp->keepalive_probes && tp->probes_out >= sysctl_tcp_keepalive_probes) ||
623
                     (tp->keepalive_probes && tp->probes_out >= tp->keepalive_probes)) {
624
                        tcp_send_active_reset(sk, GFP_ATOMIC);
625
                        tcp_write_err(sk);
626
                        goto out;
627
                }
628
                if (tcp_write_wakeup(sk) <= 0) {
629
                        tp->probes_out++;
630
                        elapsed = keepalive_intvl_when(tp);
631
                } else {
632
                        /* If keepalive was lost due to local congestion,
633
                         * try harder.
634
                         */
635
                        elapsed = TCP_RESOURCE_PROBE_INTERVAL;
636
                }
637
        } else {
638
                /* It is tp->rcv_tstamp + keepalive_time_when(tp) */
639
                elapsed = keepalive_time_when(tp) - elapsed;
640
        }
641
 
642
        TCP_CHECK_TIMER(sk);
643
        tcp_mem_reclaim(sk);
644
 
645
resched:
646
        tcp_reset_keepalive_timer (sk, elapsed);
647
        goto out;
648
 
649
death:
650
        tcp_done(sk);
651
 
652
out:
653
        bh_unlock_sock(sk);
654
        sock_put(sk);
655
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.