summaryrefslogblamecommitdiffstats
path: root/net/netrom/nr_timer.c
blob: 1cb98e88f5e1cef557699464d6d9519ac14c9a85 (plain) (tree)























                                                                       
                           
















                                               



                                                                            


















































































                                                                               
                                           
                                              





















































































































                                                                            
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
 * Copyright (C) 2002 Ralf Baechle DO1GRB (ralf@gnu.org)
 */
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/socket.h>
#include <linux/in.h>
#include <linux/kernel.h>
#include <linux/jiffies.h>
#include <linux/timer.h>
#include <linux/string.h>
#include <linux/sockios.h>
#include <linux/net.h>
#include <net/ax25.h>
#include <linux/inet.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <net/sock.h>
#include <net/tcp_states.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include <linux/fcntl.h>
#include <linux/mm.h>
#include <linux/interrupt.h>
#include <net/netrom.h>

static void nr_heartbeat_expiry(unsigned long);
static void nr_t1timer_expiry(unsigned long);
static void nr_t2timer_expiry(unsigned long);
static void nr_t4timer_expiry(unsigned long);
static void nr_idletimer_expiry(unsigned long);

void nr_init_timers(struct sock *sk)
{
	struct nr_sock *nr = nr_sk(sk);

	setup_timer(&nr->t1timer, nr_t1timer_expiry, (unsigned long)sk);
	setup_timer(&nr->t2timer, nr_t2timer_expiry, (unsigned long)sk);
	setup_timer(&nr->t4timer, nr_t4timer_expiry, (unsigned long)sk);
	setup_timer(&nr->idletimer, nr_idletimer_expiry, (unsigned long)sk);

	/* initialized by sock_init_data */
	sk->sk_timer.data     = (unsigned long)sk;
	sk->sk_timer.function = &nr_heartbeat_expiry;
}

void nr_start_t1timer(struct sock *sk)
{
	struct nr_sock *nr = nr_sk(sk);

	mod_timer(&nr->t1timer, jiffies + nr->t1);
}

void nr_start_t2timer(struct sock *sk)
{
	struct nr_sock *nr = nr_sk(sk);

	mod_timer(&nr->t2timer, jiffies + nr->t2);
}

void nr_start_t4timer(struct sock *sk)
{
	struct nr_sock *nr = nr_sk(sk);

	mod_timer(&nr->t4timer, jiffies + nr->t4);
}

void nr_start_idletimer(struct sock *sk)
{
	struct nr_sock *nr = nr_sk(sk);

	if (nr->idle > 0)
		mod_timer(&nr->idletimer, jiffies + nr->idle);
}

void nr_start_heartbeat(struct sock *sk)
{
	mod_timer(&sk->sk_timer, jiffies + 5 * HZ);
}

void nr_stop_t1timer(struct sock *sk)
{
	del_timer(&nr_sk(sk)->t1timer);
}

void nr_stop_t2timer(struct sock *sk)
{
	del_timer(&nr_sk(sk)->t2timer);
}

void nr_stop_t4timer(struct sock *sk)
{
	del_timer(&nr_sk(sk)->t4timer);
}

void nr_stop_idletimer(struct sock *sk)
{
	del_timer(&nr_sk(sk)->idletimer);
}

void nr_stop_heartbeat(struct sock *sk)
{
	del_timer(&sk->sk_timer);
}

int nr_t1timer_running(struct sock *sk)
{
	return timer_pending(&nr_sk(sk)->t1timer);
}

static void nr_heartbeat_expiry(unsigned long param)
{
	struct sock *sk = (struct sock *)param;
	struct nr_sock *nr = nr_sk(sk);

	bh_lock_sock(sk);
	switch (nr->state) {
	case NR_STATE_0:
		/* Magic here: If we listen() and a new link dies before it
		   is accepted() it isn't 'dead' so doesn't get removed. */
		if (sock_flag(sk, SOCK_DESTROY) ||
		    (sk->sk_state == TCP_LISTEN && sock_flag(sk, SOCK_DEAD))) {
			sock_hold(sk);
			bh_unlock_sock(sk);
			nr_destroy_socket(sk);
			sock_put(sk);
			return;
		}
		break;

	case NR_STATE_3:
		/*
		 * Check for the state of the receive buffer.
		 */
		if (atomic_read(&sk->sk_rmem_alloc) < (sk->sk_rcvbuf / 2) &&
		    (nr->condition & NR_COND_OWN_RX_BUSY)) {
			nr->condition &= ~NR_COND_OWN_RX_BUSY;
			nr->condition &= ~NR_COND_ACK_PENDING;
			nr->vl         = nr->vr;
			nr_write_internal(sk, NR_INFOACK);
			break;
		}
		break;
	}

	nr_start_heartbeat(sk);
	bh_unlock_sock(sk);
}

