Blame view

net/decnet/dn_timer.c 3.09 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  // SPDX-License-Identifier: GPL-2.0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  /*
   * DECnet       An implementation of the DECnet protocol suite for the LINUX
   *              operating system.  DECnet is implemented using the  BSD Socket
   *              interface as the means of communication with the user level.
   *
   *              DECnet Socket Timer Functions
   *
   * Author:      Steve Whitehouse <SteveW@ACM.org>
   *
   *
   * Changes:
   *       Steve Whitehouse      : Made keepalive timer part of the same
   *                               timer idea.
   *       Steve Whitehouse      : Added checks for sk->sock_readers
   *       David S. Miller       : New socket locking
   *       Steve Whitehouse      : Timer grabs socket ref.
   */
  #include <linux/net.h>
  #include <linux/socket.h>
  #include <linux/skbuff.h>
  #include <linux/netdevice.h>
  #include <linux/timer.h>
  #include <linux/spinlock.h>
  #include <net/sock.h>
60063497a   Arun Sharma   atomic: use <linu...
26
  #include <linux/atomic.h>
8b1b1eb52   Himangi Saraogi   decnet: Use time_...
27
  #include <linux/jiffies.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
29
30
31
32
33
34
35
  #include <net/flow.h>
  #include <net/dn.h>
  
  /*
   * Slow timer is for everything else (n * 500mS)
   */
  
  #define SLOW_INTERVAL (HZ/2)
e99e88a9d   Kees Cook   treewide: setup_t...
36
  static void dn_slow_timer(struct timer_list *t);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
39
  
  void dn_start_slow_timer(struct sock *sk)
  {
e99e88a9d   Kees Cook   treewide: setup_t...
40
  	timer_setup(&sk->sk_timer, dn_slow_timer, 0);
8a6e77d52   Eric Dumazet   decnet: proper so...
41
  	sk_reset_timer(sk, &sk->sk_timer, jiffies + SLOW_INTERVAL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
43
44
45
  }
  
  void dn_stop_slow_timer(struct sock *sk)
  {
8a6e77d52   Eric Dumazet   decnet: proper so...
46
  	sk_stop_timer(sk, &sk->sk_timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
  }
e99e88a9d   Kees Cook   treewide: setup_t...
48
  static void dn_slow_timer(struct timer_list *t)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
  {
e99e88a9d   Kees Cook   treewide: setup_t...
50
  	struct sock *sk = from_timer(sk, t, sk_timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
  	struct dn_scp *scp = DN_SK(sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
54
  	bh_lock_sock(sk);
  
  	if (sock_owned_by_user(sk)) {
8a6e77d52   Eric Dumazet   decnet: proper so...
55
  		sk_reset_timer(sk, &sk->sk_timer, jiffies + HZ / 10);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  		goto out;
  	}
  
  	/*
  	 * The persist timer is the standard slow timer used for retransmits
  	 * in both connection establishment and disconnection as well as
  	 * in the RUN state. The different states are catered for by changing
  	 * the function pointer in the socket. Setting the timer to a value
  	 * of zero turns it off. We allow the persist_fxn to turn the
  	 * timer off in a permant way by returning non-zero, so that
  	 * timer based routines may remove sockets. This is why we have a
  	 * sock_hold()/sock_put() around the timer to prevent the socket
  	 * going away in the middle.
  	 */
  	if (scp->persist && scp->persist_fxn) {
  		if (scp->persist <= SLOW_INTERVAL) {
  			scp->persist = 0;
  
  			if (scp->persist_fxn(sk))
  				goto out;
  		} else {
  			scp->persist -= SLOW_INTERVAL;
  		}
  	}
  
  	/*
  	 * Check for keepalive timeout. After the other timer 'cos if
  	 * the previous timer caused a retransmit, we don't need to
  	 * do this. scp->stamp is the last time that we sent a packet.
  	 * The keepalive function sends a link service packet to the
  	 * other end. If it remains unacknowledged, the standard
  	 * socket timers will eventually shut the socket down. Each
  	 * time we do this, scp->stamp will be updated, thus
  	 * we won't try and send another until scp->keepalive has passed
  	 * since the last successful transmission.
  	 */
  	if (scp->keepalive && scp->keepalive_fxn && (scp->state == DN_RUN)) {
8b1b1eb52   Himangi Saraogi   decnet: Use time_...
93
  		if (time_after_eq(jiffies, scp->stamp + scp->keepalive))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
94
95
  			scp->keepalive_fxn(sk);
  	}
8a6e77d52   Eric Dumazet   decnet: proper so...
96
  	sk_reset_timer(sk, &sk->sk_timer, jiffies + SLOW_INTERVAL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
98
99
100
  out:
  	bh_unlock_sock(sk);
  	sock_put(sk);
  }