Blame view

net/llc/llc_proc.c 6.02 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
  /*
   * proc_llc.c - proc interface for LLC
   *
   * Copyright (c) 2001 by Jay Schulist <jschlst@samba.org>
   *		 2002-2003 by Arnaldo Carvalho de Melo <acme@conectiva.com.br>
   *
   * This program can be redistributed or modified under the terms of the
   * GNU General Public License as published by the Free Software Foundation.
   * This program is distributed without any warranty or implied warranty
   * of merchantability or fitness for a particular purpose.
   *
   * See the GNU General Public License for more details.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
16
17
18
  #include <linux/init.h>
  #include <linux/kernel.h>
  #include <linux/proc_fs.h>
  #include <linux/errno.h>
  #include <linux/seq_file.h>
bc3b2d7fb   Paul Gortmaker   net: Add export.h...
19
  #include <linux/export.h>
457c4cbc5   Eric W. Biederman   [NET]: Make /proc...
20
  #include <net/net_namespace.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
23
24
25
26
  #include <net/sock.h>
  #include <net/llc.h>
  #include <net/llc_c_ac.h>
  #include <net/llc_c_ev.h>
  #include <net/llc_c_st.h>
  #include <net/llc_conn.h>
0795af572   Joe Perches   [NET]: Introduce ...
27
  static void llc_ui_format_mac(struct seq_file *seq, u8 *addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
  {
e174961ca   Johannes Berg   net: convert prin...
29
  	seq_printf(seq, "%pM", addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
32
33
  }
  
  static struct sock *llc_get_sk_idx(loff_t pos)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
  	struct llc_sap *sap;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
  	struct sock *sk = NULL;
52d58aef5   Octavian Purdila   llc: replace the ...
36
  	int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37

8beb9ab6c   Octavian Purdila   llc: convert llc_...
38
  	list_for_each_entry_rcu(sap, &llc_sap_list, node) {
b76f5a842   Octavian Purdila   llc: convert the ...
39
  		spin_lock_bh(&sap->sk_lock);
52d58aef5   Octavian Purdila   llc: replace the ...
40
41
42
43
44
45
46
47
48
  		for (i = 0; i < LLC_SK_LADDR_HASH_ENTRIES; i++) {
  			struct hlist_nulls_head *head = &sap->sk_laddr_hash[i];
  			struct hlist_nulls_node *node;
  
  			sk_nulls_for_each(sk, node, head) {
  				if (!pos)
  					goto found; /* keep the lock */
  				--pos;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
  		}
b76f5a842   Octavian Purdila   llc: convert the ...
50
  		spin_unlock_bh(&sap->sk_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
52
53
54
55
  	}
  	sk = NULL;
  found:
  	return sk;
  }
8e0f8ccfb   Jules Irenge   net: Add missing ...
56
  static void *llc_seq_start(struct seq_file *seq, loff_t *pos) __acquires(RCU)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
58
  {
  	loff_t l = *pos;
8beb9ab6c   Octavian Purdila   llc: convert llc_...
59
  	rcu_read_lock_bh();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
61
  	return l ? llc_get_sk_idx(--l) : SEQ_START_TOKEN;
  }