static void nr_t2timer_expiry(unsigned long param)
{
	struct sock *sk = (struct sock *)param;
	struct nr_sock *nr = nr_sk(sk);

	bh_lock_sock(sk);
	if (nr->condition & NR_COND_ACK_PENDING) {
		nr->condition &= ~NR_COND_ACK_PENDING;
		nr_enquiry_response(sk);
	}
	bh_unlock_sock(sk);
}

static void nr_t4timer_expiry(unsigned long param)
{
	struct sock *sk = (struct sock *)param;

	bh_lock_sock(sk);
	nr_sk(sk)->condition &= ~NR_COND_PEER_RX_BUSY;
	bh_unlock_sock(sk);
}

static void nr_idletimer_expiry(unsigned long param)
{
	struct sock *sk = (struct sock *)param;
	struct nr_sock *nr = nr_sk(sk);

	bh_lock_sock(sk);

	nr_clear_queues(sk);

	nr->n2count = 0;
	nr_write_internal(sk, NR_DISCREQ);
	nr->state = NR_STATE_2;

	nr_start_t1timer(sk);
	nr_stop_t2timer(sk);
	nr_stop_t4timer(sk);

	sk->sk_state     = TCP_CLOSE;
	sk->sk_err       = 0;
	sk->sk_shutdown |= SEND_SHUTDOWN;

	if (!sock_flag(sk, SOCK_DEAD)) {
		sk->sk_state_change(sk);
		sock_set_flag(sk, SOCK_DEAD);
	}
	bh_unlock_sock(sk);
}

static void nr_t1timer_expiry(unsigned long param)
{
	struct sock *sk = (struct sock *)param;
	struct nr_sock *nr = nr_sk(sk);

	bh_lock_sock(sk);
	switch (nr->state) {
	case NR_STATE_1:
		if (nr->n2count == nr->n2) {
			nr_disconnect(sk, ETIMEDOUT);
			bh_unlock_sock(sk);
			return;
		} else {
			nr->n2count++;
			nr_write_internal(sk, NR_CONNREQ);
		}
		break;

	case NR_STATE_2:
		if (nr->n2count == nr->n2) {
			nr_disconnect(sk, ETIMEDOUT);
			bh_unlock_sock(sk);
			return;
		} else {
			nr->n2count++;
			nr_write_internal(sk, NR_DISCREQ);
		}
		break;

	case NR_STATE_3:
		if (nr->n2count == nr->n2) {
			nr_disconnect(sk, ETIMEDOUT);
			bh_unlock_sock(sk);
			return;
		} else {
			nr->n2count++;
			nr_requeue_frames(sk);
		}
		break;
	}

	nr_start_t1timer(sk);
	bh_unlock_sock(sk);
}
vious revision' href='/openslx/kernel-qcow2-linux.git/blame/mm/mmap.c?id=64fd1de3d821659ac0a3004fd5ee1de59e64af30'>^
1da177e4c3f4
8764b338b375 ^
1da177e4c3f4

a5b4592cf77b ^
128557ffe147 ^
897ab3e0c49e ^
1da177e4c3f4
dc0ef0df7b6a ^

1da177e4c3f4
a5b4592cf77b ^
5520e8948525 ^




4471a675dfc7 ^
5520e8948525 ^


a5b4592cf77b ^



1da177e4c3f4
1e624196f43c ^






8764b338b375 ^

1e624196f43c ^

1da177e4c3f4






897ab3e0c49e ^
1da177e4c3f4



1da177e4c3f4




897ab3e0c49e ^
1da177e4c3f4
128557ffe147 ^
1da177e4c3f4

128557ffe147 ^

897ab3e0c49e ^
128557ffe147 ^



1da177e4c3f4





d37371870ceb ^




















ed8ea8150182 ^
acf128d048c7 ^
1da177e4c3f4
acf128d048c7 ^
5a0768f641a5 ^
1da177e4c3f4





5a0768f641a5 ^
ff26f70f4323 ^

5a0768f641a5 ^


