Blame view

net/rxrpc/ar-proc.c 5.1 KB
17926a793   David Howells   [AF_RXRPC]: Provi...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /* /proc/net/ support for AF_RXRPC
   *
   * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
   * Written by David Howells (dhowells@redhat.com)
   *
   * 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.
   */
  
  #include <linux/module.h>
  #include <net/sock.h>
  #include <net/af_rxrpc.h>
  #include "ar-internal.h"
036c2e27b   Jan Engelhardt   [AF_RXRPC]: const...
16
  static const char *const rxrpc_conn_states[] = {
17926a793   David Howells   [AF_RXRPC]: Provi...
17
18
19
20
21
22
23
24
25
  	[RXRPC_CONN_UNUSED]		= "Unused  ",
  	[RXRPC_CONN_CLIENT]		= "Client  ",
  	[RXRPC_CONN_SERVER_UNSECURED]	= "SvUnsec ",
  	[RXRPC_CONN_SERVER_CHALLENGING]	= "SvChall ",
  	[RXRPC_CONN_SERVER]		= "SvSecure",
  	[RXRPC_CONN_REMOTELY_ABORTED]	= "RmtAbort",
  	[RXRPC_CONN_LOCALLY_ABORTED]	= "LocAbort",
  	[RXRPC_CONN_NETWORK_ERROR]	= "NetError",
  };