52d58aef5   Octavian Purdila   llc: replace the ...
62
63
64
65
66
67
68
69
70
71
72
73
  static struct sock *laddr_hash_next(struct llc_sap *sap, int bucket)
  {
  	struct hlist_nulls_node *node;
  	struct sock *sk = NULL;
  
  	while (++bucket < LLC_SK_LADDR_HASH_ENTRIES)
  		sk_nulls_for_each(sk, node, &sap->sk_laddr_hash[bucket])
  			goto out;
  
  out:
  	return sk;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
75
76
77
78
79
80
81
82
83
84
85
  static void *llc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
  {
  	struct sock* sk, *next;
  	struct llc_sock *llc;
  	struct llc_sap *sap;
  
  	++*pos;
  	if (v == SEQ_START_TOKEN) {
  		sk = llc_get_sk_idx(0);
  		goto out;
  	}
  	sk = v;
b76f5a842   Octavian Purdila   llc: convert the ...
86
  	next = sk_nulls_next(sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87
88
89
90
91
92
  	if (next) {
  		sk = next;
  		goto out;
  	}
  	llc = llc_sk(sk);
  	sap = llc->sap;
52d58aef5   Octavian Purdila   llc: replace the ...
93
94
95
  	sk = laddr_hash_next(sap, llc_sk_laddr_hashfn(sap, &llc->laddr));
  	if (sk)
  		goto out;
b76f5a842   Octavian Purdila   llc: convert the ...
96
  	spin_unlock_bh(&sap->sk_lock);
8beb9ab6c   Octavian Purdila   llc: convert llc_...
97
  	list_for_each_entry_continue_rcu(sap, &llc_sap_list, node) {
b76f5a842   Octavian Purdila   llc: convert the ...
98
  		spin_lock_bh(&sap->sk_lock);
52d58aef5   Octavian Purdila   llc: replace the ...
99
100
101
  		sk = laddr_hash_next(sap, -1);
  		if (sk)
  			break; /* keep the lock */
b76f5a842   Octavian Purdila   llc: convert the ...
102
  		spin_unlock_bh(&sap->sk_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
103
104
105
106
107
108
109
110
111
112
113
  	}
  out:
  	return sk;
  }
  
  static void llc_seq_stop(struct seq_file *seq, void *v)
  {
  	if (v && v != SEQ_START_TOKEN) {
  		struct sock *sk = v;
  		struct llc_sock *llc = llc_sk(sk);
  		struct llc_sap *sap = llc->sap;
b76f5a842   Octavian Purdila   llc: convert the ...
114
  		spin_unlock_bh(&sap->sk_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
  	}
8beb9ab6c   Octavian Purdila   llc: convert llc_...
116
  	rcu_read_unlock_bh();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
  }
  
  static int llc_seq_socket_show(struct seq_file *seq, void *v)
  {
  	struct sock* sk;
  	struct llc_sock *llc;
  
  	if (v == SEQ_START_TOKEN) {
  		seq_puts(seq, "SKt Mc local_mac_sap        remote_mac_sap   "
  			      "    tx_queue rx_queue st uid link
  ");
  		goto out;
  	}
  	sk = v;
  	llc = llc_sk(sk);
  
  	/* FIXME: check if the address is multicast */
  	seq_printf(seq, "%2X  %2X ", sk->sk_type, 0);
  
  	if (llc->dev)
  		llc_ui_format_mac(seq, llc->dev->dev_addr);
0795af572   Joe Perches   [NET]: Introduce ...
138
139
140
141
  	else {
  		u8 addr[6] = {0,0,0,0,0,0};
  		llc_ui_format_mac(seq, addr);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
143
  	seq_printf(seq, "@%02X ", llc->sap->laddr.lsap);
  	llc_ui_format_mac(seq, llc->daddr.mac);
d14c5ab6b   Francesco Fusco   net: proc_fs: tri...
144
145
  	seq_printf(seq, "@%02X %8d %8d %2d %3u %4d
  ", llc->daddr.lsap,
31e6d363a   Eric Dumazet   net: correct off-...
146
147
  		   sk_wmem_alloc_get(sk),
  		   sk_rmem_alloc_get(sk) - llc->copied_seq,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148
  		   sk->sk_state,
a7cb5a49b   Eric W. Biederman   userns: Print out...
149
  		   from_kuid_munged(seq_user_ns(seq), sock_i_uid(sk)),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150
151
152
153
  		   llc->link);
  out:
  	return 0;
  }
36cbd3dcc   Jan Engelhardt   net: mark read-on...
154
  static const char *const llc_conn_state_names[] = {
d57b1869b   YOSHIFUJI Hideaki   [NET] LLC: Fix wh...
155
156
  	[LLC_CONN_STATE_ADM] =        "adm",
  	[LLC_CONN_STATE_SETUP] =      "setup",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
  	[LLC_CONN_STATE_NORMAL] =     "normal",
d57b1869b   YOSHIFUJI Hideaki   [NET] LLC: Fix wh...
158
159
160
  	[LLC_CONN_STATE_BUSY] =       "busy",
  	[LLC_CONN_STATE_REJ] =        "rej",
  	[LLC_CONN_STATE_AWAIT] =      "await",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
161
162
163
  	[LLC_CONN_STATE_AWAIT_BUSY] = "await_busy",
  	[LLC_CONN_STATE_AWAIT_REJ] =  "await_rej",
  	[LLC_CONN_STATE_D_CONN]	=     "d_conn",
d57b1869b   YOSHIFUJI Hideaki   [NET] LLC: Fix wh...
164
165
166
  	[LLC_CONN_STATE_RESET] =      "reset",
  	[LLC_CONN_STATE_ERROR] =      "error",
  	[LLC_CONN_STATE_TEMP] =       "temp",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
  };
  
  static int llc_seq_core_show(struct seq_file *seq, void *v)
  {
  	struct sock* sk;
  	struct llc_sock *llc;
  
  	if (v == SEQ_START_TOKEN) {
  		seq_puts(seq, "Connection list:
  "
  			      "dsap state      retr txw rxw pf ff sf df rs cs "
  			      "tack tpfc trs tbs blog busr
  ");
  		goto out;
  	}
  	sk = v;
  	llc = llc_sk(sk);
  
  	seq_printf(seq, " %02X  %-10s %3d  %3d %3d %2d %2d %2d %2d %2d %2d "
  			"%4d %4d %3d %3d %4d %4d
  ",
  		   llc->daddr.lsap, llc_conn_state_names[llc->state],
  		   llc->retry_count, llc->k, llc->rw, llc->p_flag, llc->f_flag,
  		   llc->s_flag, llc->data_flag, llc->remote_busy_flag,
  		   llc->cause_flag, timer_pending(&llc->ack_timer.timer),
  		   timer_pending(&llc->pf_cycle_timer.timer),
  		   timer_pending(&llc->rej_sent_timer.timer),
  		   timer_pending(&llc->busy_state_timer.timer),
fafc4e1ea   Hannes Frederic Sowa   sock: tigthen loc...
195
  		   !!sk->sk_backlog.tail, !!sk->sk_lock.owned);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
196
197
198
  out:
  	return 0;
  }
56b3d975b   Philippe De Muyter   [NET]: Make all i...
199
  static const struct seq_operations llc_seq_socket_ops = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
200
201
202
203
204
  	.start  = llc_seq_start,
  	.next   = llc_seq_next,
  	.stop   = llc_seq_stop,
  	.show   = llc_seq_socket_show,
  };
56b3d975b   Philippe De Muyter   [NET]: Make all i...
205
  static const struct seq_operations llc_seq_core_ops = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
207
208
209
210
  	.start  = llc_seq_start,
  	.next   = llc_seq_next,
  	.stop   = llc_seq_stop,
  	.show   = llc_seq_core_show,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
211
212
213
214
215
216
  static struct proc_dir_entry *llc_proc_dir;
  
  int __init llc_proc_init(void)
  {
  	int rc = -ENOMEM;
  	struct proc_dir_entry *p;
457c4cbc5   Eric W. Biederman   [NET]: Make /proc...
217
  	llc_proc_dir = proc_mkdir("llc", init_net.proc_net);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218
219
  	if (!llc_proc_dir)
  		goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
220

fddda2b7b   Christoph Hellwig   proc: introduce p...
221
  	p = proc_create_seq("socket", 0444, llc_proc_dir, &llc_seq_socket_ops);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
222
223
  	if (!p)
  		goto out_socket;
fddda2b7b   Christoph Hellwig   proc: introduce p...
224
  	p = proc_create_seq("core", 0444, llc_proc_dir, &llc_seq_core_ops);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
225
226
  	if (!p)
  		goto out_core;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
227
228
229
230
231
232
  	rc = 0;
  out:
  	return rc;
  out_core:
  	remove_proc_entry("socket", llc_proc_dir);
  out_socket:
457c4cbc5   Eric W. Biederman   [NET]: Make /proc...
233
  	remove_proc_entry("llc", init_net.proc_net);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
234
235
236
237
238
239
240
  	goto out;
  }
  
  void llc_proc_exit(void)
  {
  	remove_proc_entry("socket", llc_proc_dir);
  	remove_proc_entry("core", llc_proc_dir);
457c4cbc5   Eric W. Biederman   [NET]: Make /proc...
241
  	remove_proc_entry("llc", init_net.proc_net);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242
  }