ff26f70f4323 ^

5a0768f641a5 ^


ff26f70f4323 ^

5a0768f641a5 ^

acf128d048c7 ^
5a0768f641a5 ^
8542bdfc6632 ^
5a0768f641a5 ^



acf128d048c7 ^
1da177e4c3f4

d1af65d13f36 ^

1da177e4c3f4

5a0768f641a5 ^
1da177e4c3f4
5a0768f641a5 ^
8542bdfc6632 ^
5a0768f641a5 ^
1da177e4c3f4
5a0768f641a5 ^
1da177e4c3f4

d37371870ceb ^






96dad67ff244 ^


1da177e4c3f4
1da177e4c3f4

eafd4dc4d76a ^
1da177e4c3f4


5a0768f641a5 ^
ed8ea8150182 ^
ff26f70f4323 ^
ed8ea8150182 ^
12352d3cae2c ^
ed8ea8150182 ^
ff26f70f4323 ^
12352d3cae2c ^






5a0768f641a5 ^
ed8ea8150182 ^
1da177e4c3f4

5a0768f641a5 ^
8542bdfc6632 ^
5a0768f641a5 ^


8542bdfc6632 ^
ff26f70f4323 ^
5a0768f641a5 ^

acf128d048c7 ^
5a0768f641a5 ^
ff26f70f4323 ^

5a0768f641a5 ^

96dad67ff244 ^
1da177e4c3f4

d37371870ceb ^
1da177e4c3f4


d37371870ceb ^

























8f26e0b176f3 ^
d37371870ceb ^

d37371870ceb ^






8f26e0b176f3 ^

























bf181b9f9d8d ^































6597d783397a ^


1da177e4c3f4
6597d783397a ^
1da177e4c3f4


1da177e4c3f4







6597d783397a ^


1da177e4c3f4











6597d783397a ^
1da177e4c3f4

e8420a8ece80 ^



























1da177e4c3f4


d37371870ceb ^














1da177e4c3f4
d37371870ceb ^


1da177e4c3f4

cb8f488c3353 ^
1da177e4c3f4
48aae42556e5 ^
1da177e4c3f4





496ad9aa8ef4 ^
1da177e4c3f4
4bb5f5d9395b ^
1da177e4c3f4

27ba0644ea9d ^
1da177e4c3f4










1da177e4c3f4







64ac4940d557 ^
1da177e4c3f4
83cde9e8ba95 ^
64ac4940d557 ^
1da177e4c3f4



1da177e4c3f4
83cde9e8ba95 ^
1da177e4c3f4





88f6b4c32e53 ^
6b2dbba8b6ac ^
1da177e4c3f4
48aae42556e5 ^
1da177e4c3f4
6597d783397a ^
48aae42556e5 ^
1da177e4c3f4
6597d783397a ^


1da177e4c3f4



e86f15ee64d8 ^


8f26e0b176f3 ^

1da177e4c3f4
d37371870ceb ^
297c5eee3724 ^
8f26e0b176f3 ^
e86f15ee64d8 ^









297c5eee3724 ^

615d6e8756c8 ^


1da177e4c3f4

e86f15ee64d8 ^



8f26e0b176f3 ^
e86f15ee64d8 ^

1da177e4c3f4






e86f15ee64d8 ^


1da177e4c3f4

e86f15ee64d8 ^
1da177e4c3f4
6b2dbba8b6ac ^
012f18004da3 ^
1da177e4c3f4
d37371870ceb ^
1da177e4c3f4



734537c9cb72 ^
287d97ac0321 ^
1da177e4c3f4



86d12e471d9f ^
e86f15ee64d8 ^
1da177e4c3f4
e86f15ee64d8 ^




























287d97ac0321 ^
1da177e4c3f4
734537c9cb72 ^




97a42cd43981 ^
734537c9cb72 ^

1da177e4c3f4





287d97ac0321 ^
1da177e4c3f4
e86f15ee64d8 ^
1da177e4c3f4





cc71aba34890 ^
287d97ac0321 ^
1da177e4c3f4
e86f15ee64d8 ^
1da177e4c3f4
1da177e4c3f4
5beb49305251 ^




287d97ac0321 ^
c4ea95d7cd08 ^

b800c91a0517 ^
c4ea95d7cd08 ^
3fe89b3e2a7b ^
c4ea95d7cd08 ^
5beb49305251 ^

