diff options
Diffstat (limited to 'net/bluetooth/l2cap.c')
| -rw-r--r-- | net/bluetooth/l2cap.c | 98 |
1 files changed, 16 insertions, 82 deletions
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 59b2dd36baa7..e3bb11ca4235 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
| @@ -38,9 +38,8 @@ | |||
| 38 | #include <linux/interrupt.h> | 38 | #include <linux/interrupt.h> |
| 39 | #include <linux/socket.h> | 39 | #include <linux/socket.h> |
| 40 | #include <linux/skbuff.h> | 40 | #include <linux/skbuff.h> |
| 41 | #include <linux/proc_fs.h> | ||
| 42 | #include <linux/seq_file.h> | ||
| 43 | #include <linux/list.h> | 41 | #include <linux/list.h> |
| 42 | #include <linux/device.h> | ||
| 44 | #include <net/sock.h> | 43 | #include <net/sock.h> |
| 45 | 44 | ||
| 46 | #include <asm/system.h> | 45 | #include <asm/system.h> |
| @@ -56,7 +55,7 @@ | |||
| 56 | #define BT_DBG(D...) | 55 | #define BT_DBG(D...) |
| 57 | #endif | 56 | #endif |
| 58 | 57 | ||
| 59 | #define VERSION "2.7" | 58 | #define VERSION "2.8" |
| 60 | 59 | ||
| 61 | static struct proto_ops l2cap_sock_ops; | 60 | static struct proto_ops l2cap_sock_ops; |
| 62 | 61 | ||
| @@ -2137,94 +2136,29 @@ drop: | |||
| 2137 | return 0; | 2136 | return 0; |
| 2138 | } | 2137 | } |
| 2139 | 2138 | ||
| 2140 | /* ---- Proc fs support ---- */ | 2139 | static ssize_t l2cap_sysfs_show(struct class *dev, char *buf) |
| 2141 | #ifdef CONFIG_PROC_FS | ||
| 2142 | static void *l2cap_seq_start(struct seq_file *seq, loff_t *pos) | ||
| 2143 | { | 2140 | { |
| 2144 | struct sock *sk; | 2141 | struct sock *sk; |
| 2145 | struct hlist_node *node; | 2142 | struct hlist_node *node; |
| 2146 | loff_t l = *pos; | 2143 | char *str = buf; |
| 2147 | 2144 | ||
| 2148 | read_lock_bh(&l2cap_sk_list.lock); | 2145 | read_lock_bh(&l2cap_sk_list.lock); |
| 2149 | 2146 | ||
| 2150 | sk_for_each(sk, node, &l2cap_sk_list.head) | 2147 | sk_for_each(sk, node, &l2cap_sk_list.head) { |
| 2151 | if (!l--) | 2148 | struct l2cap_pinfo *pi = l2cap_pi(sk); |
| 2152 | goto found; | ||
| 2153 | sk = NULL; | ||
| 2154 | found: | ||
| 2155 | return sk; | ||
| 2156 | } | ||
| 2157 | 2149 | ||
| 2158 | static void *l2cap_seq_next(struct seq_file *seq, void *e, loff_t *pos) | 2150 | str += sprintf(str, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d 0x%x\n", |
| 2159 | { | 2151 | batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst), |
| 2160 | (*pos)++; | 2152 | sk->sk_state, pi->psm, pi->scid, pi->dcid, pi->imtu, |
| 2161 | return sk_next(e); | 2153 | pi->omtu, pi->link_mode); |
| 2162 | } | 2154 | } |
| 2163 | 2155 | ||
| 2164 | static void l2cap_seq_stop(struct seq_file *seq, void *e) | ||
| 2165 | { | ||
| 2166 | read_unlock_bh(&l2cap_sk_list.lock); | 2156 | read_unlock_bh(&l2cap_sk_list.lock); |
| 2167 | } | ||
| 2168 | 2157 | ||
| 2169 | static int l2cap_seq_show(struct seq_file *seq, void *e) | 2158 | return (str - buf); |
| 2170 | { | ||
| 2171 | struct sock *sk = e; | ||
| 2172 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
| 2173 | |||
| 2174 | seq_printf(seq, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d 0x%x\n", | ||
| 2175 | batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst), | ||
| 2176 | sk->sk_state, pi->psm, pi->scid, pi->dcid, pi->imtu, | ||
| 2177 | pi->omtu, pi->link_mode); | ||
| 2178 | return 0; | ||
| 2179 | } | 2159 | } |
| 2180 | 2160 | ||
| 2181 | static struct seq_operations l2cap_seq_ops = { | 2161 | static CLASS_ATTR(l2cap, S_IRUGO, l2cap_sysfs_show, NULL); |
| 2182 | .start = l2cap_seq_start, | ||
| 2183 | .next = l2cap_seq_next, | ||
| 2184 | .stop = l2cap_seq_stop, | ||
| 2185 | .show = l2cap_seq_show | ||
| 2186 | }; | ||
| 2187 | |||
| 2188 | static int l2cap_seq_open(struct inode *inode, struct file *file) | ||
| 2189 | { | ||
| 2190 | return seq_open(file, &l2cap_seq_ops); | ||
| 2191 | } | ||
| 2192 | |||
| 2193 | static struct file_operations l2cap_seq_fops = { | ||
| 2194 | .owner = THIS_MODULE, | ||
| 2195 | .open = l2cap_seq_open, | ||
| 2196 | .read = seq_read, | ||
| 2197 | .llseek = seq_lseek, | ||
| 2198 | .release = seq_release, | ||
| 2199 | }; | ||
| 2200 | |||
| 2201 | static int __init l2cap_proc_init(void) | ||
| 2202 | { | ||
| 2203 | struct proc_dir_entry *p = create_proc_entry("l2cap", S_IRUGO, proc_bt); | ||
| 2204 | if (!p) | ||
| 2205 | return -ENOMEM; | ||
| 2206 | p->owner = THIS_MODULE; | ||
| 2207 | p->proc_fops = &l2cap_seq_fops; | ||
| 2208 | return 0; | ||
| 2209 | } | ||
| 2210 | |||
| 2211 | static void __exit l2cap_proc_cleanup(void) | ||
| 2212 | { | ||
| 2213 | remove_proc_entry("l2cap", proc_bt); | ||
| 2214 | } | ||
| 2215 | |||
| 2216 | #else /* CONFIG_PROC_FS */ | ||
| 2217 | |||
| 2218 | static int __init l2cap_proc_init(void) | ||
| 2219 | { | ||
| 2220 | return 0; | ||
| 2221 | } | ||
| 2222 | |||
| 2223 | static void __exit l2cap_proc_cleanup(void) | ||
| 2224 | { | ||
| 2225 | return; | ||
| 2226 | } | ||
| 2227 | #endif /* CONFIG_PROC_FS */ | ||
| 2228 | 2162 | ||
| 2229 | static struct proto_ops l2cap_sock_ops = { | 2163 | static struct proto_ops l2cap_sock_ops = { |
| 2230 | .family = PF_BLUETOOTH, | 2164 | .family = PF_BLUETOOTH, |
| @@ -2266,7 +2200,7 @@ static struct hci_proto l2cap_hci_proto = { | |||
| 2266 | static int __init l2cap_init(void) | 2200 | static int __init l2cap_init(void) |
| 2267 | { | 2201 | { |
| 2268 | int err; | 2202 | int err; |
| 2269 | 2203 | ||
| 2270 | err = proto_register(&l2cap_proto, 0); | 2204 | err = proto_register(&l2cap_proto, 0); |
| 2271 | if (err < 0) | 2205 | if (err < 0) |
| 2272 | return err; | 2206 | return err; |
| @@ -2284,7 +2218,7 @@ static int __init l2cap_init(void) | |||
| 2284 | goto error; | 2218 | goto error; |
| 2285 | } | 2219 | } |
| 2286 | 2220 | ||
| 2287 | l2cap_proc_init(); | 2221 | class_create_file(&bt_class, &class_attr_l2cap); |
| 2288 | 2222 | ||
| 2289 | BT_INFO("L2CAP ver %s", VERSION); | 2223 | BT_INFO("L2CAP ver %s", VERSION); |
| 2290 | BT_INFO("L2CAP socket layer initialized"); | 2224 | BT_INFO("L2CAP socket layer initialized"); |
| @@ -2298,7 +2232,7 @@ error: | |||
| 2298 | 2232 | ||
| 2299 | static void __exit l2cap_exit(void) | 2233 | static void __exit l2cap_exit(void) |
| 2300 | { | 2234 | { |
| 2301 | l2cap_proc_cleanup(); | 2235 | class_remove_file(&bt_class, &class_attr_l2cap); |
| 2302 | 2236 | ||
| 2303 | if (bt_sock_unregister(BTPROTO_L2CAP) < 0) | 2237 | if (bt_sock_unregister(BTPROTO_L2CAP) < 0) |
| 2304 | BT_ERR("L2CAP socket unregistration failed"); | 2238 | BT_ERR("L2CAP socket unregistration failed"); |