17926a793   David Howells   [AF_RXRPC]: Provi...
26
27
28
29
30
  /*
   * generate a list of extant and dead calls in /proc/net/rxrpc_calls
   */
  static void *rxrpc_call_seq_start(struct seq_file *seq, loff_t *_pos)
  {
17926a793   David Howells   [AF_RXRPC]: Provi...
31
  	read_lock(&rxrpc_call_lock);
60f0438a8   Pavel Emelianov   [NET]: Make some ...
32
  	return seq_list_start_head(&rxrpc_calls, *_pos);
17926a793   David Howells   [AF_RXRPC]: Provi...
33
34
35
36
  }
  
  static void *rxrpc_call_seq_next(struct seq_file *seq, void *v, loff_t *pos)
  {
60f0438a8   Pavel Emelianov   [NET]: Make some ...
37
  	return seq_list_next(v, &rxrpc_calls, pos);
17926a793   David Howells   [AF_RXRPC]: Provi...
38
39
40
41
42
43
44
45
46
47
48
49
  }
  
  static void rxrpc_call_seq_stop(struct seq_file *seq, void *v)
  {
  	read_unlock(&rxrpc_call_lock);
  }
  
  static int rxrpc_call_seq_show(struct seq_file *seq, void *v)
  {
  	struct rxrpc_transport *trans;
  	struct rxrpc_call *call;
  	char lbuff[4 + 4 + 4 + 4 + 5 + 1], rbuff[4 + 4 + 4 + 4 + 5 + 1];
60f0438a8   Pavel Emelianov   [NET]: Make some ...
50
  	if (v == &rxrpc_calls) {
17926a793   David Howells   [AF_RXRPC]: Provi...
51
52
53
54
55
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
  		seq_puts(seq,
  			 "Proto Local                  Remote                "
  			 " SvID ConnID   CallID   End Use State    Abort   "
  			 " UserID
  ");
  		return 0;
  	}
  
  	call = list_entry(v, struct rxrpc_call, link);
  	trans = call->conn->trans;
  
  	sprintf(lbuff, NIPQUAD_FMT":%u",
  		NIPQUAD(trans->local->srx.transport.sin.sin_addr),
  		ntohs(trans->local->srx.transport.sin.sin_port));
  
  	sprintf(rbuff, NIPQUAD_FMT":%u",
  		NIPQUAD(trans->peer->srx.transport.sin.sin_addr),
  		ntohs(trans->peer->srx.transport.sin.sin_port));
  
  	seq_printf(seq,
  		   "UDP   %-22.22s %-22.22s %4x %08x %08x %s %3u"
  		   " %-8.8s %08x %lx
  ",
  		   lbuff,
  		   rbuff,
  		   ntohs(call->conn->service_id),
  		   ntohl(call->conn->cid),
  		   ntohl(call->call_id),
  		   call->conn->in_clientflag ? "Svc" : "Clt",
  		   atomic_read(&call->usage),
  		   rxrpc_call_states[call->state],
  		   call->abort_code,
  		   call->user_call_ID);
  
  	return 0;
  }
56b3d975b   Philippe De Muyter   [NET]: Make all i...
87
  static const struct seq_operations rxrpc_call_seq_ops = {
17926a793   David Howells   [AF_RXRPC]: Provi...
88
89
90
91
92
93
94
95
96
97
  	.start  = rxrpc_call_seq_start,
  	.next   = rxrpc_call_seq_next,
  	.stop   = rxrpc_call_seq_stop,
  	.show   = rxrpc_call_seq_show,
  };
  
  static int rxrpc_call_seq_open(struct inode *inode, struct file *file)
  {
  	return seq_open(file, &rxrpc_call_seq_ops);
  }
036c2e27b   Jan Engelhardt   [AF_RXRPC]: const...
98
  const struct file_operations rxrpc_call_seq_fops = {
17926a793   David Howells   [AF_RXRPC]: Provi...
99
100
101
102
  	.owner		= THIS_MODULE,
  	.open		= rxrpc_call_seq_open,
  	.read		= seq_read,
  	.llseek		= seq_lseek,
665bba108   Pavel Emelyanov   [NETFILTER/RXRPC]...
103
  	.release	= seq_release,
17926a793   David Howells   [AF_RXRPC]: Provi...
104
105
106
107
108
109
110
  };
  
  /*
   * generate a list of extant virtual connections in /proc/net/rxrpc_conns
   */
  static void *rxrpc_connection_seq_start(struct seq_file *seq, loff_t *_pos)
  {
17926a793   David Howells   [AF_RXRPC]: Provi...
111
  	read_lock(&rxrpc_connection_lock);
60f0438a8   Pavel Emelianov   [NET]: Make some ...
112
  	return seq_list_start_head(&rxrpc_connections, *_pos);
17926a793   David Howells   [AF_RXRPC]: Provi...
113
114
115
116
117
  }
  
  static void *rxrpc_connection_seq_next(struct seq_file *seq, void *v,
  				       loff_t *pos)
  {
60f0438a8   Pavel Emelianov   [NET]: Make some ...
118
  	return seq_list_next(v, &rxrpc_connections, pos);
17926a793   David Howells   [AF_RXRPC]: Provi...
119
120
121
122
123
124
125
126
127
128
129
130
  }
  
  static void rxrpc_connection_seq_stop(struct seq_file *seq, void *v)
  {
  	read_unlock(&rxrpc_connection_lock);
  }
  
  static int rxrpc_connection_seq_show(struct seq_file *seq, void *v)
  {
  	struct rxrpc_connection *conn;
  	struct rxrpc_transport *trans;
  	char lbuff[4 + 4 + 4 + 4 + 5 + 1], rbuff[4 + 4 + 4 + 4 + 5 + 1];
60f0438a8   Pavel Emelianov   [NET]: Make some ...
131
  	if (v == &rxrpc_connections) {
17926a793   David Howells   [AF_RXRPC]: Provi...
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
  		seq_puts(seq,
  			 "Proto Local                  Remote                "
  			 " SvID ConnID   Calls    End Use State    Key     "
  			 " Serial   ISerial
  "
  			 );
  		return 0;
  	}
  
  	conn = list_entry(v, struct rxrpc_connection, link);
  	trans = conn->trans;
  
  	sprintf(lbuff, NIPQUAD_FMT":%u",
  		NIPQUAD(trans->local->srx.transport.sin.sin_addr),
  		ntohs(trans->local->srx.transport.sin.sin_port));
  
  	sprintf(rbuff, NIPQUAD_FMT":%u",
  		NIPQUAD(trans->peer->srx.transport.sin.sin_addr),
  		ntohs(trans->peer->srx.transport.sin.sin_port));
  
  	seq_printf(seq,
  		   "UDP   %-22.22s %-22.22s %4x %08x %08x %s %3u"
  		   " %s %08x %08x %08x
  ",
  		   lbuff,
  		   rbuff,
  		   ntohs(conn->service_id),
  		   ntohl(conn->cid),
  		   conn->call_counter,
  		   conn->in_clientflag ? "Svc" : "Clt",
  		   atomic_read(&conn->usage),
  		   rxrpc_conn_states[conn->state],
  		   key_serial(conn->key),
  		   atomic_read(&conn->serial),
  		   atomic_read(&conn->hi_serial));
  
  	return 0;
  }
56b3d975b   Philippe De Muyter   [NET]: Make all i...
170
  static const struct seq_operations rxrpc_connection_seq_ops = {
17926a793   David Howells   [AF_RXRPC]: Provi...
171
172
173
174
175
176
177
178
179
180
181
  	.start  = rxrpc_connection_seq_start,
  	.next   = rxrpc_connection_seq_next,
  	.stop   = rxrpc_connection_seq_stop,
  	.show   = rxrpc_connection_seq_show,
  };
  
  
  static int rxrpc_connection_seq_open(struct inode *inode, struct file *file)
  {
  	return seq_open(file, &rxrpc_connection_seq_ops);
  }
036c2e27b   Jan Engelhardt   [AF_RXRPC]: const...
182
  const struct file_operations rxrpc_connection_seq_fops = {
17926a793   David Howells   [AF_RXRPC]: Provi...
183
184
185
186
  	.owner		= THIS_MODULE,
  	.open		= rxrpc_connection_seq_open,
  	.read		= seq_read,
  	.llseek		= seq_lseek,
665bba108   Pavel Emelyanov   [NETFILTER/RXRPC]...
187
  	.release	= seq_release,
17926a793   David Howells   [AF_RXRPC]: Provi...
188
  };