734537c9cb72 ^
e86f15ee64d8 ^
37f9f5595c26 ^
1da177e4c3f4

27ba0644ea9d ^

682968e0c425 ^
27ba0644ea9d ^

682968e0c425 ^
83cde9e8ba95 ^
1da177e4c3f4
1da177e4c3f4
6b2dbba8b6ac ^
1da177e4c3f4







bf181b9f9d8d ^



e86f15ee64d8 ^

4fc3f1d66b1e ^
bf181b9f9d8d ^



012f18004da3 ^
1da177e4c3f4

6b2dbba8b6ac ^
1da177e4c3f4
6b2dbba8b6ac ^
1da177e4c3f4

d37371870ceb ^







1da177e4c3f4







6b2dbba8b6ac ^

1da177e4c3f4







e86f15ee64d8 ^


8f26e0b176f3 ^









1da177e4c3f4

1da177e4c3f4






d37371870ceb ^








1da177e4c3f4

bf181b9f9d8d ^



08b52706d505 ^
bf181b9f9d8d ^
1da177e4c3f4
83cde9e8ba95 ^
1da177e4c3f4
2b1444983508 ^
7b2d81d48a2d ^
2b1444983508 ^

7b2d81d48a2d ^
2b1444983508 ^

1da177e4c3f4
925d1c401fa6 ^
cbc91f71b51b ^
1da177e4c3f4
925d1c401fa6 ^
5beb49305251 ^

1da177e4c3f4
3964acd0dbec ^
1da177e4c3f4





e86f15ee64d8 ^




















734537c9cb72 ^


1da177e4c3f4
734537c9cb72 ^
d37371870ceb ^

fb8c41e9ad1f ^





















1da177e4c3f4
2b1444983508 ^
7b2d81d48a2d ^
1da177e4c3f4

5beb49305251 ^

1da177e4c3f4





1da177e4c3f4
19a809afe2fe ^

1da177e4c3f4
34228d473efe ^








1da177e4c3f4




19a809afe2fe ^

1da177e4c3f4



965f55dea0e3 ^

1da177e4c3f4
965f55dea0e3 ^







1da177e4c3f4














19a809afe2fe ^


1da177e4c3f4
19a809afe2fe ^
965f55dea0e3 ^
1da177e4c3f4














19a809afe2fe ^


1da177e4c3f4
19a809afe2fe ^
965f55dea0e3 ^
1da177e4c3f4
d6e932177090 ^
1da177e4c3f4


























e86f15ee64d8 ^
1da177e4c3f4



e86f15ee64d8 ^












1da177e4c3f4



cc71aba34890 ^
19a809afe2fe ^

1da177e4c3f4


5beb49305251 ^
1da177e4c3f4












e86f15ee64d8 ^
1da177e4c3f4

e86f15ee64d8 ^




1da177e4c3f4



cc71aba34890 ^
1da177e4c3f4
19a809afe2fe ^

1da177e4c3f4





19a809afe2fe ^


1da177e4c3f4
965f55dea0e3 ^
1da177e4c3f4
e86f15ee64d8 ^


1da177e4c3f4
e86f15ee64d8 ^

5beb49305251 ^

6d50e60cd2ed ^
1da177e4c3f4






cc71aba34890 ^
1da177e4c3f4
19a809afe2fe ^

1da177e4c3f4
e86f15ee64d8 ^











5beb49305251 ^

6d50e60cd2ed ^
1da177e4c3f4






d0e9fe1758f2 ^
















34228d473efe ^
d0e9fe1758f2 ^













4db0c3c2983c ^
d0e9fe1758f2 ^












4db0c3c2983c ^
d0e9fe1758f2 ^







1da177e4c3f4








d0e9fe1758f2 ^
1da177e4c3f4
1da177e4c3f4




d0e9fe1758f2 ^


1da177e4c3f4
9be34c9d526c ^
1da177e4c3f4


d0e9fe1758f2 ^


1da177e4c3f4











1da177e4c3f4
404015308747 ^











363ee17f0f40 ^

















404015308747 ^
27f5de7963f4 ^
1da177e4c3f4
1fcfd8db7f82 ^
1da177e4c3f4
1fcfd8db7f82 ^
897ab3e0c49e ^

1da177e4c3f4
cc71aba34890 ^
62b5f7d013fc ^
1da177e4c3f4
41badc15cbad ^
bebeb3d68b24 ^
e37609bb36f7 ^


1da177e4c3f4






90f8572b0f02 ^
1da177e4c3f4

7cd94146cd50 ^


1da177e4c3f4

9206de95b1ea ^
1da177e4c3f4



cc71aba34890 ^
1da177e4c3f4








de1741a1333e ^
1da177e4c3f4

62b5f7d013fc ^





1da177e4c3f4



62b5f7d013fc ^
1da177e4c3f4

cdf7b3418ad5 ^
1da177e4c3f4

ba470de43188 ^
363ee17f0f40 ^

1da177e4c3f4
1da177e4c3f4
077bf22b5cf2 ^

1da177e4c3f4














d7a06983a01a ^
1da177e4c3f4









90f8572b0f02 ^
80c5606c3b45 ^



80c5606c3b45 ^
72c2d5319200 ^
80c5606c3b45 ^
b2c56e4f7d93 ^

1da177e4c3f4







b2c56e4f7d93 ^

ce36394269cc ^



1da177e4c3f4












c22c0d6344c3 ^













897ab3e0c49e ^
09a9f1d27892 ^


41badc15cbad ^
bebeb3d68b24 ^
0165ab443556 ^
6be5ceb02e98 ^
66f0dc481e5b ^




1e3ee14b9355 ^
66f0dc481e5b ^

120a795da07c ^
66f0dc481e5b ^

1e3ee14b9355 ^
af73e4d9506d ^

493af578040e ^


66f0dc481e5b ^

c103a4dc4a32 ^
af73e4d9506d ^
20ac28933c49 ^
091d0d55b286 ^



66f0dc481e5b ^





af73e4d9506d ^
42d7395feb56 ^


66f0dc481e5b ^





9fbeb5ab59a2 ^
493af578040e ^
66f0dc481e5b ^

66f0dc481e5b ^


a4679373cf4e ^















de1741a1333e ^
a4679373cf4e ^






4e950f6f0189 ^





6d2329f8872f ^
4e950f6f0189 ^
ca16d140af91 ^
8a04446ab0cf ^
4e950f6f0189 ^





8a04446ab0cf ^
4e950f6f0189 ^

64e455079e1b ^

6d2329f8872f ^

4e950f6f0189 ^

64e455079e1b ^



4e950f6f0189 ^
4b6e1e37026e ^
4e950f6f0189 ^






fc8744adc870 ^

5a6fe1259506 ^
fc8744adc870 ^
ca16d140af91 ^
fc8744adc870 ^
5a6fe1259506 ^






fc8744adc870 ^


0165ab443556 ^
897ab3e0c49e ^

0165ab443556 ^


0165ab443556 ^


0165ab443556 ^
e8420a8ece80 ^
84638335900f ^
e8420a8ece80 ^





e8420a8ece80 ^

84638335900f ^

e8420a8ece80 ^


1da177e4c3f4
9fcd145717e6 ^

897ab3e0c49e ^
1da177e4c3f4
1da177e4c3f4

fc8744adc870 ^
fc8744adc870 ^

5a6fe1259506 ^
fc8744adc870 ^
191c542442fd ^
fc8744adc870 ^

1da177e4c3f4


de33c8db5910 ^
1da177e4c3f4
19a809afe2fe ^

de33c8db5910 ^

1da177e4c3f4





c5e3b83e97be ^
1da177e4c3f4



1da177e4c3f4




3ed75eb8f1cd ^
1da177e4c3f4
5beb49305251 ^
1da177e4c3f4

1da177e4c3f4



1da177e4c3f4
4bb5f5d9395b ^










cb0942b81249 ^
f74ac01520c9 ^
1da177e4c3f4

f8dbf0a7a4c5 ^




2897b4d29d9f ^

f8dbf0a7a4c5 ^
2897b4d29d9f ^

f8dbf0a7a4c5 ^
f8dbf0a7a4c5 ^
1da177e4c3f4





de33c8db5910 ^
4d3d5b41a72b ^
4bb5f5d9395b ^





e86867720e61 ^
4d3d5b41a72b ^
cdd6c482c9ff ^
0a4a93919bdc ^
84638335900f ^
1da177e4c3f4
bebeb3d68b24 ^

06f9d8c2b500 ^
bebeb3d68b24 ^
de60f5f10c58 ^
bebeb3d68b24 ^
2b1444983508 ^
c7a3a88c938f ^

2b1444983508 ^
d9104d1ca966 ^