diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-20 16:43:21 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-20 16:43:21 -0400 |
commit | 06f4e926d256d902dd9a53dcb400fd74974ce087 (patch) | |
tree | 0b438b67f5f0eff6fd617bc497a9dace6164a488 /net/bluetooth | |
parent | 8e7bfcbab3825d1b404d615cb1b54f44ff81f981 (diff) | |
parent | d93515611bbc70c2fe4db232e5feb448ed8e4cc9 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1446 commits)
macvlan: fix panic if lowerdev in a bond
tg3: Add braces around 5906 workaround.
tg3: Fix NETIF_F_LOOPBACK error
macvlan: remove one synchronize_rcu() call
networking: NET_CLS_ROUTE4 depends on INET
irda: Fix error propagation in ircomm_lmp_connect_response()
irda: Kill set but unused variable 'bytes' in irlan_check_command_param()
irda: Kill set but unused variable 'clen' in ircomm_connect_indication()
rxrpc: Fix set but unused variable 'usage' in rxrpc_get_transport()
be2net: Kill set but unused variable 'req' in lancer_fw_download()
irda: Kill set but unused vars 'saddr' and 'daddr' in irlan_provider_connect_indication()
atl1c: atl1c_resume() is only used when CONFIG_PM_SLEEP is defined.
rxrpc: Fix set but unused variable 'usage' in rxrpc_get_peer().
rxrpc: Kill set but unused variable 'local' in rxrpc_UDP_error_handler()
rxrpc: Kill set but unused variable 'sp' in rxrpc_process_connection()
rxrpc: Kill set but unused variable 'sp' in rxrpc_rotate_tx_window()
pkt_sched: Kill set but unused variable 'protocol' in tc_classify()
isdn: capi: Use pr_debug() instead of ifdefs.
tg3: Update version to 3.119
tg3: Apply rx_discards fix to 5719/5720
...
Fix up trivial conflicts in arch/x86/Kconfig and net/mac80211/agg-tx.c
as per Davem.
Diffstat (limited to 'net/bluetooth')
-rw-r--r-- | net/bluetooth/bnep/bnep.h | 148 | ||||
-rw-r--r-- | net/bluetooth/bnep/core.c | 71 | ||||
-rw-r--r-- | net/bluetooth/bnep/sock.c | 2 | ||||
-rw-r--r-- | net/bluetooth/cmtp/capi.c | 6 | ||||
-rw-r--r-- | net/bluetooth/cmtp/cmtp.h | 11 | ||||
-rw-r--r-- | net/bluetooth/cmtp/core.c | 28 | ||||
-rw-r--r-- | net/bluetooth/cmtp/sock.c | 2 | ||||
-rw-r--r-- | net/bluetooth/hci_conn.c | 95 | ||||
-rw-r--r-- | net/bluetooth/hci_core.c | 154 | ||||
-rw-r--r-- | net/bluetooth/hci_event.c | 267 | ||||
-rw-r--r-- | net/bluetooth/hci_sysfs.c | 71 | ||||
-rw-r--r-- | net/bluetooth/hidp/core.c | 96 | ||||
-rw-r--r-- | net/bluetooth/hidp/hidp.h | 6 | ||||
-rw-r--r-- | net/bluetooth/hidp/sock.c | 7 | ||||
-rw-r--r-- | net/bluetooth/l2cap_core.c | 1966 | ||||
-rw-r--r-- | net/bluetooth/l2cap_sock.c | 330 | ||||
-rw-r--r-- | net/bluetooth/mgmt.c | 612 | ||||
-rw-r--r-- | net/bluetooth/rfcomm/core.c | 23 | ||||
-rw-r--r-- | net/bluetooth/rfcomm/sock.c | 5 |
19 files changed, 2492 insertions, 1408 deletions
diff --git a/net/bluetooth/bnep/bnep.h b/net/bluetooth/bnep/bnep.h index 70672544db86..8e6c06158f8e 100644 --- a/net/bluetooth/bnep/bnep.h +++ b/net/bluetooth/bnep/bnep.h | |||
@@ -23,88 +23,88 @@ | |||
23 | #include <linux/crc32.h> | 23 | #include <linux/crc32.h> |
24 | #include <net/bluetooth/bluetooth.h> | 24 | #include <net/bluetooth/bluetooth.h> |
25 | 25 | ||
26 | // Limits | 26 | /* Limits */ |
27 | #define BNEP_MAX_PROTO_FILTERS 5 | 27 | #define BNEP_MAX_PROTO_FILTERS 5 |
28 | #define BNEP_MAX_MULTICAST_FILTERS 20 | 28 | #define BNEP_MAX_MULTICAST_FILTERS 20 |
29 | 29 | ||
30 | // UUIDs | 30 | /* UUIDs */ |
31 | #define BNEP_BASE_UUID 0x0000000000001000800000805F9B34FB | 31 | #define BNEP_BASE_UUID 0x0000000000001000800000805F9B34FB |
32 | #define BNEP_UUID16 0x02 | 32 | #define BNEP_UUID16 0x02 |
33 | #define BNEP_UUID32 0x04 | 33 | #define BNEP_UUID32 0x04 |
34 | #define BNEP_UUID128 0x16 | 34 | #define BNEP_UUID128 0x16 |
35 | 35 | ||
36 | #define BNEP_SVC_PANU 0x1115 | 36 | #define BNEP_SVC_PANU 0x1115 |
37 | #define BNEP_SVC_NAP 0x1116 | 37 | #define BNEP_SVC_NAP 0x1116 |
38 | #define BNEP_SVC_GN 0x1117 | 38 | #define BNEP_SVC_GN 0x1117 |
39 | 39 | ||
40 | // Packet types | 40 | /* Packet types */ |
41 | #define BNEP_GENERAL 0x00 | 41 | #define BNEP_GENERAL 0x00 |
42 | #define BNEP_CONTROL 0x01 | 42 | #define BNEP_CONTROL 0x01 |
43 | #define BNEP_COMPRESSED 0x02 | 43 | #define BNEP_COMPRESSED 0x02 |
44 | #define BNEP_COMPRESSED_SRC_ONLY 0x03 | 44 | #define BNEP_COMPRESSED_SRC_ONLY 0x03 |
45 | #define BNEP_COMPRESSED_DST_ONLY 0x04 | 45 | #define BNEP_COMPRESSED_DST_ONLY 0x04 |
46 | 46 | ||
47 | // Control types | 47 | /* Control types */ |
48 | #define BNEP_CMD_NOT_UNDERSTOOD 0x00 | 48 | #define BNEP_CMD_NOT_UNDERSTOOD 0x00 |
49 | #define BNEP_SETUP_CONN_REQ 0x01 | 49 | #define BNEP_SETUP_CONN_REQ 0x01 |
50 | #define BNEP_SETUP_CONN_RSP 0x02 | 50 | #define BNEP_SETUP_CONN_RSP 0x02 |
51 | #define BNEP_FILTER_NET_TYPE_SET 0x03 | 51 | #define BNEP_FILTER_NET_TYPE_SET 0x03 |
52 | #define BNEP_FILTER_NET_TYPE_RSP 0x04 | 52 | #define BNEP_FILTER_NET_TYPE_RSP 0x04 |
53 | #define BNEP_FILTER_MULTI_ADDR_SET 0x05 | 53 | #define BNEP_FILTER_MULTI_ADDR_SET 0x05 |
54 | #define BNEP_FILTER_MULTI_ADDR_RSP 0x06 | 54 | #define BNEP_FILTER_MULTI_ADDR_RSP 0x06 |
55 | 55 | ||
56 | // Extension types | 56 | /* Extension types */ |
57 | #define BNEP_EXT_CONTROL 0x00 | 57 | #define BNEP_EXT_CONTROL 0x00 |
58 | 58 | ||
59 | // Response messages | 59 | /* Response messages */ |
60 | #define BNEP_SUCCESS 0x00 | 60 | #define BNEP_SUCCESS 0x00 |
61 | 61 | ||
62 | #define BNEP_CONN_INVALID_DST 0x01 | 62 | #define BNEP_CONN_INVALID_DST 0x01 |
63 | #define BNEP_CONN_INVALID_SRC 0x02 | 63 | #define BNEP_CONN_INVALID_SRC 0x02 |
64 | #define BNEP_CONN_INVALID_SVC 0x03 | 64 | #define BNEP_CONN_INVALID_SVC 0x03 |
65 | #define BNEP_CONN_NOT_ALLOWED 0x04 | 65 | #define BNEP_CONN_NOT_ALLOWED 0x04 |
66 | 66 | ||
67 | #define BNEP_FILTER_UNSUPPORTED_REQ 0x01 | 67 | #define BNEP_FILTER_UNSUPPORTED_REQ 0x01 |
68 | #define BNEP_FILTER_INVALID_RANGE 0x02 | 68 | #define BNEP_FILTER_INVALID_RANGE 0x02 |
69 | #define BNEP_FILTER_INVALID_MCADDR 0x02 | 69 | #define BNEP_FILTER_INVALID_MCADDR 0x02 |
70 | #define BNEP_FILTER_LIMIT_REACHED 0x03 | 70 | #define BNEP_FILTER_LIMIT_REACHED 0x03 |
71 | #define BNEP_FILTER_DENIED_SECURITY 0x04 | 71 | #define BNEP_FILTER_DENIED_SECURITY 0x04 |
72 | 72 | ||
73 | // L2CAP settings | 73 | /* L2CAP settings */ |
74 | #define BNEP_MTU 1691 | 74 | #define BNEP_MTU 1691 |
75 | #define BNEP_PSM 0x0f | 75 | #define BNEP_PSM 0x0f |
76 | #define BNEP_FLUSH_TO 0xffff | 76 | #define BNEP_FLUSH_TO 0xffff |
77 | #define BNEP_CONNECT_TO 15 | 77 | #define BNEP_CONNECT_TO 15 |
78 | #define BNEP_FILTER_TO 15 | 78 | #define BNEP_FILTER_TO 15 |
79 | 79 | ||
80 | // Headers | 80 | /* Headers */ |
81 | #define BNEP_TYPE_MASK 0x7f | 81 | #define BNEP_TYPE_MASK 0x7f |
82 | #define BNEP_EXT_HEADER 0x80 | 82 | #define BNEP_EXT_HEADER 0x80 |
83 | 83 | ||
84 | struct bnep_setup_conn_req { | 84 | struct bnep_setup_conn_req { |
85 | __u8 type; | 85 | __u8 type; |
86 | __u8 ctrl; | 86 | __u8 ctrl; |
87 | __u8 uuid_size; | 87 | __u8 uuid_size; |
88 | __u8 service[0]; | 88 | __u8 service[0]; |
89 | } __packed; | 89 | } __packed; |
90 | 90 | ||
91 | struct bnep_set_filter_req { | 91 | struct bnep_set_filter_req { |
92 | __u8 type; | 92 | __u8 type; |
93 | __u8 ctrl; | 93 | __u8 ctrl; |
94 | __be16 len; | 94 | __be16 len; |
95 | __u8 list[0]; | 95 | __u8 list[0]; |
96 | } __packed; | 96 | } __packed; |
97 | 97 | ||
98 | struct bnep_control_rsp { | 98 | struct bnep_control_rsp { |
99 | __u8 type; | 99 | __u8 type; |
100 | __u8 ctrl; | 100 | __u8 ctrl; |
101 | __be16 resp; | 101 | __be16 resp; |
102 | } __packed; | 102 | } __packed; |
103 | 103 | ||
104 | struct bnep_ext_hdr { | 104 | struct bnep_ext_hdr { |
105 | __u8 type; | 105 | __u8 type; |
106 | __u8 len; | 106 | __u8 len; |
107 | __u8 data[0]; | 107 | __u8 data[0]; |
108 | } __packed; | 108 | } __packed; |
109 | 109 | ||
110 | /* BNEP ioctl defines */ | 110 | /* BNEP ioctl defines */ |
@@ -114,10 +114,10 @@ struct bnep_ext_hdr { | |||
114 | #define BNEPGETCONNINFO _IOR('B', 211, int) | 114 | #define BNEPGETCONNINFO _IOR('B', 211, int) |
115 | 115 | ||
116 | struct bnep_connadd_req { | 116 | struct bnep_connadd_req { |
117 | int sock; // Connected socket | 117 | int sock; /* Connected socket */ |
118 | __u32 flags; | 118 | __u32 flags; |
119 | __u16 role; | 119 | __u16 role; |
120 | char device[16]; // Name of the Ethernet device | 120 | char device[16]; /* Name of the Ethernet device */ |
121 | }; | 121 | }; |
122 | 122 | ||
123 | struct bnep_conndel_req { | 123 | struct bnep_conndel_req { |
@@ -148,14 +148,14 @@ int bnep_del_connection(struct bnep_conndel_req *req); | |||
148 | int bnep_get_connlist(struct bnep_connlist_req *req); | 148 | int bnep_get_connlist(struct bnep_connlist_req *req); |
149 | int bnep_get_conninfo(struct bnep_conninfo *ci); | 149 | int bnep_get_conninfo(struct bnep_conninfo *ci); |
150 | 150 | ||
151 | // BNEP sessions | 151 | /* BNEP sessions */ |
152 | struct bnep_session { | 152 | struct bnep_session { |
153 | struct list_head list; | 153 | struct list_head list; |
154 | 154 | ||
155 | unsigned int role; | 155 | unsigned int role; |
156 | unsigned long state; | 156 | unsigned long state; |
157 | unsigned long flags; | 157 | unsigned long flags; |
158 | atomic_t killed; | 158 | struct task_struct *task; |
159 | 159 | ||
160 | struct ethhdr eh; | 160 | struct ethhdr eh; |
161 | struct msghdr msg; | 161 | struct msghdr msg; |
@@ -173,7 +173,7 @@ void bnep_sock_cleanup(void); | |||
173 | 173 | ||
174 | static inline int bnep_mc_hash(__u8 *addr) | 174 | static inline int bnep_mc_hash(__u8 *addr) |
175 | { | 175 | { |
176 | return (crc32_be(~0, addr, ETH_ALEN) >> 26); | 176 | return crc32_be(~0, addr, ETH_ALEN) >> 26; |
177 | } | 177 | } |
178 | 178 | ||
179 | #endif | 179 | #endif |
diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c index 03d4d1245d58..ca39fcf010ce 100644 --- a/net/bluetooth/bnep/core.c +++ b/net/bluetooth/bnep/core.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/errno.h> | 36 | #include <linux/errno.h> |
37 | #include <linux/net.h> | 37 | #include <linux/net.h> |
38 | #include <linux/slab.h> | 38 | #include <linux/slab.h> |
39 | #include <linux/kthread.h> | ||
39 | #include <net/sock.h> | 40 | #include <net/sock.h> |
40 | 41 | ||
41 | #include <linux/socket.h> | 42 | #include <linux/socket.h> |
@@ -131,7 +132,8 @@ static int bnep_ctrl_set_netfilter(struct bnep_session *s, __be16 *data, int len | |||
131 | return -EILSEQ; | 132 | return -EILSEQ; |
132 | 133 | ||
133 | n = get_unaligned_be16(data); | 134 | n = get_unaligned_be16(data); |
134 | data++; len -= 2; | 135 | data++; |
136 | len -= 2; | ||
135 | 137 | ||
136 | if (len < n) | 138 | if (len < n) |
137 | return -EILSEQ; | 139 | return -EILSEQ; |
@@ -176,7 +178,8 @@ static int bnep_ctrl_set_mcfilter(struct bnep_session *s, u8 *data, int len) | |||
176 | return -EILSEQ; | 178 | return -EILSEQ; |
177 | 179 | ||
178 | n = get_unaligned_be16(data); | 180 | n = get_unaligned_be16(data); |
179 | data += 2; len -= 2; | 181 | data += 2; |
182 | len -= 2; | ||
180 | 183 | ||
181 | if (len < n) | 184 | if (len < n) |
182 | return -EILSEQ; | 185 | return -EILSEQ; |
@@ -187,6 +190,8 @@ static int bnep_ctrl_set_mcfilter(struct bnep_session *s, u8 *data, int len) | |||
187 | n /= (ETH_ALEN * 2); | 190 | n /= (ETH_ALEN * 2); |
188 | 191 | ||
189 | if (n > 0) { | 192 | if (n > 0) { |
193 | int i; | ||
194 | |||
190 | s->mc_filter = 0; | 195 | s->mc_filter = 0; |
191 | 196 | ||
192 | /* Always send broadcast */ | 197 | /* Always send broadcast */ |
@@ -196,18 +201,22 @@ static int bnep_ctrl_set_mcfilter(struct bnep_session *s, u8 *data, int len) | |||
196 | for (; n > 0; n--) { | 201 | for (; n > 0; n--) { |
197 | u8 a1[6], *a2; | 202 | u8 a1[6], *a2; |
198 | 203 | ||
199 | memcpy(a1, data, ETH_ALEN); data += ETH_ALEN; | 204 | memcpy(a1, data, ETH_ALEN); |
200 | a2 = data; data += ETH_ALEN; | 205 | data += ETH_ALEN; |
206 | a2 = data; | ||
207 | data += ETH_ALEN; | ||
201 | 208 | ||
202 | BT_DBG("mc filter %s -> %s", | 209 | BT_DBG("mc filter %s -> %s", |
203 | batostr((void *) a1), batostr((void *) a2)); | 210 | batostr((void *) a1), batostr((void *) a2)); |
204 | 211 | ||
205 | #define INCA(a) { int i = 5; while (i >=0 && ++a[i--] == 0); } | ||
206 | |||
207 | /* Iterate from a1 to a2 */ | 212 | /* Iterate from a1 to a2 */ |
208 | set_bit(bnep_mc_hash(a1), (ulong *) &s->mc_filter); | 213 | set_bit(bnep_mc_hash(a1), (ulong *) &s->mc_filter); |
209 | while (memcmp(a1, a2, 6) < 0 && s->mc_filter != ~0LL) { | 214 | while (memcmp(a1, a2, 6) < 0 && s->mc_filter != ~0LL) { |
210 | INCA(a1); | 215 | /* Increment a1 */ |
216 | i = 5; | ||
217 | while (i >= 0 && ++a1[i--] == 0) | ||
218 | ; | ||
219 | |||
211 | set_bit(bnep_mc_hash(a1), (ulong *) &s->mc_filter); | 220 | set_bit(bnep_mc_hash(a1), (ulong *) &s->mc_filter); |
212 | } | 221 | } |
213 | } | 222 | } |
@@ -227,7 +236,8 @@ static int bnep_rx_control(struct bnep_session *s, void *data, int len) | |||
227 | u8 cmd = *(u8 *)data; | 236 | u8 cmd = *(u8 *)data; |
228 | int err = 0; | 237 | int err = 0; |
229 | 238 | ||
230 | data++; len--; | 239 | data++; |
240 | len--; | ||
231 | 241 | ||
232 | switch (cmd) { | 242 | switch (cmd) { |
233 | case BNEP_CMD_NOT_UNDERSTOOD: | 243 | case BNEP_CMD_NOT_UNDERSTOOD: |
@@ -302,7 +312,6 @@ static u8 __bnep_rx_hlen[] = { | |||
302 | ETH_ALEN + 2, /* BNEP_COMPRESSED_SRC_ONLY */ | 312 | ETH_ALEN + 2, /* BNEP_COMPRESSED_SRC_ONLY */ |
303 | ETH_ALEN + 2 /* BNEP_COMPRESSED_DST_ONLY */ | 313 | ETH_ALEN + 2 /* BNEP_COMPRESSED_DST_ONLY */ |
304 | }; | 314 | }; |
305 | #define BNEP_RX_TYPES (sizeof(__bnep_rx_hlen) - 1) | ||
306 | 315 | ||
307 | static inline int bnep_rx_frame(struct bnep_session *s, struct sk_buff *skb) | 316 | static inline int bnep_rx_frame(struct bnep_session *s, struct sk_buff *skb) |
308 | { | 317 | { |
@@ -312,9 +321,10 @@ static inline int bnep_rx_frame(struct bnep_session *s, struct sk_buff *skb) | |||
312 | 321 | ||
313 | dev->stats.rx_bytes += skb->len; | 322 | dev->stats.rx_bytes += skb->len; |
314 | 323 | ||
315 | type = *(u8 *) skb->data; skb_pull(skb, 1); | 324 | type = *(u8 *) skb->data; |
325 | skb_pull(skb, 1); | ||
316 | 326 | ||
317 | if ((type & BNEP_TYPE_MASK) > BNEP_RX_TYPES) | 327 | if ((type & BNEP_TYPE_MASK) >= sizeof(__bnep_rx_hlen)) |
318 | goto badframe; | 328 | goto badframe; |
319 | 329 | ||
320 | if ((type & BNEP_TYPE_MASK) == BNEP_CONTROL) { | 330 | if ((type & BNEP_TYPE_MASK) == BNEP_CONTROL) { |
@@ -367,14 +377,14 @@ static inline int bnep_rx_frame(struct bnep_session *s, struct sk_buff *skb) | |||
367 | 377 | ||
368 | case BNEP_COMPRESSED_DST_ONLY: | 378 | case BNEP_COMPRESSED_DST_ONLY: |
369 | memcpy(__skb_put(nskb, ETH_ALEN), skb_mac_header(skb), | 379 | memcpy(__skb_put(nskb, ETH_ALEN), skb_mac_header(skb), |
370 | ETH_ALEN); | 380 | ETH_ALEN); |
371 | memcpy(__skb_put(nskb, ETH_ALEN + 2), s->eh.h_source, | 381 | memcpy(__skb_put(nskb, ETH_ALEN + 2), s->eh.h_source, |
372 | ETH_ALEN + 2); | 382 | ETH_ALEN + 2); |
373 | break; | 383 | break; |
374 | 384 | ||
375 | case BNEP_GENERAL: | 385 | case BNEP_GENERAL: |
376 | memcpy(__skb_put(nskb, ETH_ALEN * 2), skb_mac_header(skb), | 386 | memcpy(__skb_put(nskb, ETH_ALEN * 2), skb_mac_header(skb), |
377 | ETH_ALEN * 2); | 387 | ETH_ALEN * 2); |
378 | put_unaligned(s->eh.h_proto, (__be16 *) __skb_put(nskb, 2)); | 388 | put_unaligned(s->eh.h_proto, (__be16 *) __skb_put(nskb, 2)); |
379 | break; | 389 | break; |
380 | } | 390 | } |
@@ -470,15 +480,14 @@ static int bnep_session(void *arg) | |||
470 | 480 | ||
471 | BT_DBG(""); | 481 | BT_DBG(""); |
472 | 482 | ||
473 | daemonize("kbnepd %s", dev->name); | ||
474 | set_user_nice(current, -15); | 483 | set_user_nice(current, -15); |
475 | 484 | ||
476 | init_waitqueue_entry(&wait, current); | 485 | init_waitqueue_entry(&wait, current); |
477 | add_wait_queue(sk_sleep(sk), &wait); | 486 | add_wait_queue(sk_sleep(sk), &wait); |
478 | while (!atomic_read(&s->killed)) { | 487 | while (!kthread_should_stop()) { |
479 | set_current_state(TASK_INTERRUPTIBLE); | 488 | set_current_state(TASK_INTERRUPTIBLE); |
480 | 489 | ||
481 | // RX | 490 | /* RX */ |
482 | while ((skb = skb_dequeue(&sk->sk_receive_queue))) { | 491 | while ((skb = skb_dequeue(&sk->sk_receive_queue))) { |
483 | skb_orphan(skb); | 492 | skb_orphan(skb); |
484 | bnep_rx_frame(s, skb); | 493 | bnep_rx_frame(s, skb); |
@@ -487,7 +496,7 @@ static int bnep_session(void *arg) | |||
487 | if (sk->sk_state != BT_CONNECTED) | 496 | if (sk->sk_state != BT_CONNECTED) |
488 | break; | 497 | break; |
489 | 498 | ||
490 | // TX | 499 | /* TX */ |
491 | while ((skb = skb_dequeue(&sk->sk_write_queue))) | 500 | while ((skb = skb_dequeue(&sk->sk_write_queue))) |
492 | if (bnep_tx_frame(s, skb)) | 501 | if (bnep_tx_frame(s, skb)) |
493 | break; | 502 | break; |
@@ -555,8 +564,8 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock) | |||
555 | 564 | ||
556 | /* session struct allocated as private part of net_device */ | 565 | /* session struct allocated as private part of net_device */ |
557 | dev = alloc_netdev(sizeof(struct bnep_session), | 566 | dev = alloc_netdev(sizeof(struct bnep_session), |
558 | (*req->device) ? req->device : "bnep%d", | 567 | (*req->device) ? req->device : "bnep%d", |
559 | bnep_net_setup); | 568 | bnep_net_setup); |
560 | if (!dev) | 569 | if (!dev) |
561 | return -ENOMEM; | 570 | return -ENOMEM; |
562 | 571 | ||
@@ -571,7 +580,7 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock) | |||
571 | s = netdev_priv(dev); | 580 | s = netdev_priv(dev); |
572 | 581 | ||
573 | /* This is rx header therefore addresses are swapped. | 582 | /* This is rx header therefore addresses are swapped. |
574 | * ie eh.h_dest is our local address. */ | 583 | * ie. eh.h_dest is our local address. */ |
575 | memcpy(s->eh.h_dest, &src, ETH_ALEN); | 584 | memcpy(s->eh.h_dest, &src, ETH_ALEN); |
576 | memcpy(s->eh.h_source, &dst, ETH_ALEN); | 585 | memcpy(s->eh.h_source, &dst, ETH_ALEN); |
577 | memcpy(dev->dev_addr, s->eh.h_dest, ETH_ALEN); | 586 | memcpy(dev->dev_addr, s->eh.h_dest, ETH_ALEN); |
@@ -597,17 +606,17 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock) | |||
597 | SET_NETDEV_DEVTYPE(dev, &bnep_type); | 606 | SET_NETDEV_DEVTYPE(dev, &bnep_type); |
598 | 607 | ||
599 | err = register_netdev(dev); | 608 | err = register_netdev(dev); |
600 | if (err) { | 609 | if (err) |
601 | goto failed; | 610 | goto failed; |
602 | } | ||
603 | 611 | ||
604 | __bnep_link_session(s); | 612 | __bnep_link_session(s); |
605 | 613 | ||
606 | err = kernel_thread(bnep_session, s, CLONE_KERNEL); | 614 | s->task = kthread_run(bnep_session, s, "kbnepd %s", dev->name); |
607 | if (err < 0) { | 615 | if (IS_ERR(s->task)) { |
608 | /* Session thread start failed, gotta cleanup. */ | 616 | /* Session thread start failed, gotta cleanup. */ |
609 | unregister_netdev(dev); | 617 | unregister_netdev(dev); |
610 | __bnep_unlink_session(s); | 618 | __bnep_unlink_session(s); |
619 | err = PTR_ERR(s->task); | ||
611 | goto failed; | 620 | goto failed; |
612 | } | 621 | } |
613 | 622 | ||
@@ -631,15 +640,9 @@ int bnep_del_connection(struct bnep_conndel_req *req) | |||
631 | down_read(&bnep_session_sem); | 640 | down_read(&bnep_session_sem); |
632 | 641 | ||
633 | s = __bnep_get_session(req->dst); | 642 | s = __bnep_get_session(req->dst); |
634 | if (s) { | 643 | if (s) |
635 | /* Wakeup user-space which is polling for socket errors. | 644 | kthread_stop(s->task); |
636 | * This is temporary hack until we have shutdown in L2CAP */ | 645 | else |
637 | s->sock->sk->sk_err = EUNATCH; | ||
638 | |||
639 | /* Kill session thread */ | ||
640 | atomic_inc(&s->killed); | ||
641 | wake_up_interruptible(sk_sleep(s->sock->sk)); | ||
642 | } else | ||
643 | err = -ENOENT; | 646 | err = -ENOENT; |
644 | 647 | ||
645 | up_read(&bnep_session_sem); | 648 | up_read(&bnep_session_sem); |
diff --git a/net/bluetooth/bnep/sock.c b/net/bluetooth/bnep/sock.c index d935da71ab3b..17800b1d28ea 100644 --- a/net/bluetooth/bnep/sock.c +++ b/net/bluetooth/bnep/sock.c | |||
@@ -39,10 +39,10 @@ | |||
39 | #include <linux/init.h> | 39 | #include <linux/init.h> |
40 | #include <linux/compat.h> | 40 | #include <linux/compat.h> |
41 | #include <linux/gfp.h> | 41 | #include <linux/gfp.h> |
42 | #include <linux/uaccess.h> | ||
42 | #include <net/sock.h> | 43 | #include <net/sock.h> |
43 | 44 | ||
44 | #include <asm/system.h> | 45 | #include <asm/system.h> |
45 | #include <asm/uaccess.h> | ||
46 | 46 | ||
47 | #include "bnep.h" | 47 | #include "bnep.h" |
48 | 48 | ||
diff --git a/net/bluetooth/cmtp/capi.c b/net/bluetooth/cmtp/capi.c index 67cff810c77d..744233cba244 100644 --- a/net/bluetooth/cmtp/capi.c +++ b/net/bluetooth/cmtp/capi.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <linux/ioctl.h> | 35 | #include <linux/ioctl.h> |
36 | #include <linux/file.h> | 36 | #include <linux/file.h> |
37 | #include <linux/wait.h> | 37 | #include <linux/wait.h> |
38 | #include <linux/kthread.h> | ||
38 | #include <net/sock.h> | 39 | #include <net/sock.h> |
39 | 40 | ||
40 | #include <linux/isdn/capilli.h> | 41 | #include <linux/isdn/capilli.h> |
@@ -143,7 +144,7 @@ static void cmtp_send_capimsg(struct cmtp_session *session, struct sk_buff *skb) | |||
143 | 144 | ||
144 | skb_queue_tail(&session->transmit, skb); | 145 | skb_queue_tail(&session->transmit, skb); |
145 | 146 | ||
146 | cmtp_schedule(session); | 147 | wake_up_interruptible(sk_sleep(session->sock->sk)); |
147 | } | 148 | } |
148 | 149 | ||
149 | static void cmtp_send_interopmsg(struct cmtp_session *session, | 150 | static void cmtp_send_interopmsg(struct cmtp_session *session, |
@@ -386,8 +387,7 @@ static void cmtp_reset_ctr(struct capi_ctr *ctrl) | |||
386 | 387 | ||
387 | capi_ctr_down(ctrl); | 388 | capi_ctr_down(ctrl); |
388 | 389 | ||
389 | atomic_inc(&session->terminate); | 390 | kthread_stop(session->task); |
390 | cmtp_schedule(session); | ||
391 | } | 391 | } |
392 | 392 | ||
393 | static void cmtp_register_appl(struct capi_ctr *ctrl, __u16 appl, capi_register_params *rp) | 393 | static void cmtp_register_appl(struct capi_ctr *ctrl, __u16 appl, capi_register_params *rp) |
diff --git a/net/bluetooth/cmtp/cmtp.h b/net/bluetooth/cmtp/cmtp.h index 785e79e953c5..db43b54ac9af 100644 --- a/net/bluetooth/cmtp/cmtp.h +++ b/net/bluetooth/cmtp/cmtp.h | |||
@@ -37,7 +37,7 @@ | |||
37 | #define CMTP_LOOPBACK 0 | 37 | #define CMTP_LOOPBACK 0 |
38 | 38 | ||
39 | struct cmtp_connadd_req { | 39 | struct cmtp_connadd_req { |
40 | int sock; // Connected socket | 40 | int sock; /* Connected socket */ |
41 | __u32 flags; | 41 | __u32 flags; |
42 | }; | 42 | }; |
43 | 43 | ||
@@ -81,7 +81,7 @@ struct cmtp_session { | |||
81 | 81 | ||
82 | char name[BTNAMSIZ]; | 82 | char name[BTNAMSIZ]; |
83 | 83 | ||
84 | atomic_t terminate; | 84 | struct task_struct *task; |
85 | 85 | ||
86 | wait_queue_head_t wait; | 86 | wait_queue_head_t wait; |
87 | 87 | ||
@@ -121,13 +121,6 @@ void cmtp_detach_device(struct cmtp_session *session); | |||
121 | 121 | ||
122 | void cmtp_recv_capimsg(struct cmtp_session *session, struct sk_buff *skb); | 122 | void cmtp_recv_capimsg(struct cmtp_session *session, struct sk_buff *skb); |
123 | 123 | ||
124 | static inline void cmtp_schedule(struct cmtp_session *session) | ||
125 | { | ||
126 | struct sock *sk = session->sock->sk; | ||
127 | |||
128 | wake_up_interruptible(sk_sleep(sk)); | ||
129 | } | ||
130 | |||
131 | /* CMTP init defines */ | 124 | /* CMTP init defines */ |
132 | int cmtp_init_sockets(void); | 125 | int cmtp_init_sockets(void); |
133 | void cmtp_cleanup_sockets(void); | 126 | void cmtp_cleanup_sockets(void); |
diff --git a/net/bluetooth/cmtp/core.c b/net/bluetooth/cmtp/core.c index 964ea9126f9f..c5b11af908be 100644 --- a/net/bluetooth/cmtp/core.c +++ b/net/bluetooth/cmtp/core.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <linux/ioctl.h> | 35 | #include <linux/ioctl.h> |
36 | #include <linux/file.h> | 36 | #include <linux/file.h> |
37 | #include <linux/init.h> | 37 | #include <linux/init.h> |
38 | #include <linux/kthread.h> | ||
38 | #include <net/sock.h> | 39 | #include <net/sock.h> |
39 | 40 | ||
40 | #include <linux/isdn/capilli.h> | 41 | #include <linux/isdn/capilli.h> |
@@ -235,9 +236,12 @@ static void cmtp_process_transmit(struct cmtp_session *session) | |||
235 | 236 | ||
236 | size = min_t(uint, ((tail < 258) ? (tail - 2) : (tail - 3)), skb->len); | 237 | size = min_t(uint, ((tail < 258) ? (tail - 2) : (tail - 3)), skb->len); |
237 | 238 | ||
238 | if ((scb->id < 0) && ((scb->id = cmtp_alloc_block_id(session)) < 0)) { | 239 | if (scb->id < 0) { |
239 | skb_queue_head(&session->transmit, skb); | 240 | scb->id = cmtp_alloc_block_id(session); |
240 | break; | 241 | if (scb->id < 0) { |
242 | skb_queue_head(&session->transmit, skb); | ||
243 | break; | ||
244 | } | ||
241 | } | 245 | } |
242 | 246 | ||
243 | if (size < 256) { | 247 | if (size < 256) { |
@@ -284,12 +288,11 @@ static int cmtp_session(void *arg) | |||
284 | 288 | ||
285 | BT_DBG("session %p", session); | 289 | BT_DBG("session %p", session); |
286 | 290 | ||
287 | daemonize("kcmtpd_ctr_%d", session->num); | ||
288 | set_user_nice(current, -15); | 291 | set_user_nice(current, -15); |
289 | 292 | ||
290 | init_waitqueue_entry(&wait, current); | 293 | init_waitqueue_entry(&wait, current); |
291 | add_wait_queue(sk_sleep(sk), &wait); | 294 | add_wait_queue(sk_sleep(sk), &wait); |
292 | while (!atomic_read(&session->terminate)) { | 295 | while (!kthread_should_stop()) { |
293 | set_current_state(TASK_INTERRUPTIBLE); | 296 | set_current_state(TASK_INTERRUPTIBLE); |
294 | 297 | ||
295 | if (sk->sk_state != BT_CONNECTED) | 298 | if (sk->sk_state != BT_CONNECTED) |
@@ -343,7 +346,8 @@ int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock) | |||
343 | 346 | ||
344 | bacpy(&session->bdaddr, &bt_sk(sock->sk)->dst); | 347 | bacpy(&session->bdaddr, &bt_sk(sock->sk)->dst); |
345 | 348 | ||
346 | session->mtu = min_t(uint, l2cap_pi(sock->sk)->omtu, l2cap_pi(sock->sk)->imtu); | 349 | session->mtu = min_t(uint, l2cap_pi(sock->sk)->chan->omtu, |
350 | l2cap_pi(sock->sk)->chan->imtu); | ||
347 | 351 | ||
348 | BT_DBG("mtu %d", session->mtu); | 352 | BT_DBG("mtu %d", session->mtu); |
349 | 353 | ||
@@ -367,9 +371,12 @@ int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock) | |||
367 | 371 | ||
368 | __cmtp_link_session(session); | 372 | __cmtp_link_session(session); |
369 | 373 | ||
370 | err = kernel_thread(cmtp_session, session, CLONE_KERNEL); | 374 | session->task = kthread_run(cmtp_session, session, "kcmtpd_ctr_%d", |
371 | if (err < 0) | 375 | session->num); |
376 | if (IS_ERR(session->task)) { | ||
377 | err = PTR_ERR(session->task); | ||
372 | goto unlink; | 378 | goto unlink; |
379 | } | ||
373 | 380 | ||
374 | if (!(session->flags & (1 << CMTP_LOOPBACK))) { | 381 | if (!(session->flags & (1 << CMTP_LOOPBACK))) { |
375 | err = cmtp_attach_device(session); | 382 | err = cmtp_attach_device(session); |
@@ -406,9 +413,8 @@ int cmtp_del_connection(struct cmtp_conndel_req *req) | |||
406 | /* Flush the transmit queue */ | 413 | /* Flush the transmit queue */ |
407 | skb_queue_purge(&session->transmit); | 414 | skb_queue_purge(&session->transmit); |
408 | 415 | ||
409 | /* Kill session thread */ | 416 | /* Stop session thread */ |
410 | atomic_inc(&session->terminate); | 417 | kthread_stop(session->task); |
411 | cmtp_schedule(session); | ||
412 | } else | 418 | } else |
413 | err = -ENOENT; | 419 | err = -ENOENT; |
414 | 420 | ||
diff --git a/net/bluetooth/cmtp/sock.c b/net/bluetooth/cmtp/sock.c index 7ea1979a8e4f..3f2dd5c25ae5 100644 --- a/net/bluetooth/cmtp/sock.c +++ b/net/bluetooth/cmtp/sock.c | |||
@@ -34,12 +34,12 @@ | |||
34 | #include <linux/file.h> | 34 | #include <linux/file.h> |
35 | #include <linux/compat.h> | 35 | #include <linux/compat.h> |
36 | #include <linux/gfp.h> | 36 | #include <linux/gfp.h> |
37 | #include <linux/uaccess.h> | ||
37 | #include <net/sock.h> | 38 | #include <net/sock.h> |
38 | 39 | ||
39 | #include <linux/isdn/capilli.h> | 40 | #include <linux/isdn/capilli.h> |
40 | 41 | ||
41 | #include <asm/system.h> | 42 | #include <asm/system.h> |
42 | #include <asm/uaccess.h> | ||
43 | 43 | ||
44 | #include "cmtp.h" | 44 | #include "cmtp.h" |
45 | 45 | ||
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index 7a6f56b2f49d..3163330cd4f1 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
@@ -269,6 +269,19 @@ static void hci_conn_idle(unsigned long arg) | |||
269 | hci_conn_enter_sniff_mode(conn); | 269 | hci_conn_enter_sniff_mode(conn); |
270 | } | 270 | } |
271 | 271 | ||
272 | static void hci_conn_auto_accept(unsigned long arg) | ||
273 | { | ||
274 | struct hci_conn *conn = (void *) arg; | ||
275 | struct hci_dev *hdev = conn->hdev; | ||
276 | |||
277 | hci_dev_lock(hdev); | ||
278 | |||
279 | hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY, sizeof(conn->dst), | ||
280 | &conn->dst); | ||
281 | |||
282 | hci_dev_unlock(hdev); | ||
283 | } | ||
284 | |||
272 | struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) | 285 | struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) |
273 | { | 286 | { |
274 | struct hci_conn *conn; | 287 | struct hci_conn *conn; |
@@ -287,6 +300,7 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) | |||
287 | conn->auth_type = HCI_AT_GENERAL_BONDING; | 300 | conn->auth_type = HCI_AT_GENERAL_BONDING; |
288 | conn->io_capability = hdev->io_capability; | 301 | conn->io_capability = hdev->io_capability; |
289 | conn->remote_auth = 0xff; | 302 | conn->remote_auth = 0xff; |
303 | conn->key_type = 0xff; | ||
290 | 304 | ||
291 | conn->power_save = 1; | 305 | conn->power_save = 1; |
292 | conn->disc_timeout = HCI_DISCONN_TIMEOUT; | 306 | conn->disc_timeout = HCI_DISCONN_TIMEOUT; |
@@ -311,6 +325,8 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) | |||
311 | 325 | ||
312 | setup_timer(&conn->disc_timer, hci_conn_timeout, (unsigned long)conn); | 326 | setup_timer(&conn->disc_timer, hci_conn_timeout, (unsigned long)conn); |
313 | setup_timer(&conn->idle_timer, hci_conn_idle, (unsigned long)conn); | 327 | setup_timer(&conn->idle_timer, hci_conn_idle, (unsigned long)conn); |
328 | setup_timer(&conn->auto_accept_timer, hci_conn_auto_accept, | ||
329 | (unsigned long) conn); | ||
314 | 330 | ||
315 | atomic_set(&conn->refcnt, 0); | 331 | atomic_set(&conn->refcnt, 0); |
316 | 332 | ||
@@ -341,6 +357,8 @@ int hci_conn_del(struct hci_conn *conn) | |||
341 | 357 | ||
342 | del_timer(&conn->disc_timer); | 358 | del_timer(&conn->disc_timer); |
343 | 359 | ||
360 | del_timer(&conn->auto_accept_timer); | ||
361 | |||
344 | if (conn->type == ACL_LINK) { | 362 | if (conn->type == ACL_LINK) { |
345 | struct hci_conn *sco = conn->link; | 363 | struct hci_conn *sco = conn->link; |
346 | if (sco) | 364 | if (sco) |
@@ -535,36 +553,93 @@ static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) | |||
535 | return 0; | 553 | return 0; |
536 | } | 554 | } |
537 | 555 | ||
556 | /* Encrypt the the link */ | ||
557 | static void hci_conn_encrypt(struct hci_conn *conn) | ||
558 | { | ||
559 | BT_DBG("conn %p", conn); | ||
560 | |||
561 | if (!test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend)) { | ||
562 | struct hci_cp_set_conn_encrypt cp; | ||
563 | cp.handle = cpu_to_le16(conn->handle); | ||
564 | cp.encrypt = 0x01; | ||
565 | hci_send_cmd(conn->hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp), | ||
566 | &cp); | ||
567 | } | ||
568 | } | ||
569 | |||
538 | /* Enable security */ | 570 | /* Enable security */ |
539 | int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) | 571 | int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) |
540 | { | 572 | { |
541 | BT_DBG("conn %p", conn); | 573 | BT_DBG("conn %p", conn); |
542 | 574 | ||
575 | /* For sdp we don't need the link key. */ | ||
543 | if (sec_level == BT_SECURITY_SDP) | 576 | if (sec_level == BT_SECURITY_SDP) |
544 | return 1; | 577 | return 1; |
545 | 578 | ||
579 | /* For non 2.1 devices and low security level we don't need the link | ||
580 | key. */ | ||
546 | if (sec_level == BT_SECURITY_LOW && | 581 | if (sec_level == BT_SECURITY_LOW && |
547 | (!conn->ssp_mode || !conn->hdev->ssp_mode)) | 582 | (!conn->ssp_mode || !conn->hdev->ssp_mode)) |
548 | return 1; | 583 | return 1; |
549 | 584 | ||
550 | if (conn->link_mode & HCI_LM_ENCRYPT) | 585 | /* For other security levels we need the link key. */ |
551 | return hci_conn_auth(conn, sec_level, auth_type); | 586 | if (!(conn->link_mode & HCI_LM_AUTH)) |
552 | 587 | goto auth; | |
588 | |||
589 | /* An authenticated combination key has sufficient security for any | ||
590 | security level. */ | ||
591 | if (conn->key_type == HCI_LK_AUTH_COMBINATION) | ||
592 | goto encrypt; | ||
593 | |||
594 | /* An unauthenticated combination key has sufficient security for | ||
595 | security level 1 and 2. */ | ||
596 | if (conn->key_type == HCI_LK_UNAUTH_COMBINATION && | ||
597 | (sec_level == BT_SECURITY_MEDIUM || | ||
598 | sec_level == BT_SECURITY_LOW)) | ||
599 | goto encrypt; | ||
600 | |||
601 | /* A combination key has always sufficient security for the security | ||
602 | levels 1 or 2. High security level requires the combination key | ||
603 | is generated using maximum PIN code length (16). | ||
604 | For pre 2.1 units. */ | ||
605 | if (conn->key_type == HCI_LK_COMBINATION && | ||
606 | (sec_level != BT_SECURITY_HIGH || | ||
607 | conn->pin_length == 16)) | ||
608 | goto encrypt; | ||
609 | |||
610 | auth: | ||
553 | if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend)) | 611 | if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend)) |
554 | return 0; | 612 | return 0; |
555 | 613 | ||
556 | if (hci_conn_auth(conn, sec_level, auth_type)) { | 614 | hci_conn_auth(conn, sec_level, auth_type); |
557 | struct hci_cp_set_conn_encrypt cp; | 615 | return 0; |
558 | cp.handle = cpu_to_le16(conn->handle); | 616 | |
559 | cp.encrypt = 1; | 617 | encrypt: |
560 | hci_send_cmd(conn->hdev, HCI_OP_SET_CONN_ENCRYPT, | 618 | if (conn->link_mode & HCI_LM_ENCRYPT) |
561 | sizeof(cp), &cp); | 619 | return 1; |
562 | } | ||
563 | 620 | ||
621 | hci_conn_encrypt(conn); | ||
564 | return 0; | 622 | return 0; |
565 | } | 623 | } |
566 | EXPORT_SYMBOL(hci_conn_security); | 624 | EXPORT_SYMBOL(hci_conn_security); |
567 | 625 | ||
626 | /* Check secure link requirement */ | ||
627 | int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level) | ||
628 | { | ||
629 | BT_DBG("conn %p", conn); | ||
630 | |||
631 | if (sec_level != BT_SECURITY_HIGH) | ||
632 | return 1; /* Accept if non-secure is required */ | ||
633 | |||
634 | if (conn->key_type == HCI_LK_AUTH_COMBINATION || | ||
635 | (conn->key_type == HCI_LK_COMBINATION && | ||
636 | conn->pin_length == 16)) | ||
637 | return 1; | ||
638 | |||
639 | return 0; /* Reject not secure link */ | ||
640 | } | ||
641 | EXPORT_SYMBOL(hci_conn_check_secure); | ||
642 | |||
568 | /* Change link key */ | 643 | /* Change link key */ |
569 | int hci_conn_change_link_key(struct hci_conn *conn) | 644 | int hci_conn_change_link_key(struct hci_conn *conn) |
570 | { | 645 | { |
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index b5a8afc2be33..815269b07f20 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
@@ -56,7 +56,6 @@ | |||
56 | static void hci_cmd_task(unsigned long arg); | 56 | static void hci_cmd_task(unsigned long arg); |
57 | static void hci_rx_task(unsigned long arg); | 57 | static void hci_rx_task(unsigned long arg); |
58 | static void hci_tx_task(unsigned long arg); | 58 | static void hci_tx_task(unsigned long arg); |
59 | static void hci_notify(struct hci_dev *hdev, int event); | ||
60 | 59 | ||
61 | static DEFINE_RWLOCK(hci_task_lock); | 60 | static DEFINE_RWLOCK(hci_task_lock); |
62 | 61 | ||
@@ -1021,18 +1020,54 @@ struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr) | |||
1021 | return NULL; | 1020 | return NULL; |
1022 | } | 1021 | } |
1023 | 1022 | ||
1024 | int hci_add_link_key(struct hci_dev *hdev, int new_key, bdaddr_t *bdaddr, | 1023 | static int hci_persistent_key(struct hci_dev *hdev, struct hci_conn *conn, |
1025 | u8 *val, u8 type, u8 pin_len) | 1024 | u8 key_type, u8 old_key_type) |
1025 | { | ||
1026 | /* Legacy key */ | ||
1027 | if (key_type < 0x03) | ||
1028 | return 1; | ||
1029 | |||
1030 | /* Debug keys are insecure so don't store them persistently */ | ||
1031 | if (key_type == HCI_LK_DEBUG_COMBINATION) | ||
1032 | return 0; | ||
1033 | |||
1034 | /* Changed combination key and there's no previous one */ | ||
1035 | if (key_type == HCI_LK_CHANGED_COMBINATION && old_key_type == 0xff) | ||
1036 | return 0; | ||
1037 | |||
1038 | /* Security mode 3 case */ | ||
1039 | if (!conn) | ||
1040 | return 1; | ||
1041 | |||
1042 | /* Neither local nor remote side had no-bonding as requirement */ | ||
1043 | if (conn->auth_type > 0x01 && conn->remote_auth > 0x01) | ||
1044 | return 1; | ||
1045 | |||
1046 | /* Local side had dedicated bonding as requirement */ | ||
1047 | if (conn->auth_type == 0x02 || conn->auth_type == 0x03) | ||
1048 | return 1; | ||
1049 | |||
1050 | /* Remote side had dedicated bonding as requirement */ | ||
1051 | if (conn->remote_auth == 0x02 || conn->remote_auth == 0x03) | ||
1052 | return 1; | ||
1053 | |||
1054 | /* If none of the above criteria match, then don't store the key | ||
1055 | * persistently */ | ||
1056 | return 0; | ||
1057 | } | ||
1058 | |||
1059 | int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key, | ||
1060 | bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len) | ||
1026 | { | 1061 | { |
1027 | struct link_key *key, *old_key; | 1062 | struct link_key *key, *old_key; |
1028 | u8 old_key_type; | 1063 | u8 old_key_type, persistent; |
1029 | 1064 | ||
1030 | old_key = hci_find_link_key(hdev, bdaddr); | 1065 | old_key = hci_find_link_key(hdev, bdaddr); |
1031 | if (old_key) { | 1066 | if (old_key) { |
1032 | old_key_type = old_key->type; | 1067 | old_key_type = old_key->type; |
1033 | key = old_key; | 1068 | key = old_key; |
1034 | } else { | 1069 | } else { |
1035 | old_key_type = 0xff; | 1070 | old_key_type = conn ? conn->key_type : 0xff; |
1036 | key = kzalloc(sizeof(*key), GFP_ATOMIC); | 1071 | key = kzalloc(sizeof(*key), GFP_ATOMIC); |
1037 | if (!key) | 1072 | if (!key) |
1038 | return -ENOMEM; | 1073 | return -ENOMEM; |
@@ -1041,16 +1076,37 @@ int hci_add_link_key(struct hci_dev *hdev, int new_key, bdaddr_t *bdaddr, | |||
1041 | 1076 | ||
1042 | BT_DBG("%s key for %s type %u", hdev->name, batostr(bdaddr), type); | 1077 | BT_DBG("%s key for %s type %u", hdev->name, batostr(bdaddr), type); |
1043 | 1078 | ||
1079 | /* Some buggy controller combinations generate a changed | ||
1080 | * combination key for legacy pairing even when there's no | ||
1081 | * previous key */ | ||
1082 | if (type == HCI_LK_CHANGED_COMBINATION && | ||
1083 | (!conn || conn->remote_auth == 0xff) && | ||
1084 | old_key_type == 0xff) { | ||
1085 | type = HCI_LK_COMBINATION; | ||
1086 | if (conn) | ||
1087 | conn->key_type = type; | ||
1088 | } | ||
1089 | |||
1044 | bacpy(&key->bdaddr, bdaddr); | 1090 | bacpy(&key->bdaddr, bdaddr); |
1045 | memcpy(key->val, val, 16); | 1091 | memcpy(key->val, val, 16); |
1046 | key->type = type; | ||
1047 | key->pin_len = pin_len; | 1092 | key->pin_len = pin_len; |
1048 | 1093 | ||
1049 | if (new_key) | 1094 | if (type == HCI_LK_CHANGED_COMBINATION) |
1050 | mgmt_new_key(hdev->id, key, old_key_type); | ||
1051 | |||
1052 | if (type == 0x06) | ||
1053 | key->type = old_key_type; | 1095 | key->type = old_key_type; |
1096 | else | ||
1097 | key->type = type; | ||
1098 | |||
1099 | if (!new_key) | ||
1100 | return 0; | ||
1101 | |||
1102 | persistent = hci_persistent_key(hdev, conn, type, old_key_type); | ||
1103 | |||
1104 | mgmt_new_key(hdev->id, key, persistent); | ||
1105 | |||
1106 | if (!persistent) { | ||
1107 | list_del(&key->list); | ||
1108 | kfree(key); | ||
1109 | } | ||
1054 | 1110 | ||
1055 | return 0; | 1111 | return 0; |
1056 | } | 1112 | } |
@@ -1082,6 +1138,70 @@ static void hci_cmd_timer(unsigned long arg) | |||
1082 | tasklet_schedule(&hdev->cmd_task); | 1138 | tasklet_schedule(&hdev->cmd_task); |
1083 | } | 1139 | } |
1084 | 1140 | ||
1141 | struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev, | ||
1142 | bdaddr_t *bdaddr) | ||
1143 | { | ||
1144 | struct oob_data *data; | ||
1145 | |||
1146 | list_for_each_entry(data, &hdev->remote_oob_data, list) | ||
1147 | if (bacmp(bdaddr, &data->bdaddr) == 0) | ||
1148 | return data; | ||
1149 | |||
1150 | return NULL; | ||
1151 | } | ||
1152 | |||
1153 | int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr) | ||
1154 | { | ||
1155 | struct oob_data *data; | ||
1156 | |||
1157 | data = hci_find_remote_oob_data(hdev, bdaddr); | ||
1158 | if (!data) | ||
1159 | return -ENOENT; | ||
1160 | |||
1161 | BT_DBG("%s removing %s", hdev->name, batostr(bdaddr)); | ||
1162 | |||
1163 | list_del(&data->list); | ||
1164 | kfree(data); | ||
1165 | |||
1166 | return 0; | ||
1167 | } | ||
1168 | |||
1169 | int hci_remote_oob_data_clear(struct hci_dev *hdev) | ||
1170 | { | ||
1171 | struct oob_data *data, *n; | ||
1172 | |||
1173 | list_for_each_entry_safe(data, n, &hdev->remote_oob_data, list) { | ||
1174 | list_del(&data->list); | ||
1175 | kfree(data); | ||
1176 | } | ||
1177 | |||
1178 | return 0; | ||
1179 | } | ||
1180 | |||
1181 | int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash, | ||
1182 | u8 *randomizer) | ||
1183 | { | ||
1184 | struct oob_data *data; | ||
1185 | |||
1186 | data = hci_find_remote_oob_data(hdev, bdaddr); | ||
1187 | |||
1188 | if (!data) { | ||
1189 | data = kmalloc(sizeof(*data), GFP_ATOMIC); | ||
1190 | if (!data) | ||
1191 | return -ENOMEM; | ||
1192 | |||
1193 | bacpy(&data->bdaddr, bdaddr); | ||
1194 | list_add(&data->list, &hdev->remote_oob_data); | ||
1195 | } | ||
1196 | |||
1197 | memcpy(data->hash, hash, sizeof(data->hash)); | ||
1198 | memcpy(data->randomizer, randomizer, sizeof(data->randomizer)); | ||
1199 | |||
1200 | BT_DBG("%s for %s", hdev->name, batostr(bdaddr)); | ||
1201 | |||
1202 | return 0; | ||
1203 | } | ||
1204 | |||
1085 | /* Register HCI device */ | 1205 | /* Register HCI device */ |
1086 | int hci_register_dev(struct hci_dev *hdev) | 1206 | int hci_register_dev(struct hci_dev *hdev) |
1087 | { | 1207 | { |
@@ -1146,6 +1266,8 @@ int hci_register_dev(struct hci_dev *hdev) | |||
1146 | 1266 | ||
1147 | INIT_LIST_HEAD(&hdev->link_keys); | 1267 | INIT_LIST_HEAD(&hdev->link_keys); |
1148 | 1268 | ||
1269 | INIT_LIST_HEAD(&hdev->remote_oob_data); | ||
1270 | |||
1149 | INIT_WORK(&hdev->power_on, hci_power_on); | 1271 | INIT_WORK(&hdev->power_on, hci_power_on); |
1150 | INIT_WORK(&hdev->power_off, hci_power_off); | 1272 | INIT_WORK(&hdev->power_off, hci_power_off); |
1151 | setup_timer(&hdev->off_timer, hci_auto_off, (unsigned long) hdev); | 1273 | setup_timer(&hdev->off_timer, hci_auto_off, (unsigned long) hdev); |
@@ -1225,6 +1347,7 @@ int hci_unregister_dev(struct hci_dev *hdev) | |||
1225 | hci_blacklist_clear(hdev); | 1347 | hci_blacklist_clear(hdev); |
1226 | hci_uuids_clear(hdev); | 1348 | hci_uuids_clear(hdev); |
1227 | hci_link_keys_clear(hdev); | 1349 | hci_link_keys_clear(hdev); |
1350 | hci_remote_oob_data_clear(hdev); | ||
1228 | hci_dev_unlock_bh(hdev); | 1351 | hci_dev_unlock_bh(hdev); |
1229 | 1352 | ||
1230 | __hci_dev_put(hdev); | 1353 | __hci_dev_put(hdev); |
@@ -1274,7 +1397,7 @@ int hci_recv_frame(struct sk_buff *skb) | |||
1274 | EXPORT_SYMBOL(hci_recv_frame); | 1397 | EXPORT_SYMBOL(hci_recv_frame); |
1275 | 1398 | ||
1276 | static int hci_reassembly(struct hci_dev *hdev, int type, void *data, | 1399 | static int hci_reassembly(struct hci_dev *hdev, int type, void *data, |
1277 | int count, __u8 index, gfp_t gfp_mask) | 1400 | int count, __u8 index) |
1278 | { | 1401 | { |
1279 | int len = 0; | 1402 | int len = 0; |
1280 | int hlen = 0; | 1403 | int hlen = 0; |
@@ -1304,7 +1427,7 @@ static int hci_reassembly(struct hci_dev *hdev, int type, void *data, | |||
1304 | break; | 1427 | break; |
1305 | } | 1428 | } |
1306 | 1429 | ||
1307 | skb = bt_skb_alloc(len, gfp_mask); | 1430 | skb = bt_skb_alloc(len, GFP_ATOMIC); |
1308 | if (!skb) | 1431 | if (!skb) |
1309 | return -ENOMEM; | 1432 | return -ENOMEM; |
1310 | 1433 | ||
@@ -1390,8 +1513,7 @@ int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count) | |||
1390 | return -EILSEQ; | 1513 | return -EILSEQ; |
1391 | 1514 | ||
1392 | while (count) { | 1515 | while (count) { |
1393 | rem = hci_reassembly(hdev, type, data, count, | 1516 | rem = hci_reassembly(hdev, type, data, count, type - 1); |
1394 | type - 1, GFP_ATOMIC); | ||
1395 | if (rem < 0) | 1517 | if (rem < 0) |
1396 | return rem; | 1518 | return rem; |
1397 | 1519 | ||
@@ -1425,8 +1547,8 @@ int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count) | |||
1425 | } else | 1547 | } else |
1426 | type = bt_cb(skb)->pkt_type; | 1548 | type = bt_cb(skb)->pkt_type; |
1427 | 1549 | ||
1428 | rem = hci_reassembly(hdev, type, data, | 1550 | rem = hci_reassembly(hdev, type, data, count, |
1429 | count, STREAM_REASSEMBLY, GFP_ATOMIC); | 1551 | STREAM_REASSEMBLY); |
1430 | if (rem < 0) | 1552 | if (rem < 0) |
1431 | return rem; | 1553 | return rem; |
1432 | 1554 | ||
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index b2570159a044..f13ddbf858ba 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
@@ -56,7 +56,9 @@ static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb) | |||
56 | if (status) | 56 | if (status) |
57 | return; | 57 | return; |
58 | 58 | ||
59 | clear_bit(HCI_INQUIRY, &hdev->flags); | 59 | if (test_bit(HCI_MGMT, &hdev->flags) && |
60 | test_and_clear_bit(HCI_INQUIRY, &hdev->flags)) | ||
61 | mgmt_discovering(hdev->id, 0); | ||
60 | 62 | ||
61 | hci_req_complete(hdev, HCI_OP_INQUIRY_CANCEL, status); | 63 | hci_req_complete(hdev, HCI_OP_INQUIRY_CANCEL, status); |
62 | 64 | ||
@@ -72,7 +74,9 @@ static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb) | |||
72 | if (status) | 74 | if (status) |
73 | return; | 75 | return; |
74 | 76 | ||
75 | clear_bit(HCI_INQUIRY, &hdev->flags); | 77 | if (test_bit(HCI_MGMT, &hdev->flags) && |
78 | test_and_clear_bit(HCI_INQUIRY, &hdev->flags)) | ||
79 | mgmt_discovering(hdev->id, 0); | ||
76 | 80 | ||
77 | hci_conn_check_pending(hdev); | 81 | hci_conn_check_pending(hdev); |
78 | } | 82 | } |
@@ -195,14 +199,17 @@ static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb) | |||
195 | 199 | ||
196 | BT_DBG("%s status 0x%x", hdev->name, status); | 200 | BT_DBG("%s status 0x%x", hdev->name, status); |
197 | 201 | ||
198 | if (status) | ||
199 | return; | ||
200 | |||
201 | sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LOCAL_NAME); | 202 | sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LOCAL_NAME); |
202 | if (!sent) | 203 | if (!sent) |
203 | return; | 204 | return; |
204 | 205 | ||
205 | memcpy(hdev->dev_name, sent, 248); | 206 | if (test_bit(HCI_MGMT, &hdev->flags)) |
207 | mgmt_set_local_name_complete(hdev->id, sent, status); | ||
208 | |||
209 | if (status) | ||
210 | return; | ||
211 | |||
212 | memcpy(hdev->dev_name, sent, HCI_MAX_NAME_LENGTH); | ||
206 | } | 213 | } |
207 | 214 | ||
208 | static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb) | 215 | static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb) |
@@ -214,7 +221,7 @@ static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb) | |||
214 | if (rp->status) | 221 | if (rp->status) |
215 | return; | 222 | return; |
216 | 223 | ||
217 | memcpy(hdev->dev_name, rp->name, 248); | 224 | memcpy(hdev->dev_name, rp->name, HCI_MAX_NAME_LENGTH); |
218 | } | 225 | } |
219 | 226 | ||
220 | static void hci_cc_write_auth_enable(struct hci_dev *hdev, struct sk_buff *skb) | 227 | static void hci_cc_write_auth_enable(struct hci_dev *hdev, struct sk_buff *skb) |
@@ -821,16 +828,31 @@ static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev, | |||
821 | rp->status); | 828 | rp->status); |
822 | } | 829 | } |
823 | 830 | ||
831 | static void hci_cc_read_local_oob_data_reply(struct hci_dev *hdev, | ||
832 | struct sk_buff *skb) | ||
833 | { | ||
834 | struct hci_rp_read_local_oob_data *rp = (void *) skb->data; | ||
835 | |||
836 | BT_DBG("%s status 0x%x", hdev->name, rp->status); | ||
837 | |||
838 | mgmt_read_local_oob_data_reply_complete(hdev->id, rp->hash, | ||
839 | rp->randomizer, rp->status); | ||
840 | } | ||
841 | |||
824 | static inline void hci_cs_inquiry(struct hci_dev *hdev, __u8 status) | 842 | static inline void hci_cs_inquiry(struct hci_dev *hdev, __u8 status) |
825 | { | 843 | { |
826 | BT_DBG("%s status 0x%x", hdev->name, status); | 844 | BT_DBG("%s status 0x%x", hdev->name, status); |
827 | 845 | ||
828 | if (status) { | 846 | if (status) { |
829 | hci_req_complete(hdev, HCI_OP_INQUIRY, status); | 847 | hci_req_complete(hdev, HCI_OP_INQUIRY, status); |
830 | |||
831 | hci_conn_check_pending(hdev); | 848 | hci_conn_check_pending(hdev); |
832 | } else | 849 | return; |
833 | set_bit(HCI_INQUIRY, &hdev->flags); | 850 | } |
851 | |||
852 | if (test_bit(HCI_MGMT, &hdev->flags) && | ||
853 | !test_and_set_bit(HCI_INQUIRY, | ||
854 | &hdev->flags)) | ||
855 | mgmt_discovering(hdev->id, 1); | ||
834 | } | 856 | } |
835 | 857 | ||
836 | static inline void hci_cs_create_conn(struct hci_dev *hdev, __u8 status) | 858 | static inline void hci_cs_create_conn(struct hci_dev *hdev, __u8 status) |
@@ -999,12 +1021,19 @@ static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status) | |||
999 | hci_dev_lock(hdev); | 1021 | hci_dev_lock(hdev); |
1000 | 1022 | ||
1001 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr); | 1023 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr); |
1002 | if (conn && hci_outgoing_auth_needed(hdev, conn)) { | 1024 | if (!conn) |
1025 | goto unlock; | ||
1026 | |||
1027 | if (!hci_outgoing_auth_needed(hdev, conn)) | ||
1028 | goto unlock; | ||
1029 | |||
1030 | if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) { | ||
1003 | struct hci_cp_auth_requested cp; | 1031 | struct hci_cp_auth_requested cp; |
1004 | cp.handle = __cpu_to_le16(conn->handle); | 1032 | cp.handle = __cpu_to_le16(conn->handle); |
1005 | hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp); | 1033 | hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp); |
1006 | } | 1034 | } |
1007 | 1035 | ||
1036 | unlock: | ||
1008 | hci_dev_unlock(hdev); | 1037 | hci_dev_unlock(hdev); |
1009 | } | 1038 | } |
1010 | 1039 | ||
@@ -1194,7 +1223,9 @@ static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff | |||
1194 | 1223 | ||
1195 | BT_DBG("%s status %d", hdev->name, status); | 1224 | BT_DBG("%s status %d", hdev->name, status); |
1196 | 1225 | ||
1197 | clear_bit(HCI_INQUIRY, &hdev->flags); | 1226 | if (test_bit(HCI_MGMT, &hdev->flags) && |
1227 | test_and_clear_bit(HCI_INQUIRY, &hdev->flags)) | ||
1228 | mgmt_discovering(hdev->id, 0); | ||
1198 | 1229 | ||
1199 | hci_req_complete(hdev, HCI_OP_INQUIRY, status); | 1230 | hci_req_complete(hdev, HCI_OP_INQUIRY, status); |
1200 | 1231 | ||
@@ -1214,7 +1245,13 @@ static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff * | |||
1214 | 1245 | ||
1215 | hci_dev_lock(hdev); | 1246 | hci_dev_lock(hdev); |
1216 | 1247 | ||
1217 | for (; num_rsp; num_rsp--) { | 1248 | if (!test_and_set_bit(HCI_INQUIRY, &hdev->flags)) { |
1249 | |||
1250 | if (test_bit(HCI_MGMT, &hdev->flags)) | ||
1251 | mgmt_discovering(hdev->id, 1); | ||
1252 | } | ||
1253 | |||
1254 | for (; num_rsp; num_rsp--, info++) { | ||
1218 | bacpy(&data.bdaddr, &info->bdaddr); | 1255 | bacpy(&data.bdaddr, &info->bdaddr); |
1219 | data.pscan_rep_mode = info->pscan_rep_mode; | 1256 | data.pscan_rep_mode = info->pscan_rep_mode; |
1220 | data.pscan_period_mode = info->pscan_period_mode; | 1257 | data.pscan_period_mode = info->pscan_period_mode; |
@@ -1223,8 +1260,9 @@ static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff * | |||
1223 | data.clock_offset = info->clock_offset; | 1260 | data.clock_offset = info->clock_offset; |
1224 | data.rssi = 0x00; | 1261 | data.rssi = 0x00; |
1225 | data.ssp_mode = 0x00; | 1262 | data.ssp_mode = 0x00; |
1226 | info++; | ||
1227 | hci_inquiry_cache_update(hdev, &data); | 1263 | hci_inquiry_cache_update(hdev, &data); |
1264 | mgmt_device_found(hdev->id, &info->bdaddr, info->dev_class, 0, | ||
1265 | NULL); | ||
1228 | } | 1266 | } |
1229 | 1267 | ||
1230 | hci_dev_unlock(hdev); | 1268 | hci_dev_unlock(hdev); |
@@ -1402,7 +1440,7 @@ static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff | |||
1402 | 1440 | ||
1403 | conn->state = BT_CLOSED; | 1441 | conn->state = BT_CLOSED; |
1404 | 1442 | ||
1405 | if (conn->type == ACL_LINK) | 1443 | if (conn->type == ACL_LINK || conn->type == LE_LINK) |
1406 | mgmt_disconnected(hdev->id, &conn->dst); | 1444 | mgmt_disconnected(hdev->id, &conn->dst); |
1407 | 1445 | ||
1408 | hci_proto_disconn_cfm(conn, ev->reason); | 1446 | hci_proto_disconn_cfm(conn, ev->reason); |
@@ -1428,7 +1466,6 @@ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
1428 | conn->sec_level = conn->pending_sec_level; | 1466 | conn->sec_level = conn->pending_sec_level; |
1429 | } else { | 1467 | } else { |
1430 | mgmt_auth_failed(hdev->id, &conn->dst, ev->status); | 1468 | mgmt_auth_failed(hdev->id, &conn->dst, ev->status); |
1431 | conn->sec_level = BT_SECURITY_LOW; | ||
1432 | } | 1469 | } |
1433 | 1470 | ||
1434 | clear_bit(HCI_CONN_AUTH_PEND, &conn->pend); | 1471 | clear_bit(HCI_CONN_AUTH_PEND, &conn->pend); |
@@ -1482,13 +1519,23 @@ static inline void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb | |||
1482 | 1519 | ||
1483 | hci_dev_lock(hdev); | 1520 | hci_dev_lock(hdev); |
1484 | 1521 | ||
1522 | if (ev->status == 0 && test_bit(HCI_MGMT, &hdev->flags)) | ||
1523 | mgmt_remote_name(hdev->id, &ev->bdaddr, ev->name); | ||
1524 | |||
1485 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr); | 1525 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr); |
1486 | if (conn && hci_outgoing_auth_needed(hdev, conn)) { | 1526 | if (!conn) |
1527 | goto unlock; | ||
1528 | |||
1529 | if (!hci_outgoing_auth_needed(hdev, conn)) | ||
1530 | goto unlock; | ||
1531 | |||
1532 | if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) { | ||
1487 | struct hci_cp_auth_requested cp; | 1533 | struct hci_cp_auth_requested cp; |
1488 | cp.handle = __cpu_to_le16(conn->handle); | 1534 | cp.handle = __cpu_to_le16(conn->handle); |
1489 | hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp); | 1535 | hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp); |
1490 | } | 1536 | } |
1491 | 1537 | ||
1538 | unlock: | ||
1492 | hci_dev_unlock(hdev); | 1539 | hci_dev_unlock(hdev); |
1493 | } | 1540 | } |
1494 | 1541 | ||
@@ -1751,6 +1798,10 @@ static inline void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *sk | |||
1751 | hci_cc_pin_code_neg_reply(hdev, skb); | 1798 | hci_cc_pin_code_neg_reply(hdev, skb); |
1752 | break; | 1799 | break; |
1753 | 1800 | ||
1801 | case HCI_OP_READ_LOCAL_OOB_DATA: | ||
1802 | hci_cc_read_local_oob_data_reply(hdev, skb); | ||
1803 | break; | ||
1804 | |||
1754 | case HCI_OP_LE_READ_BUFFER_SIZE: | 1805 | case HCI_OP_LE_READ_BUFFER_SIZE: |
1755 | hci_cc_le_read_buffer_size(hdev, skb); | 1806 | hci_cc_le_read_buffer_size(hdev, skb); |
1756 | break; | 1807 | break; |
@@ -1984,9 +2035,16 @@ static inline void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff | |||
1984 | if (!test_bit(HCI_PAIRABLE, &hdev->flags)) | 2035 | if (!test_bit(HCI_PAIRABLE, &hdev->flags)) |
1985 | hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY, | 2036 | hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY, |
1986 | sizeof(ev->bdaddr), &ev->bdaddr); | 2037 | sizeof(ev->bdaddr), &ev->bdaddr); |
2038 | else if (test_bit(HCI_MGMT, &hdev->flags)) { | ||
2039 | u8 secure; | ||
1987 | 2040 | ||
1988 | if (test_bit(HCI_MGMT, &hdev->flags)) | 2041 | if (conn->pending_sec_level == BT_SECURITY_HIGH) |
1989 | mgmt_pin_code_request(hdev->id, &ev->bdaddr); | 2042 | secure = 1; |
2043 | else | ||
2044 | secure = 0; | ||
2045 | |||
2046 | mgmt_pin_code_request(hdev->id, &ev->bdaddr, secure); | ||
2047 | } | ||
1990 | 2048 | ||
1991 | hci_dev_unlock(hdev); | 2049 | hci_dev_unlock(hdev); |
1992 | } | 2050 | } |
@@ -2015,17 +2073,30 @@ static inline void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff | |||
2015 | BT_DBG("%s found key type %u for %s", hdev->name, key->type, | 2073 | BT_DBG("%s found key type %u for %s", hdev->name, key->type, |
2016 | batostr(&ev->bdaddr)); | 2074 | batostr(&ev->bdaddr)); |
2017 | 2075 | ||
2018 | if (!test_bit(HCI_DEBUG_KEYS, &hdev->flags) && key->type == 0x03) { | 2076 | if (!test_bit(HCI_DEBUG_KEYS, &hdev->flags) && |
2077 | key->type == HCI_LK_DEBUG_COMBINATION) { | ||
2019 | BT_DBG("%s ignoring debug key", hdev->name); | 2078 | BT_DBG("%s ignoring debug key", hdev->name); |
2020 | goto not_found; | 2079 | goto not_found; |
2021 | } | 2080 | } |
2022 | 2081 | ||
2023 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr); | 2082 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr); |
2083 | if (conn) { | ||
2084 | if (key->type == HCI_LK_UNAUTH_COMBINATION && | ||
2085 | conn->auth_type != 0xff && | ||
2086 | (conn->auth_type & 0x01)) { | ||
2087 | BT_DBG("%s ignoring unauthenticated key", hdev->name); | ||
2088 | goto not_found; | ||
2089 | } | ||
2024 | 2090 | ||
2025 | if (key->type == 0x04 && conn && conn->auth_type != 0xff && | 2091 | if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 && |
2026 | (conn->auth_type & 0x01)) { | 2092 | conn->pending_sec_level == BT_SECURITY_HIGH) { |
2027 | BT_DBG("%s ignoring unauthenticated key", hdev->name); | 2093 | BT_DBG("%s ignoring key unauthenticated for high \ |
2028 | goto not_found; | 2094 | security", hdev->name); |
2095 | goto not_found; | ||
2096 | } | ||
2097 | |||
2098 | conn->key_type = key->type; | ||
2099 | conn->pin_length = key->pin_len; | ||
2029 | } | 2100 | } |
2030 | 2101 | ||
2031 | bacpy(&cp.bdaddr, &ev->bdaddr); | 2102 | bacpy(&cp.bdaddr, &ev->bdaddr); |
@@ -2057,11 +2128,15 @@ static inline void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff | |||
2057 | hci_conn_hold(conn); | 2128 | hci_conn_hold(conn); |
2058 | conn->disc_timeout = HCI_DISCONN_TIMEOUT; | 2129 | conn->disc_timeout = HCI_DISCONN_TIMEOUT; |
2059 | pin_len = conn->pin_length; | 2130 | pin_len = conn->pin_length; |
2131 | |||
2132 | if (ev->key_type != HCI_LK_CHANGED_COMBINATION) | ||
2133 | conn->key_type = ev->key_type; | ||
2134 | |||
2060 | hci_conn_put(conn); | 2135 | hci_conn_put(conn); |
2061 | } | 2136 | } |
2062 | 2137 | ||
2063 | if (test_bit(HCI_LINK_KEYS, &hdev->flags)) | 2138 | if (test_bit(HCI_LINK_KEYS, &hdev->flags)) |
2064 | hci_add_link_key(hdev, 1, &ev->bdaddr, ev->link_key, | 2139 | hci_add_link_key(hdev, conn, 1, &ev->bdaddr, ev->link_key, |
2065 | ev->key_type, pin_len); | 2140 | ev->key_type, pin_len); |
2066 | 2141 | ||
2067 | hci_dev_unlock(hdev); | 2142 | hci_dev_unlock(hdev); |
@@ -2136,11 +2211,17 @@ static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct | |||
2136 | 2211 | ||
2137 | hci_dev_lock(hdev); | 2212 | hci_dev_lock(hdev); |
2138 | 2213 | ||
2214 | if (!test_and_set_bit(HCI_INQUIRY, &hdev->flags)) { | ||
2215 | |||
2216 | if (test_bit(HCI_MGMT, &hdev->flags)) | ||
2217 | mgmt_discovering(hdev->id, 1); | ||
2218 | } | ||
2219 | |||
2139 | if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) { | 2220 | if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) { |
2140 | struct inquiry_info_with_rssi_and_pscan_mode *info; | 2221 | struct inquiry_info_with_rssi_and_pscan_mode *info; |
2141 | info = (void *) (skb->data + 1); | 2222 | info = (void *) (skb->data + 1); |
2142 | 2223 | ||
2143 | for (; num_rsp; num_rsp--) { | 2224 | for (; num_rsp; num_rsp--, info++) { |
2144 | bacpy(&data.bdaddr, &info->bdaddr); | 2225 | bacpy(&data.bdaddr, &info->bdaddr); |
2145 | data.pscan_rep_mode = info->pscan_rep_mode; | 2226 | data.pscan_rep_mode = info->pscan_rep_mode; |
2146 | data.pscan_period_mode = info->pscan_period_mode; | 2227 | data.pscan_period_mode = info->pscan_period_mode; |
@@ -2149,13 +2230,15 @@ static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct | |||
2149 | data.clock_offset = info->clock_offset; | 2230 | data.clock_offset = info->clock_offset; |
2150 | data.rssi = info->rssi; | 2231 | data.rssi = info->rssi; |
2151 | data.ssp_mode = 0x00; | 2232 | data.ssp_mode = 0x00; |
2152 | info++; | ||
2153 | hci_inquiry_cache_update(hdev, &data); | 2233 | hci_inquiry_cache_update(hdev, &data); |
2234 | mgmt_device_found(hdev->id, &info->bdaddr, | ||
2235 | info->dev_class, info->rssi, | ||
2236 | NULL); | ||
2154 | } | 2237 | } |
2155 | } else { | 2238 | } else { |
2156 | struct inquiry_info_with_rssi *info = (void *) (skb->data + 1); | 2239 | struct inquiry_info_with_rssi *info = (void *) (skb->data + 1); |
2157 | 2240 | ||
2158 | for (; num_rsp; num_rsp--) { | 2241 | for (; num_rsp; num_rsp--, info++) { |
2159 | bacpy(&data.bdaddr, &info->bdaddr); | 2242 | bacpy(&data.bdaddr, &info->bdaddr); |
2160 | data.pscan_rep_mode = info->pscan_rep_mode; | 2243 | data.pscan_rep_mode = info->pscan_rep_mode; |
2161 | data.pscan_period_mode = info->pscan_period_mode; | 2244 | data.pscan_period_mode = info->pscan_period_mode; |
@@ -2164,8 +2247,10 @@ static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct | |||
2164 | data.clock_offset = info->clock_offset; | 2247 | data.clock_offset = info->clock_offset; |
2165 | data.rssi = info->rssi; | 2248 | data.rssi = info->rssi; |
2166 | data.ssp_mode = 0x00; | 2249 | data.ssp_mode = 0x00; |
2167 | info++; | ||
2168 | hci_inquiry_cache_update(hdev, &data); | 2250 | hci_inquiry_cache_update(hdev, &data); |
2251 | mgmt_device_found(hdev->id, &info->bdaddr, | ||
2252 | info->dev_class, info->rssi, | ||
2253 | NULL); | ||
2169 | } | 2254 | } |
2170 | } | 2255 | } |
2171 | 2256 | ||
@@ -2294,9 +2379,15 @@ static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct | |||
2294 | if (!num_rsp) | 2379 | if (!num_rsp) |
2295 | return; | 2380 | return; |
2296 | 2381 | ||
2382 | if (!test_and_set_bit(HCI_INQUIRY, &hdev->flags)) { | ||
2383 | |||
2384 | if (test_bit(HCI_MGMT, &hdev->flags)) | ||
2385 | mgmt_discovering(hdev->id, 1); | ||
2386 | } | ||
2387 | |||
2297 | hci_dev_lock(hdev); | 2388 | hci_dev_lock(hdev); |
2298 | 2389 | ||
2299 | for (; num_rsp; num_rsp--) { | 2390 | for (; num_rsp; num_rsp--, info++) { |
2300 | bacpy(&data.bdaddr, &info->bdaddr); | 2391 | bacpy(&data.bdaddr, &info->bdaddr); |
2301 | data.pscan_rep_mode = info->pscan_rep_mode; | 2392 | data.pscan_rep_mode = info->pscan_rep_mode; |
2302 | data.pscan_period_mode = info->pscan_period_mode; | 2393 | data.pscan_period_mode = info->pscan_period_mode; |
@@ -2305,8 +2396,9 @@ static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct | |||
2305 | data.clock_offset = info->clock_offset; | 2396 | data.clock_offset = info->clock_offset; |
2306 | data.rssi = info->rssi; | 2397 | data.rssi = info->rssi; |
2307 | data.ssp_mode = 0x01; | 2398 | data.ssp_mode = 0x01; |
2308 | info++; | ||
2309 | hci_inquiry_cache_update(hdev, &data); | 2399 | hci_inquiry_cache_update(hdev, &data); |
2400 | mgmt_device_found(hdev->id, &info->bdaddr, info->dev_class, | ||
2401 | info->rssi, info->data); | ||
2310 | } | 2402 | } |
2311 | 2403 | ||
2312 | hci_dev_unlock(hdev); | 2404 | hci_dev_unlock(hdev); |
@@ -2326,7 +2418,7 @@ static inline u8 hci_get_auth_req(struct hci_conn *conn) | |||
2326 | 2418 | ||
2327 | /* If remote requests no-bonding follow that lead */ | 2419 | /* If remote requests no-bonding follow that lead */ |
2328 | if (conn->remote_auth == 0x00 || conn->remote_auth == 0x01) | 2420 | if (conn->remote_auth == 0x00 || conn->remote_auth == 0x01) |
2329 | return 0x00; | 2421 | return conn->remote_auth | (conn->auth_type & 0x01); |
2330 | 2422 | ||
2331 | return conn->auth_type; | 2423 | return conn->auth_type; |
2332 | } | 2424 | } |
@@ -2355,8 +2447,14 @@ static inline void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff | |||
2355 | 2447 | ||
2356 | bacpy(&cp.bdaddr, &ev->bdaddr); | 2448 | bacpy(&cp.bdaddr, &ev->bdaddr); |
2357 | cp.capability = conn->io_capability; | 2449 | cp.capability = conn->io_capability; |
2358 | cp.oob_data = 0; | 2450 | conn->auth_type = hci_get_auth_req(conn); |
2359 | cp.authentication = hci_get_auth_req(conn); | 2451 | cp.authentication = conn->auth_type; |
2452 | |||
2453 | if ((conn->out == 0x01 || conn->remote_oob == 0x01) && | ||
2454 | hci_find_remote_oob_data(hdev, &conn->dst)) | ||
2455 | cp.oob_data = 0x01; | ||
2456 | else | ||
2457 | cp.oob_data = 0x00; | ||
2360 | 2458 | ||
2361 | hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY, | 2459 | hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY, |
2362 | sizeof(cp), &cp); | 2460 | sizeof(cp), &cp); |
@@ -2364,7 +2462,7 @@ static inline void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff | |||
2364 | struct hci_cp_io_capability_neg_reply cp; | 2462 | struct hci_cp_io_capability_neg_reply cp; |
2365 | 2463 | ||
2366 | bacpy(&cp.bdaddr, &ev->bdaddr); | 2464 | bacpy(&cp.bdaddr, &ev->bdaddr); |
2367 | cp.reason = 0x16; /* Pairing not allowed */ | 2465 | cp.reason = 0x18; /* Pairing not allowed */ |
2368 | 2466 | ||
2369 | hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY, | 2467 | hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY, |
2370 | sizeof(cp), &cp); | 2468 | sizeof(cp), &cp); |
@@ -2399,14 +2497,67 @@ static inline void hci_user_confirm_request_evt(struct hci_dev *hdev, | |||
2399 | struct sk_buff *skb) | 2497 | struct sk_buff *skb) |
2400 | { | 2498 | { |
2401 | struct hci_ev_user_confirm_req *ev = (void *) skb->data; | 2499 | struct hci_ev_user_confirm_req *ev = (void *) skb->data; |
2500 | int loc_mitm, rem_mitm, confirm_hint = 0; | ||
2501 | struct hci_conn *conn; | ||
2402 | 2502 | ||
2403 | BT_DBG("%s", hdev->name); | 2503 | BT_DBG("%s", hdev->name); |
2404 | 2504 | ||
2405 | hci_dev_lock(hdev); | 2505 | hci_dev_lock(hdev); |
2406 | 2506 | ||
2407 | if (test_bit(HCI_MGMT, &hdev->flags)) | 2507 | if (!test_bit(HCI_MGMT, &hdev->flags)) |
2408 | mgmt_user_confirm_request(hdev->id, &ev->bdaddr, ev->passkey); | 2508 | goto unlock; |
2509 | |||
2510 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr); | ||
2511 | if (!conn) | ||
2512 | goto unlock; | ||
2513 | |||
2514 | loc_mitm = (conn->auth_type & 0x01); | ||
2515 | rem_mitm = (conn->remote_auth & 0x01); | ||
2516 | |||
2517 | /* If we require MITM but the remote device can't provide that | ||
2518 | * (it has NoInputNoOutput) then reject the confirmation | ||
2519 | * request. The only exception is when we're dedicated bonding | ||
2520 | * initiators (connect_cfm_cb set) since then we always have the MITM | ||
2521 | * bit set. */ | ||
2522 | if (!conn->connect_cfm_cb && loc_mitm && conn->remote_cap == 0x03) { | ||
2523 | BT_DBG("Rejecting request: remote device can't provide MITM"); | ||
2524 | hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY, | ||
2525 | sizeof(ev->bdaddr), &ev->bdaddr); | ||
2526 | goto unlock; | ||
2527 | } | ||
2528 | |||
2529 | /* If no side requires MITM protection; auto-accept */ | ||
2530 | if ((!loc_mitm || conn->remote_cap == 0x03) && | ||
2531 | (!rem_mitm || conn->io_capability == 0x03)) { | ||
2532 | |||
2533 | /* If we're not the initiators request authorization to | ||
2534 | * proceed from user space (mgmt_user_confirm with | ||
2535 | * confirm_hint set to 1). */ | ||
2536 | if (!test_bit(HCI_CONN_AUTH_PEND, &conn->pend)) { | ||
2537 | BT_DBG("Confirming auto-accept as acceptor"); | ||
2538 | confirm_hint = 1; | ||
2539 | goto confirm; | ||
2540 | } | ||
2541 | |||
2542 | BT_DBG("Auto-accept of user confirmation with %ums delay", | ||
2543 | hdev->auto_accept_delay); | ||
2544 | |||
2545 | if (hdev->auto_accept_delay > 0) { | ||
2546 | int delay = msecs_to_jiffies(hdev->auto_accept_delay); | ||
2547 | mod_timer(&conn->auto_accept_timer, jiffies + delay); | ||
2548 | goto unlock; | ||
2549 | } | ||
2550 | |||
2551 | hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY, | ||
2552 | sizeof(ev->bdaddr), &ev->bdaddr); | ||
2553 | goto unlock; | ||
2554 | } | ||
2555 | |||
2556 | confirm: | ||
2557 | mgmt_user_confirm_request(hdev->id, &ev->bdaddr, ev->passkey, | ||
2558 | confirm_hint); | ||
2409 | 2559 | ||
2560 | unlock: | ||
2410 | hci_dev_unlock(hdev); | 2561 | hci_dev_unlock(hdev); |
2411 | } | 2562 | } |
2412 | 2563 | ||
@@ -2453,6 +2604,41 @@ static inline void hci_remote_host_features_evt(struct hci_dev *hdev, struct sk_ | |||
2453 | hci_dev_unlock(hdev); | 2604 | hci_dev_unlock(hdev); |
2454 | } | 2605 | } |
2455 | 2606 | ||
2607 | static inline void hci_remote_oob_data_request_evt(struct hci_dev *hdev, | ||
2608 | struct sk_buff *skb) | ||
2609 | { | ||
2610 | struct hci_ev_remote_oob_data_request *ev = (void *) skb->data; | ||
2611 | struct oob_data *data; | ||
2612 | |||
2613 | BT_DBG("%s", hdev->name); | ||
2614 | |||
2615 | hci_dev_lock(hdev); | ||
2616 | |||
2617 | if (!test_bit(HCI_MGMT, &hdev->flags)) | ||
2618 | goto unlock; | ||
2619 | |||
2620 | data = hci_find_remote_oob_data(hdev, &ev->bdaddr); | ||
2621 | if (data) { | ||
2622 | struct hci_cp_remote_oob_data_reply cp; | ||
2623 | |||
2624 | bacpy(&cp.bdaddr, &ev->bdaddr); | ||
2625 | memcpy(cp.hash, data->hash, sizeof(cp.hash)); | ||
2626 | memcpy(cp.randomizer, data->randomizer, sizeof(cp.randomizer)); | ||
2627 | |||
2628 | hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY, sizeof(cp), | ||
2629 | &cp); | ||
2630 | } else { | ||
2631 | struct hci_cp_remote_oob_data_neg_reply cp; | ||
2632 | |||
2633 | bacpy(&cp.bdaddr, &ev->bdaddr); | ||
2634 | hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY, sizeof(cp), | ||
2635 | &cp); | ||
2636 | } | ||
2637 | |||
2638 | unlock: | ||
2639 | hci_dev_unlock(hdev); | ||
2640 | } | ||
2641 | |||
2456 | static inline void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) | 2642 | static inline void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) |
2457 | { | 2643 | { |
2458 | struct hci_ev_le_conn_complete *ev = (void *) skb->data; | 2644 | struct hci_ev_le_conn_complete *ev = (void *) skb->data; |
@@ -2473,12 +2659,15 @@ static inline void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff | |||
2473 | } | 2659 | } |
2474 | 2660 | ||
2475 | if (ev->status) { | 2661 | if (ev->status) { |
2662 | mgmt_connect_failed(hdev->id, &ev->bdaddr, ev->status); | ||
2476 | hci_proto_connect_cfm(conn, ev->status); | 2663 | hci_proto_connect_cfm(conn, ev->status); |
2477 | conn->state = BT_CLOSED; | 2664 | conn->state = BT_CLOSED; |
2478 | hci_conn_del(conn); | 2665 | hci_conn_del(conn); |
2479 | goto unlock; | 2666 | goto unlock; |
2480 | } | 2667 | } |
2481 | 2668 | ||
2669 | mgmt_connected(hdev->id, &ev->bdaddr); | ||
2670 | |||
2482 | conn->handle = __le16_to_cpu(ev->handle); | 2671 | conn->handle = __le16_to_cpu(ev->handle); |
2483 | conn->state = BT_CONNECTED; | 2672 | conn->state = BT_CONNECTED; |
2484 | 2673 | ||
@@ -2655,6 +2844,10 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb) | |||
2655 | hci_le_meta_evt(hdev, skb); | 2844 | hci_le_meta_evt(hdev, skb); |
2656 | break; | 2845 | break; |
2657 | 2846 | ||
2847 | case HCI_EV_REMOTE_OOB_DATA_REQUEST: | ||
2848 | hci_remote_oob_data_request_evt(hdev, skb); | ||
2849 | break; | ||
2850 | |||
2658 | default: | 2851 | default: |
2659 | BT_DBG("%s event 0x%x", hdev->name, event); | 2852 | BT_DBG("%s event 0x%x", hdev->name, event); |
2660 | break; | 2853 | break; |
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index 3c838a65a75a..a6c3aa8be1f7 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c | |||
@@ -216,13 +216,13 @@ static ssize_t show_type(struct device *dev, struct device_attribute *attr, char | |||
216 | static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf) | 216 | static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf) |
217 | { | 217 | { |
218 | struct hci_dev *hdev = dev_get_drvdata(dev); | 218 | struct hci_dev *hdev = dev_get_drvdata(dev); |
219 | char name[249]; | 219 | char name[HCI_MAX_NAME_LENGTH + 1]; |
220 | int i; | 220 | int i; |
221 | 221 | ||
222 | for (i = 0; i < 248; i++) | 222 | for (i = 0; i < HCI_MAX_NAME_LENGTH; i++) |
223 | name[i] = hdev->dev_name[i]; | 223 | name[i] = hdev->dev_name[i]; |
224 | 224 | ||
225 | name[248] = '\0'; | 225 | name[HCI_MAX_NAME_LENGTH] = '\0'; |
226 | return sprintf(buf, "%s\n", name); | 226 | return sprintf(buf, "%s\n", name); |
227 | } | 227 | } |
228 | 228 | ||
@@ -277,10 +277,12 @@ static ssize_t show_idle_timeout(struct device *dev, struct device_attribute *at | |||
277 | static ssize_t store_idle_timeout(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | 277 | static ssize_t store_idle_timeout(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) |
278 | { | 278 | { |
279 | struct hci_dev *hdev = dev_get_drvdata(dev); | 279 | struct hci_dev *hdev = dev_get_drvdata(dev); |
280 | unsigned long val; | 280 | unsigned int val; |
281 | int rv; | ||
281 | 282 | ||
282 | if (strict_strtoul(buf, 0, &val) < 0) | 283 | rv = kstrtouint(buf, 0, &val); |
283 | return -EINVAL; | 284 | if (rv < 0) |
285 | return rv; | ||
284 | 286 | ||
285 | if (val != 0 && (val < 500 || val > 3600000)) | 287 | if (val != 0 && (val < 500 || val > 3600000)) |
286 | return -EINVAL; | 288 | return -EINVAL; |
@@ -299,15 +301,14 @@ static ssize_t show_sniff_max_interval(struct device *dev, struct device_attribu | |||
299 | static ssize_t store_sniff_max_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | 301 | static ssize_t store_sniff_max_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) |
300 | { | 302 | { |
301 | struct hci_dev *hdev = dev_get_drvdata(dev); | 303 | struct hci_dev *hdev = dev_get_drvdata(dev); |
302 | unsigned long val; | 304 | u16 val; |
303 | 305 | int rv; | |
304 | if (strict_strtoul(buf, 0, &val) < 0) | ||
305 | return -EINVAL; | ||
306 | 306 | ||
307 | if (val < 0x0002 || val > 0xFFFE || val % 2) | 307 | rv = kstrtou16(buf, 0, &val); |
308 | return -EINVAL; | 308 | if (rv < 0) |
309 | return rv; | ||
309 | 310 | ||
310 | if (val < hdev->sniff_min_interval) | 311 | if (val == 0 || val % 2 || val < hdev->sniff_min_interval) |
311 | return -EINVAL; | 312 | return -EINVAL; |
312 | 313 | ||
313 | hdev->sniff_max_interval = val; | 314 | hdev->sniff_max_interval = val; |
@@ -324,15 +325,14 @@ static ssize_t show_sniff_min_interval(struct device *dev, struct device_attribu | |||
324 | static ssize_t store_sniff_min_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | 325 | static ssize_t store_sniff_min_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) |
325 | { | 326 | { |
326 | struct hci_dev *hdev = dev_get_drvdata(dev); | 327 | struct hci_dev *hdev = dev_get_drvdata(dev); |
327 | unsigned long val; | 328 | u16 val; |
329 | int rv; | ||
328 | 330 | ||
329 | if (strict_strtoul(buf, 0, &val) < 0) | 331 | rv = kstrtou16(buf, 0, &val); |
330 | return -EINVAL; | 332 | if (rv < 0) |
331 | 333 | return rv; | |
332 | if (val < 0x0002 || val > 0xFFFE || val % 2) | ||
333 | return -EINVAL; | ||
334 | 334 | ||
335 | if (val > hdev->sniff_max_interval) | 335 | if (val == 0 || val % 2 || val > hdev->sniff_max_interval) |
336 | return -EINVAL; | 336 | return -EINVAL; |
337 | 337 | ||
338 | hdev->sniff_min_interval = val; | 338 | hdev->sniff_min_interval = val; |
@@ -511,6 +511,35 @@ static const struct file_operations uuids_fops = { | |||
511 | .release = single_release, | 511 | .release = single_release, |
512 | }; | 512 | }; |
513 | 513 | ||
514 | static int auto_accept_delay_set(void *data, u64 val) | ||
515 | { | ||
516 | struct hci_dev *hdev = data; | ||
517 | |||
518 | hci_dev_lock_bh(hdev); | ||
519 | |||
520 | hdev->auto_accept_delay = val; | ||
521 | |||
522 | hci_dev_unlock_bh(hdev); | ||
523 | |||
524 | return 0; | ||
525 | } | ||
526 | |||
527 | static int auto_accept_delay_get(void *data, u64 *val) | ||
528 | { | ||
529 | struct hci_dev *hdev = data; | ||
530 | |||
531 | hci_dev_lock_bh(hdev); | ||
532 | |||
533 | *val = hdev->auto_accept_delay; | ||
534 | |||
535 | hci_dev_unlock_bh(hdev); | ||
536 | |||
537 | return 0; | ||
538 | } | ||
539 | |||
540 | DEFINE_SIMPLE_ATTRIBUTE(auto_accept_delay_fops, auto_accept_delay_get, | ||
541 | auto_accept_delay_set, "%llu\n"); | ||
542 | |||
514 | int hci_register_sysfs(struct hci_dev *hdev) | 543 | int hci_register_sysfs(struct hci_dev *hdev) |
515 | { | 544 | { |
516 | struct device *dev = &hdev->dev; | 545 | struct device *dev = &hdev->dev; |
@@ -545,6 +574,8 @@ int hci_register_sysfs(struct hci_dev *hdev) | |||
545 | 574 | ||
546 | debugfs_create_file("uuids", 0444, hdev->debugfs, hdev, &uuids_fops); | 575 | debugfs_create_file("uuids", 0444, hdev->debugfs, hdev, &uuids_fops); |
547 | 576 | ||
577 | debugfs_create_file("auto_accept_delay", 0444, hdev->debugfs, hdev, | ||
578 | &auto_accept_delay_fops); | ||
548 | return 0; | 579 | return 0; |
549 | } | 580 | } |
550 | 581 | ||
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index 5ec12971af6b..c405a954a603 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/init.h> | 37 | #include <linux/init.h> |
38 | #include <linux/wait.h> | 38 | #include <linux/wait.h> |
39 | #include <linux/mutex.h> | 39 | #include <linux/mutex.h> |
40 | #include <linux/kthread.h> | ||
40 | #include <net/sock.h> | 41 | #include <net/sock.h> |
41 | 42 | ||
42 | #include <linux/input.h> | 43 | #include <linux/input.h> |
@@ -55,22 +56,24 @@ static DECLARE_RWSEM(hidp_session_sem); | |||
55 | static LIST_HEAD(hidp_session_list); | 56 | static LIST_HEAD(hidp_session_list); |
56 | 57 | ||
57 | static unsigned char hidp_keycode[256] = { | 58 | static unsigned char hidp_keycode[256] = { |
58 | 0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38, | 59 | 0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, |
59 | 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, 2, 3, | 60 | 37, 38, 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, |
60 | 4, 5, 6, 7, 8, 9, 10, 11, 28, 1, 14, 15, 57, 12, 13, 26, | 61 | 21, 44, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 28, 1, |
61 | 27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64, | 62 | 14, 15, 57, 12, 13, 26, 27, 43, 43, 39, 40, 41, 51, 52, |
62 | 65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106, | 63 | 53, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 87, 88, |
63 | 105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71, | 64 | 99, 70, 119, 110, 102, 104, 111, 107, 109, 106, 105, 108, 103, 69, |
64 | 72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190, | 65 | 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71, 72, 73, |
65 | 191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113, | 66 | 82, 83, 86, 127, 116, 117, 183, 184, 185, 186, 187, 188, 189, 190, |
66 | 115,114, 0, 0, 0,121, 0, 89, 93,124, 92, 94, 95, 0, 0, 0, | 67 | 191, 192, 193, 194, 134, 138, 130, 132, 128, 129, 131, 137, 133, 135, |
67 | 122,123, 90, 91, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 68 | 136, 113, 115, 114, 0, 0, 0, 121, 0, 89, 93, 124, 92, 94, |
68 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 69 | 95, 0, 0, 0, 122, 123, 90, 91, 85, 0, 0, 0, 0, 0, |
69 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 70 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
70 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 71 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
71 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 72 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
72 | 29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113, | 73 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
73 | 150,158,159,128,136,177,178,176,142,152,173,140 | 74 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
75 | 29, 42, 56, 125, 97, 54, 100, 126, 164, 166, 165, 163, 161, 115, | ||
76 | 114, 113, 150, 158, 159, 128, 136, 177, 178, 176, 142, 152, 173, 140 | ||
74 | }; | 77 | }; |
75 | 78 | ||
76 | static unsigned char hidp_mkeyspat[] = { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }; | 79 | static unsigned char hidp_mkeyspat[] = { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }; |
@@ -461,8 +464,7 @@ static void hidp_idle_timeout(unsigned long arg) | |||
461 | { | 464 | { |
462 | struct hidp_session *session = (struct hidp_session *) arg; | 465 | struct hidp_session *session = (struct hidp_session *) arg; |
463 | 466 | ||
464 | atomic_inc(&session->terminate); | 467 | kthread_stop(session->task); |
465 | hidp_schedule(session); | ||
466 | } | 468 | } |
467 | 469 | ||
468 | static void hidp_set_timer(struct hidp_session *session) | 470 | static void hidp_set_timer(struct hidp_session *session) |
@@ -533,9 +535,7 @@ static void hidp_process_hid_control(struct hidp_session *session, | |||
533 | skb_queue_purge(&session->ctrl_transmit); | 535 | skb_queue_purge(&session->ctrl_transmit); |
534 | skb_queue_purge(&session->intr_transmit); | 536 | skb_queue_purge(&session->intr_transmit); |
535 | 537 | ||
536 | /* Kill session thread */ | 538 | kthread_stop(session->task); |
537 | atomic_inc(&session->terminate); | ||
538 | hidp_schedule(session); | ||
539 | } | 539 | } |
540 | } | 540 | } |
541 | 541 | ||
@@ -694,22 +694,10 @@ static int hidp_session(void *arg) | |||
694 | struct sock *ctrl_sk = session->ctrl_sock->sk; | 694 | struct sock *ctrl_sk = session->ctrl_sock->sk; |
695 | struct sock *intr_sk = session->intr_sock->sk; | 695 | struct sock *intr_sk = session->intr_sock->sk; |
696 | struct sk_buff *skb; | 696 | struct sk_buff *skb; |
697 | int vendor = 0x0000, product = 0x0000; | ||
698 | wait_queue_t ctrl_wait, intr_wait; | 697 | wait_queue_t ctrl_wait, intr_wait; |
699 | 698 | ||
700 | BT_DBG("session %p", session); | 699 | BT_DBG("session %p", session); |
701 | 700 | ||
702 | if (session->input) { | ||
703 | vendor = session->input->id.vendor; | ||
704 | product = session->input->id.product; | ||
705 | } | ||
706 | |||
707 | if (session->hid) { | ||
708 | vendor = session->hid->vendor; | ||
709 | product = session->hid->product; | ||
710 | } | ||
711 | |||
712 | daemonize("khidpd_%04x%04x", vendor, product); | ||
713 | set_user_nice(current, -15); | 701 | set_user_nice(current, -15); |
714 | 702 | ||
715 | init_waitqueue_entry(&ctrl_wait, current); | 703 | init_waitqueue_entry(&ctrl_wait, current); |
@@ -718,10 +706,11 @@ static int hidp_session(void *arg) | |||
718 | add_wait_queue(sk_sleep(intr_sk), &intr_wait); | 706 | add_wait_queue(sk_sleep(intr_sk), &intr_wait); |
719 | session->waiting_for_startup = 0; | 707 | session->waiting_for_startup = 0; |
720 | wake_up_interruptible(&session->startup_queue); | 708 | wake_up_interruptible(&session->startup_queue); |
721 | while (!atomic_read(&session->terminate)) { | 709 | while (!kthread_should_stop()) { |
722 | set_current_state(TASK_INTERRUPTIBLE); | 710 | set_current_state(TASK_INTERRUPTIBLE); |
723 | 711 | ||
724 | if (ctrl_sk->sk_state != BT_CONNECTED || intr_sk->sk_state != BT_CONNECTED) | 712 | if (ctrl_sk->sk_state != BT_CONNECTED || |
713 | intr_sk->sk_state != BT_CONNECTED) | ||
725 | break; | 714 | break; |
726 | 715 | ||
727 | while ((skb = skb_dequeue(&ctrl_sk->sk_receive_queue))) { | 716 | while ((skb = skb_dequeue(&ctrl_sk->sk_receive_queue))) { |
@@ -965,6 +954,7 @@ fault: | |||
965 | int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, struct socket *intr_sock) | 954 | int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, struct socket *intr_sock) |
966 | { | 955 | { |
967 | struct hidp_session *session, *s; | 956 | struct hidp_session *session, *s; |
957 | int vendor, product; | ||
968 | int err; | 958 | int err; |
969 | 959 | ||
970 | BT_DBG(""); | 960 | BT_DBG(""); |
@@ -989,8 +979,10 @@ int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, | |||
989 | 979 | ||
990 | bacpy(&session->bdaddr, &bt_sk(ctrl_sock->sk)->dst); | 980 | bacpy(&session->bdaddr, &bt_sk(ctrl_sock->sk)->dst); |
991 | 981 | ||
992 | session->ctrl_mtu = min_t(uint, l2cap_pi(ctrl_sock->sk)->omtu, l2cap_pi(ctrl_sock->sk)->imtu); | 982 | session->ctrl_mtu = min_t(uint, l2cap_pi(ctrl_sock->sk)->chan->omtu, |
993 | session->intr_mtu = min_t(uint, l2cap_pi(intr_sock->sk)->omtu, l2cap_pi(intr_sock->sk)->imtu); | 983 | l2cap_pi(ctrl_sock->sk)->chan->imtu); |
984 | session->intr_mtu = min_t(uint, l2cap_pi(intr_sock->sk)->chan->omtu, | ||
985 | l2cap_pi(intr_sock->sk)->chan->imtu); | ||
994 | 986 | ||
995 | BT_DBG("ctrl mtu %d intr mtu %d", session->ctrl_mtu, session->intr_mtu); | 987 | BT_DBG("ctrl mtu %d intr mtu %d", session->ctrl_mtu, session->intr_mtu); |
996 | 988 | ||
@@ -1026,9 +1018,24 @@ int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, | |||
1026 | 1018 | ||
1027 | hidp_set_timer(session); | 1019 | hidp_set_timer(session); |
1028 | 1020 | ||
1029 | err = kernel_thread(hidp_session, session, CLONE_KERNEL); | 1021 | if (session->hid) { |
1030 | if (err < 0) | 1022 | vendor = session->hid->vendor; |
1023 | product = session->hid->product; | ||
1024 | } else if (session->input) { | ||
1025 | vendor = session->input->id.vendor; | ||
1026 | product = session->input->id.product; | ||
1027 | } else { | ||
1028 | vendor = 0x0000; | ||
1029 | product = 0x0000; | ||
1030 | } | ||
1031 | |||
1032 | session->task = kthread_run(hidp_session, session, "khidpd_%04x%04x", | ||
1033 | vendor, product); | ||
1034 | if (IS_ERR(session->task)) { | ||
1035 | err = PTR_ERR(session->task); | ||
1031 | goto unlink; | 1036 | goto unlink; |
1037 | } | ||
1038 | |||
1032 | while (session->waiting_for_startup) { | 1039 | while (session->waiting_for_startup) { |
1033 | wait_event_interruptible(session->startup_queue, | 1040 | wait_event_interruptible(session->startup_queue, |
1034 | !session->waiting_for_startup); | 1041 | !session->waiting_for_startup); |
@@ -1053,8 +1060,7 @@ int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, | |||
1053 | err_add_device: | 1060 | err_add_device: |
1054 | hid_destroy_device(session->hid); | 1061 | hid_destroy_device(session->hid); |
1055 | session->hid = NULL; | 1062 | session->hid = NULL; |
1056 | atomic_inc(&session->terminate); | 1063 | kthread_stop(session->task); |
1057 | hidp_schedule(session); | ||
1058 | 1064 | ||
1059 | unlink: | 1065 | unlink: |
1060 | hidp_del_timer(session); | 1066 | hidp_del_timer(session); |
@@ -1105,13 +1111,7 @@ int hidp_del_connection(struct hidp_conndel_req *req) | |||
1105 | skb_queue_purge(&session->ctrl_transmit); | 1111 | skb_queue_purge(&session->ctrl_transmit); |
1106 | skb_queue_purge(&session->intr_transmit); | 1112 | skb_queue_purge(&session->intr_transmit); |
1107 | 1113 | ||
1108 | /* Wakeup user-space polling for socket errors */ | 1114 | kthread_stop(session->task); |
1109 | session->intr_sock->sk->sk_err = EUNATCH; | ||
1110 | session->ctrl_sock->sk->sk_err = EUNATCH; | ||
1111 | |||
1112 | /* Kill session thread */ | ||
1113 | atomic_inc(&session->terminate); | ||
1114 | hidp_schedule(session); | ||
1115 | } | 1115 | } |
1116 | } else | 1116 | } else |
1117 | err = -ENOENT; | 1117 | err = -ENOENT; |
diff --git a/net/bluetooth/hidp/hidp.h b/net/bluetooth/hidp/hidp.h index 13de5fa03480..12822cde4b49 100644 --- a/net/bluetooth/hidp/hidp.h +++ b/net/bluetooth/hidp/hidp.h | |||
@@ -84,8 +84,8 @@ | |||
84 | #define HIDP_WAITING_FOR_SEND_ACK 11 | 84 | #define HIDP_WAITING_FOR_SEND_ACK 11 |
85 | 85 | ||
86 | struct hidp_connadd_req { | 86 | struct hidp_connadd_req { |
87 | int ctrl_sock; // Connected control socket | 87 | int ctrl_sock; /* Connected control socket */ |
88 | int intr_sock; // Connteted interrupt socket | 88 | int intr_sock; /* Connected interrupt socket */ |
89 | __u16 parser; | 89 | __u16 parser; |
90 | __u16 rd_size; | 90 | __u16 rd_size; |
91 | __u8 __user *rd_data; | 91 | __u8 __user *rd_data; |
@@ -142,7 +142,7 @@ struct hidp_session { | |||
142 | uint ctrl_mtu; | 142 | uint ctrl_mtu; |
143 | uint intr_mtu; | 143 | uint intr_mtu; |
144 | 144 | ||
145 | atomic_t terminate; | 145 | struct task_struct *task; |
146 | 146 | ||
147 | unsigned char keys[8]; | 147 | unsigned char keys[8]; |
148 | unsigned char leds; | 148 | unsigned char leds; |
diff --git a/net/bluetooth/hidp/sock.c b/net/bluetooth/hidp/sock.c index 250dfd46237d..178ac7f127ad 100644 --- a/net/bluetooth/hidp/sock.c +++ b/net/bluetooth/hidp/sock.c | |||
@@ -85,7 +85,8 @@ static int hidp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long | |||
85 | return err; | 85 | return err; |
86 | } | 86 | } |
87 | 87 | ||
88 | if (csock->sk->sk_state != BT_CONNECTED || isock->sk->sk_state != BT_CONNECTED) { | 88 | if (csock->sk->sk_state != BT_CONNECTED || |
89 | isock->sk->sk_state != BT_CONNECTED) { | ||
89 | sockfd_put(csock); | 90 | sockfd_put(csock); |
90 | sockfd_put(isock); | 91 | sockfd_put(isock); |
91 | return -EBADFD; | 92 | return -EBADFD; |
@@ -140,8 +141,8 @@ static int hidp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long | |||
140 | 141 | ||
141 | #ifdef CONFIG_COMPAT | 142 | #ifdef CONFIG_COMPAT |
142 | struct compat_hidp_connadd_req { | 143 | struct compat_hidp_connadd_req { |
143 | int ctrl_sock; // Connected control socket | 144 | int ctrl_sock; /* Connected control socket */ |
144 | int intr_sock; // Connteted interrupt socket | 145 | int intr_sock; /* Connected interrupt socket */ |
145 | __u16 parser; | 146 | __u16 parser; |
146 | __u16 rd_size; | 147 | __u16 rd_size; |
147 | compat_uptr_t rd_data; | 148 | compat_uptr_t rd_data; |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 2c8dd4494c63..a86f9ba4f05c 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -62,168 +62,233 @@ static u8 l2cap_fixed_chan[8] = { 0x02, }; | |||
62 | 62 | ||
63 | static struct workqueue_struct *_busy_wq; | 63 | static struct workqueue_struct *_busy_wq; |
64 | 64 | ||
65 | struct bt_sock_list l2cap_sk_list = { | 65 | LIST_HEAD(chan_list); |
66 | .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock) | 66 | DEFINE_RWLOCK(chan_list_lock); |
67 | }; | ||
68 | 67 | ||
69 | static void l2cap_busy_work(struct work_struct *work); | 68 | static void l2cap_busy_work(struct work_struct *work); |
70 | 69 | ||
71 | static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, | 70 | static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, |
72 | u8 code, u8 ident, u16 dlen, void *data); | 71 | u8 code, u8 ident, u16 dlen, void *data); |
72 | static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data); | ||
73 | 73 | ||
74 | static int l2cap_ertm_data_rcv(struct sock *sk, struct sk_buff *skb); | 74 | static int l2cap_ertm_data_rcv(struct sock *sk, struct sk_buff *skb); |
75 | 75 | ||
76 | /* ---- L2CAP channels ---- */ | 76 | /* ---- L2CAP channels ---- */ |
77 | static struct sock *__l2cap_get_chan_by_dcid(struct l2cap_chan_list *l, u16 cid) | 77 | static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn, u16 cid) |
78 | { | 78 | { |
79 | struct sock *s; | 79 | struct l2cap_chan *c; |
80 | for (s = l->head; s; s = l2cap_pi(s)->next_c) { | 80 | |
81 | if (l2cap_pi(s)->dcid == cid) | 81 | list_for_each_entry(c, &conn->chan_l, list) { |
82 | break; | 82 | if (c->dcid == cid) |
83 | return c; | ||
83 | } | 84 | } |
84 | return s; | 85 | return NULL; |
86 | |||
85 | } | 87 | } |
86 | 88 | ||
87 | static struct sock *__l2cap_get_chan_by_scid(struct l2cap_chan_list *l, u16 cid) | 89 | static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn, u16 cid) |
88 | { | 90 | { |
89 | struct sock *s; | 91 | struct l2cap_chan *c; |
90 | for (s = l->head; s; s = l2cap_pi(s)->next_c) { | 92 | |
91 | if (l2cap_pi(s)->scid == cid) | 93 | list_for_each_entry(c, &conn->chan_l, list) { |
92 | break; | 94 | if (c->scid == cid) |
95 | return c; | ||
93 | } | 96 | } |
94 | return s; | 97 | return NULL; |
95 | } | 98 | } |
96 | 99 | ||
97 | /* Find channel with given SCID. | 100 | /* Find channel with given SCID. |
98 | * Returns locked socket */ | 101 | * Returns locked socket */ |
99 | static inline struct sock *l2cap_get_chan_by_scid(struct l2cap_chan_list *l, u16 cid) | 102 | static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn, u16 cid) |
100 | { | 103 | { |
101 | struct sock *s; | 104 | struct l2cap_chan *c; |
102 | read_lock(&l->lock); | 105 | |
103 | s = __l2cap_get_chan_by_scid(l, cid); | 106 | read_lock(&conn->chan_lock); |
104 | if (s) | 107 | c = __l2cap_get_chan_by_scid(conn, cid); |
105 | bh_lock_sock(s); | 108 | if (c) |
106 | read_unlock(&l->lock); | 109 | bh_lock_sock(c->sk); |
107 | return s; | 110 | read_unlock(&conn->chan_lock); |
111 | return c; | ||
108 | } | 112 | } |
109 | 113 | ||
110 | static struct sock *__l2cap_get_chan_by_ident(struct l2cap_chan_list *l, u8 ident) | 114 | static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn, u8 ident) |
111 | { | 115 | { |
112 | struct sock *s; | 116 | struct l2cap_chan *c; |
113 | for (s = l->head; s; s = l2cap_pi(s)->next_c) { | 117 | |
114 | if (l2cap_pi(s)->ident == ident) | 118 | list_for_each_entry(c, &conn->chan_l, list) { |
115 | break; | 119 | if (c->ident == ident) |
120 | return c; | ||
121 | } | ||
122 | return NULL; | ||
123 | } | ||
124 | |||
125 | static inline struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn, u8 ident) | ||
126 | { | ||
127 | struct l2cap_chan *c; | ||
128 | |||
129 | read_lock(&conn->chan_lock); | ||
130 | c = __l2cap_get_chan_by_ident(conn, ident); | ||
131 | if (c) | ||
132 | bh_lock_sock(c->sk); | ||
133 | read_unlock(&conn->chan_lock); | ||
134 | return c; | ||
135 | } | ||
136 | |||
137 | static struct l2cap_chan *__l2cap_global_chan_by_addr(__le16 psm, bdaddr_t *src) | ||
138 | { | ||
139 | struct l2cap_chan *c; | ||
140 | |||
141 | list_for_each_entry(c, &chan_list, global_l) { | ||
142 | if (c->sport == psm && !bacmp(&bt_sk(c->sk)->src, src)) | ||
143 | goto found; | ||
144 | } | ||
145 | |||
146 | c = NULL; | ||
147 | found: | ||
148 | return c; | ||
149 | } | ||
150 | |||
151 | int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm) | ||
152 | { | ||
153 | int err; | ||
154 | |||
155 | write_lock_bh(&chan_list_lock); | ||
156 | |||
157 | if (psm && __l2cap_global_chan_by_addr(psm, src)) { | ||
158 | err = -EADDRINUSE; | ||
159 | goto done; | ||
116 | } | 160 | } |
117 | return s; | 161 | |
162 | if (psm) { | ||
163 | chan->psm = psm; | ||
164 | chan->sport = psm; | ||
165 | err = 0; | ||
166 | } else { | ||
167 | u16 p; | ||
168 | |||
169 | err = -EINVAL; | ||
170 | for (p = 0x1001; p < 0x1100; p += 2) | ||
171 | if (!__l2cap_global_chan_by_addr(cpu_to_le16(p), src)) { | ||
172 | chan->psm = cpu_to_le16(p); | ||
173 | chan->sport = cpu_to_le16(p); | ||
174 | err = 0; | ||
175 | break; | ||
176 | } | ||
177 | } | ||
178 | |||
179 | done: | ||
180 | write_unlock_bh(&chan_list_lock); | ||
181 | return err; | ||
118 | } | 182 | } |
119 | 183 | ||
120 | static inline struct sock *l2cap_get_chan_by_ident(struct l2cap_chan_list *l, u8 ident) | 184 | int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid) |
121 | { | 185 | { |
122 | struct sock *s; | 186 | write_lock_bh(&chan_list_lock); |
123 | read_lock(&l->lock); | 187 | |
124 | s = __l2cap_get_chan_by_ident(l, ident); | 188 | chan->scid = scid; |
125 | if (s) | 189 | |
126 | bh_lock_sock(s); | 190 | write_unlock_bh(&chan_list_lock); |
127 | read_unlock(&l->lock); | 191 | |
128 | return s; | 192 | return 0; |
129 | } | 193 | } |
130 | 194 | ||
131 | static u16 l2cap_alloc_cid(struct l2cap_chan_list *l) | 195 | static u16 l2cap_alloc_cid(struct l2cap_conn *conn) |
132 | { | 196 | { |
133 | u16 cid = L2CAP_CID_DYN_START; | 197 | u16 cid = L2CAP_CID_DYN_START; |
134 | 198 | ||
135 | for (; cid < L2CAP_CID_DYN_END; cid++) { | 199 | for (; cid < L2CAP_CID_DYN_END; cid++) { |
136 | if (!__l2cap_get_chan_by_scid(l, cid)) | 200 | if (!__l2cap_get_chan_by_scid(conn, cid)) |
137 | return cid; | 201 | return cid; |
138 | } | 202 | } |
139 | 203 | ||
140 | return 0; | 204 | return 0; |
141 | } | 205 | } |
142 | 206 | ||
143 | static inline void __l2cap_chan_link(struct l2cap_chan_list *l, struct sock *sk) | 207 | struct l2cap_chan *l2cap_chan_create(struct sock *sk) |
144 | { | 208 | { |
145 | sock_hold(sk); | 209 | struct l2cap_chan *chan; |
146 | 210 | ||
147 | if (l->head) | 211 | chan = kzalloc(sizeof(*chan), GFP_ATOMIC); |
148 | l2cap_pi(l->head)->prev_c = sk; | 212 | if (!chan) |
213 | return NULL; | ||
149 | 214 | ||
150 | l2cap_pi(sk)->next_c = l->head; | 215 | chan->sk = sk; |
151 | l2cap_pi(sk)->prev_c = NULL; | ||
152 | l->head = sk; | ||
153 | } | ||
154 | 216 | ||
155 | static inline void l2cap_chan_unlink(struct l2cap_chan_list *l, struct sock *sk) | 217 | write_lock_bh(&chan_list_lock); |
156 | { | 218 | list_add(&chan->global_l, &chan_list); |
157 | struct sock *next = l2cap_pi(sk)->next_c, *prev = l2cap_pi(sk)->prev_c; | 219 | write_unlock_bh(&chan_list_lock); |
158 | 220 | ||
159 | write_lock_bh(&l->lock); | 221 | return chan; |
160 | if (sk == l->head) | 222 | } |
161 | l->head = next; | ||
162 | 223 | ||
163 | if (next) | 224 | void l2cap_chan_destroy(struct l2cap_chan *chan) |
164 | l2cap_pi(next)->prev_c = prev; | 225 | { |
165 | if (prev) | 226 | write_lock_bh(&chan_list_lock); |
166 | l2cap_pi(prev)->next_c = next; | 227 | list_del(&chan->global_l); |
167 | write_unlock_bh(&l->lock); | 228 | write_unlock_bh(&chan_list_lock); |
168 | 229 | ||
169 | __sock_put(sk); | 230 | kfree(chan); |
170 | } | 231 | } |
171 | 232 | ||
172 | static void __l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, struct sock *parent) | 233 | static void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) |
173 | { | 234 | { |
174 | struct l2cap_chan_list *l = &conn->chan_list; | 235 | struct sock *sk = chan->sk; |
175 | 236 | ||
176 | BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn, | 237 | BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn, |
177 | l2cap_pi(sk)->psm, l2cap_pi(sk)->dcid); | 238 | chan->psm, chan->dcid); |
178 | 239 | ||
179 | conn->disc_reason = 0x13; | 240 | conn->disc_reason = 0x13; |
180 | 241 | ||
181 | l2cap_pi(sk)->conn = conn; | 242 | chan->conn = conn; |
182 | 243 | ||
183 | if (sk->sk_type == SOCK_SEQPACKET || sk->sk_type == SOCK_STREAM) { | 244 | if (sk->sk_type == SOCK_SEQPACKET || sk->sk_type == SOCK_STREAM) { |
184 | if (conn->hcon->type == LE_LINK) { | 245 | if (conn->hcon->type == LE_LINK) { |
185 | /* LE connection */ | 246 | /* LE connection */ |
186 | l2cap_pi(sk)->omtu = L2CAP_LE_DEFAULT_MTU; | 247 | chan->omtu = L2CAP_LE_DEFAULT_MTU; |
187 | l2cap_pi(sk)->scid = L2CAP_CID_LE_DATA; | 248 | chan->scid = L2CAP_CID_LE_DATA; |
188 | l2cap_pi(sk)->dcid = L2CAP_CID_LE_DATA; | 249 | chan->dcid = L2CAP_CID_LE_DATA; |
189 | } else { | 250 | } else { |
190 | /* Alloc CID for connection-oriented socket */ | 251 | /* Alloc CID for connection-oriented socket */ |
191 | l2cap_pi(sk)->scid = l2cap_alloc_cid(l); | 252 | chan->scid = l2cap_alloc_cid(conn); |
192 | l2cap_pi(sk)->omtu = L2CAP_DEFAULT_MTU; | 253 | chan->omtu = L2CAP_DEFAULT_MTU; |
193 | } | 254 | } |
194 | } else if (sk->sk_type == SOCK_DGRAM) { | 255 | } else if (sk->sk_type == SOCK_DGRAM) { |
195 | /* Connectionless socket */ | 256 | /* Connectionless socket */ |
196 | l2cap_pi(sk)->scid = L2CAP_CID_CONN_LESS; | 257 | chan->scid = L2CAP_CID_CONN_LESS; |
197 | l2cap_pi(sk)->dcid = L2CAP_CID_CONN_LESS; | 258 | chan->dcid = L2CAP_CID_CONN_LESS; |
198 | l2cap_pi(sk)->omtu = L2CAP_DEFAULT_MTU; | 259 | chan->omtu = L2CAP_DEFAULT_MTU; |
199 | } else { | 260 | } else { |
200 | /* Raw socket can send/recv signalling messages only */ | 261 | /* Raw socket can send/recv signalling messages only */ |
201 | l2cap_pi(sk)->scid = L2CAP_CID_SIGNALING; | 262 | chan->scid = L2CAP_CID_SIGNALING; |
202 | l2cap_pi(sk)->dcid = L2CAP_CID_SIGNALING; | 263 | chan->dcid = L2CAP_CID_SIGNALING; |
203 | l2cap_pi(sk)->omtu = L2CAP_DEFAULT_MTU; | 264 | chan->omtu = L2CAP_DEFAULT_MTU; |
204 | } | 265 | } |
205 | 266 | ||
206 | __l2cap_chan_link(l, sk); | 267 | sock_hold(sk); |
207 | 268 | ||
208 | if (parent) | 269 | list_add(&chan->list, &conn->chan_l); |
209 | bt_accept_enqueue(parent, sk); | ||
210 | } | 270 | } |
211 | 271 | ||
212 | /* Delete channel. | 272 | /* Delete channel. |
213 | * Must be called on the locked socket. */ | 273 | * Must be called on the locked socket. */ |
214 | void l2cap_chan_del(struct sock *sk, int err) | 274 | void l2cap_chan_del(struct l2cap_chan *chan, int err) |
215 | { | 275 | { |
216 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; | 276 | struct sock *sk = chan->sk; |
277 | struct l2cap_conn *conn = chan->conn; | ||
217 | struct sock *parent = bt_sk(sk)->parent; | 278 | struct sock *parent = bt_sk(sk)->parent; |
218 | 279 | ||
219 | l2cap_sock_clear_timer(sk); | 280 | l2cap_sock_clear_timer(sk); |
220 | 281 | ||
221 | BT_DBG("sk %p, conn %p, err %d", sk, conn, err); | 282 | BT_DBG("chan %p, conn %p, err %d", chan, conn, err); |
222 | 283 | ||
223 | if (conn) { | 284 | if (conn) { |
224 | /* Unlink from channel list */ | 285 | /* Delete from channel list */ |
225 | l2cap_chan_unlink(&conn->chan_list, sk); | 286 | write_lock_bh(&conn->chan_lock); |
226 | l2cap_pi(sk)->conn = NULL; | 287 | list_del(&chan->list); |
288 | write_unlock_bh(&conn->chan_lock); | ||
289 | __sock_put(sk); | ||
290 | |||
291 | chan->conn = NULL; | ||
227 | hci_conn_put(conn->hcon); | 292 | hci_conn_put(conn->hcon); |
228 | } | 293 | } |
229 | 294 | ||
@@ -239,29 +304,35 @@ void l2cap_chan_del(struct sock *sk, int err) | |||
239 | } else | 304 | } else |
240 | sk->sk_state_change(sk); | 305 | sk->sk_state_change(sk); |
241 | 306 | ||
242 | skb_queue_purge(TX_QUEUE(sk)); | 307 | if (!(chan->conf_state & L2CAP_CONF_OUTPUT_DONE && |
308 | chan->conf_state & L2CAP_CONF_INPUT_DONE)) | ||
309 | return; | ||
310 | |||
311 | skb_queue_purge(&chan->tx_q); | ||
243 | 312 | ||
244 | if (l2cap_pi(sk)->mode == L2CAP_MODE_ERTM) { | 313 | if (chan->mode == L2CAP_MODE_ERTM) { |
245 | struct srej_list *l, *tmp; | 314 | struct srej_list *l, *tmp; |
246 | 315 | ||
247 | del_timer(&l2cap_pi(sk)->retrans_timer); | 316 | del_timer(&chan->retrans_timer); |
248 | del_timer(&l2cap_pi(sk)->monitor_timer); | 317 | del_timer(&chan->monitor_timer); |
249 | del_timer(&l2cap_pi(sk)->ack_timer); | 318 | del_timer(&chan->ack_timer); |
250 | 319 | ||
251 | skb_queue_purge(SREJ_QUEUE(sk)); | 320 | skb_queue_purge(&chan->srej_q); |
252 | skb_queue_purge(BUSY_QUEUE(sk)); | 321 | skb_queue_purge(&chan->busy_q); |
253 | 322 | ||
254 | list_for_each_entry_safe(l, tmp, SREJ_LIST(sk), list) { | 323 | list_for_each_entry_safe(l, tmp, &chan->srej_l, list) { |
255 | list_del(&l->list); | 324 | list_del(&l->list); |
256 | kfree(l); | 325 | kfree(l); |
257 | } | 326 | } |
258 | } | 327 | } |
259 | } | 328 | } |
260 | 329 | ||
261 | static inline u8 l2cap_get_auth_type(struct sock *sk) | 330 | static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan) |
262 | { | 331 | { |
332 | struct sock *sk = chan->sk; | ||
333 | |||
263 | if (sk->sk_type == SOCK_RAW) { | 334 | if (sk->sk_type == SOCK_RAW) { |
264 | switch (l2cap_pi(sk)->sec_level) { | 335 | switch (chan->sec_level) { |
265 | case BT_SECURITY_HIGH: | 336 | case BT_SECURITY_HIGH: |
266 | return HCI_AT_DEDICATED_BONDING_MITM; | 337 | return HCI_AT_DEDICATED_BONDING_MITM; |
267 | case BT_SECURITY_MEDIUM: | 338 | case BT_SECURITY_MEDIUM: |
@@ -269,16 +340,16 @@ static inline u8 l2cap_get_auth_type(struct sock *sk) | |||
269 | default: | 340 | default: |
270 | return HCI_AT_NO_BONDING; | 341 | return HCI_AT_NO_BONDING; |
271 | } | 342 | } |
272 | } else if (l2cap_pi(sk)->psm == cpu_to_le16(0x0001)) { | 343 | } else if (chan->psm == cpu_to_le16(0x0001)) { |
273 | if (l2cap_pi(sk)->sec_level == BT_SECURITY_LOW) | 344 | if (chan->sec_level == BT_SECURITY_LOW) |
274 | l2cap_pi(sk)->sec_level = BT_SECURITY_SDP; | 345 | chan->sec_level = BT_SECURITY_SDP; |
275 | 346 | ||
276 | if (l2cap_pi(sk)->sec_level == BT_SECURITY_HIGH) | 347 | if (chan->sec_level == BT_SECURITY_HIGH) |
277 | return HCI_AT_NO_BONDING_MITM; | 348 | return HCI_AT_NO_BONDING_MITM; |
278 | else | 349 | else |
279 | return HCI_AT_NO_BONDING; | 350 | return HCI_AT_NO_BONDING; |
280 | } else { | 351 | } else { |
281 | switch (l2cap_pi(sk)->sec_level) { | 352 | switch (chan->sec_level) { |
282 | case BT_SECURITY_HIGH: | 353 | case BT_SECURITY_HIGH: |
283 | return HCI_AT_GENERAL_BONDING_MITM; | 354 | return HCI_AT_GENERAL_BONDING_MITM; |
284 | case BT_SECURITY_MEDIUM: | 355 | case BT_SECURITY_MEDIUM: |
@@ -290,15 +361,14 @@ static inline u8 l2cap_get_auth_type(struct sock *sk) | |||
290 | } | 361 | } |
291 | 362 | ||
292 | /* Service level security */ | 363 | /* Service level security */ |
293 | static inline int l2cap_check_security(struct sock *sk) | 364 | static inline int l2cap_check_security(struct l2cap_chan *chan) |
294 | { | 365 | { |
295 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; | 366 | struct l2cap_conn *conn = chan->conn; |
296 | __u8 auth_type; | 367 | __u8 auth_type; |
297 | 368 | ||
298 | auth_type = l2cap_get_auth_type(sk); | 369 | auth_type = l2cap_get_auth_type(chan); |
299 | 370 | ||
300 | return hci_conn_security(conn->hcon, l2cap_pi(sk)->sec_level, | 371 | return hci_conn_security(conn->hcon, chan->sec_level, auth_type); |
301 | auth_type); | ||
302 | } | 372 | } |
303 | 373 | ||
304 | u8 l2cap_get_ident(struct l2cap_conn *conn) | 374 | u8 l2cap_get_ident(struct l2cap_conn *conn) |
@@ -341,11 +411,12 @@ void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *d | |||
341 | hci_send_acl(conn->hcon, skb, flags); | 411 | hci_send_acl(conn->hcon, skb, flags); |
342 | } | 412 | } |
343 | 413 | ||
344 | static inline void l2cap_send_sframe(struct l2cap_pinfo *pi, u16 control) | 414 | static inline void l2cap_send_sframe(struct l2cap_chan *chan, u16 control) |
345 | { | 415 | { |
346 | struct sk_buff *skb; | 416 | struct sk_buff *skb; |
347 | struct l2cap_hdr *lh; | 417 | struct l2cap_hdr *lh; |
348 | struct l2cap_conn *conn = pi->conn; | 418 | struct l2cap_pinfo *pi = l2cap_pi(chan->sk); |
419 | struct l2cap_conn *conn = chan->conn; | ||
349 | struct sock *sk = (struct sock *)pi; | 420 | struct sock *sk = (struct sock *)pi; |
350 | int count, hlen = L2CAP_HDR_SIZE + 2; | 421 | int count, hlen = L2CAP_HDR_SIZE + 2; |
351 | u8 flags; | 422 | u8 flags; |
@@ -353,22 +424,22 @@ static inline void l2cap_send_sframe(struct l2cap_pinfo *pi, u16 control) | |||
353 | if (sk->sk_state != BT_CONNECTED) | 424 | if (sk->sk_state != BT_CONNECTED) |
354 | return; | 425 | return; |
355 | 426 | ||
356 | if (pi->fcs == L2CAP_FCS_CRC16) | 427 | if (chan->fcs == L2CAP_FCS_CRC16) |
357 | hlen += 2; | 428 | hlen += 2; |
358 | 429 | ||
359 | BT_DBG("pi %p, control 0x%2.2x", pi, control); | 430 | BT_DBG("chan %p, control 0x%2.2x", chan, control); |
360 | 431 | ||
361 | count = min_t(unsigned int, conn->mtu, hlen); | 432 | count = min_t(unsigned int, conn->mtu, hlen); |
362 | control |= L2CAP_CTRL_FRAME_TYPE; | 433 | control |= L2CAP_CTRL_FRAME_TYPE; |
363 | 434 | ||
364 | if (pi->conn_state & L2CAP_CONN_SEND_FBIT) { | 435 | if (chan->conn_state & L2CAP_CONN_SEND_FBIT) { |
365 | control |= L2CAP_CTRL_FINAL; | 436 | control |= L2CAP_CTRL_FINAL; |
366 | pi->conn_state &= ~L2CAP_CONN_SEND_FBIT; | 437 | chan->conn_state &= ~L2CAP_CONN_SEND_FBIT; |
367 | } | 438 | } |
368 | 439 | ||
369 | if (pi->conn_state & L2CAP_CONN_SEND_PBIT) { | 440 | if (chan->conn_state & L2CAP_CONN_SEND_PBIT) { |
370 | control |= L2CAP_CTRL_POLL; | 441 | control |= L2CAP_CTRL_POLL; |
371 | pi->conn_state &= ~L2CAP_CONN_SEND_PBIT; | 442 | chan->conn_state &= ~L2CAP_CONN_SEND_PBIT; |
372 | } | 443 | } |
373 | 444 | ||
374 | skb = bt_skb_alloc(count, GFP_ATOMIC); | 445 | skb = bt_skb_alloc(count, GFP_ATOMIC); |
@@ -377,10 +448,10 @@ static inline void l2cap_send_sframe(struct l2cap_pinfo *pi, u16 control) | |||
377 | 448 | ||
378 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); | 449 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); |
379 | lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE); | 450 | lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE); |
380 | lh->cid = cpu_to_le16(pi->dcid); | 451 | lh->cid = cpu_to_le16(chan->dcid); |
381 | put_unaligned_le16(control, skb_put(skb, 2)); | 452 | put_unaligned_le16(control, skb_put(skb, 2)); |
382 | 453 | ||
383 | if (pi->fcs == L2CAP_FCS_CRC16) { | 454 | if (chan->fcs == L2CAP_FCS_CRC16) { |
384 | u16 fcs = crc16(0, (u8 *)lh, count - 2); | 455 | u16 fcs = crc16(0, (u8 *)lh, count - 2); |
385 | put_unaligned_le16(fcs, skb_put(skb, 2)); | 456 | put_unaligned_le16(fcs, skb_put(skb, 2)); |
386 | } | 457 | } |
@@ -390,45 +461,46 @@ static inline void l2cap_send_sframe(struct l2cap_pinfo *pi, u16 control) | |||
390 | else | 461 | else |
391 | flags = ACL_START; | 462 | flags = ACL_START; |
392 | 463 | ||
393 | hci_send_acl(pi->conn->hcon, skb, flags); | 464 | hci_send_acl(chan->conn->hcon, skb, flags); |
394 | } | 465 | } |
395 | 466 | ||
396 | static inline void l2cap_send_rr_or_rnr(struct l2cap_pinfo *pi, u16 control) | 467 | static inline void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, u16 control) |
397 | { | 468 | { |
398 | if (pi->conn_state & L2CAP_CONN_LOCAL_BUSY) { | 469 | if (chan->conn_state & L2CAP_CONN_LOCAL_BUSY) { |
399 | control |= L2CAP_SUPER_RCV_NOT_READY; | 470 | control |= L2CAP_SUPER_RCV_NOT_READY; |
400 | pi->conn_state |= L2CAP_CONN_RNR_SENT; | 471 | chan->conn_state |= L2CAP_CONN_RNR_SENT; |
401 | } else | 472 | } else |
402 | control |= L2CAP_SUPER_RCV_READY; | 473 | control |= L2CAP_SUPER_RCV_READY; |
403 | 474 | ||
404 | control |= pi->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; | 475 | control |= chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; |
405 | 476 | ||
406 | l2cap_send_sframe(pi, control); | 477 | l2cap_send_sframe(chan, control); |
407 | } | 478 | } |
408 | 479 | ||
409 | static inline int __l2cap_no_conn_pending(struct sock *sk) | 480 | static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan) |
410 | { | 481 | { |
411 | return !(l2cap_pi(sk)->conf_state & L2CAP_CONF_CONNECT_PEND); | 482 | return !(chan->conf_state & L2CAP_CONF_CONNECT_PEND); |
412 | } | 483 | } |
413 | 484 | ||
414 | static void l2cap_do_start(struct sock *sk) | 485 | static void l2cap_do_start(struct l2cap_chan *chan) |
415 | { | 486 | { |
416 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; | 487 | struct l2cap_conn *conn = chan->conn; |
417 | 488 | ||
418 | if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) { | 489 | if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) { |
419 | if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)) | 490 | if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)) |
420 | return; | 491 | return; |
421 | 492 | ||
422 | if (l2cap_check_security(sk) && __l2cap_no_conn_pending(sk)) { | 493 | if (l2cap_check_security(chan) && |
494 | __l2cap_no_conn_pending(chan)) { | ||
423 | struct l2cap_conn_req req; | 495 | struct l2cap_conn_req req; |
424 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | 496 | req.scid = cpu_to_le16(chan->scid); |
425 | req.psm = l2cap_pi(sk)->psm; | 497 | req.psm = chan->psm; |
426 | 498 | ||
427 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); | 499 | chan->ident = l2cap_get_ident(conn); |
428 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND; | 500 | chan->conf_state |= L2CAP_CONF_CONNECT_PEND; |
429 | 501 | ||
430 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, | 502 | l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, |
431 | L2CAP_CONN_REQ, sizeof(req), &req); | 503 | sizeof(req), &req); |
432 | } | 504 | } |
433 | } else { | 505 | } else { |
434 | struct l2cap_info_req req; | 506 | struct l2cap_info_req req; |
@@ -461,23 +533,24 @@ static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask) | |||
461 | } | 533 | } |
462 | } | 534 | } |
463 | 535 | ||
464 | void l2cap_send_disconn_req(struct l2cap_conn *conn, struct sock *sk, int err) | 536 | void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *chan, int err) |
465 | { | 537 | { |
538 | struct sock *sk; | ||
466 | struct l2cap_disconn_req req; | 539 | struct l2cap_disconn_req req; |
467 | 540 | ||
468 | if (!conn) | 541 | if (!conn) |
469 | return; | 542 | return; |
470 | 543 | ||
471 | skb_queue_purge(TX_QUEUE(sk)); | 544 | sk = chan->sk; |
472 | 545 | ||
473 | if (l2cap_pi(sk)->mode == L2CAP_MODE_ERTM) { | 546 | if (chan->mode == L2CAP_MODE_ERTM) { |
474 | del_timer(&l2cap_pi(sk)->retrans_timer); | 547 | del_timer(&chan->retrans_timer); |
475 | del_timer(&l2cap_pi(sk)->monitor_timer); | 548 | del_timer(&chan->monitor_timer); |
476 | del_timer(&l2cap_pi(sk)->ack_timer); | 549 | del_timer(&chan->ack_timer); |
477 | } | 550 | } |
478 | 551 | ||
479 | req.dcid = cpu_to_le16(l2cap_pi(sk)->dcid); | 552 | req.dcid = cpu_to_le16(chan->dcid); |
480 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | 553 | req.scid = cpu_to_le16(chan->scid); |
481 | l2cap_send_cmd(conn, l2cap_get_ident(conn), | 554 | l2cap_send_cmd(conn, l2cap_get_ident(conn), |
482 | L2CAP_DISCONN_REQ, sizeof(req), &req); | 555 | L2CAP_DISCONN_REQ, sizeof(req), &req); |
483 | 556 | ||
@@ -488,17 +561,15 @@ void l2cap_send_disconn_req(struct l2cap_conn *conn, struct sock *sk, int err) | |||
488 | /* ---- L2CAP connections ---- */ | 561 | /* ---- L2CAP connections ---- */ |
489 | static void l2cap_conn_start(struct l2cap_conn *conn) | 562 | static void l2cap_conn_start(struct l2cap_conn *conn) |
490 | { | 563 | { |
491 | struct l2cap_chan_list *l = &conn->chan_list; | 564 | struct l2cap_chan *chan, *tmp; |
492 | struct sock_del_list del, *tmp1, *tmp2; | ||
493 | struct sock *sk; | ||
494 | 565 | ||
495 | BT_DBG("conn %p", conn); | 566 | BT_DBG("conn %p", conn); |
496 | 567 | ||
497 | INIT_LIST_HEAD(&del.list); | 568 | read_lock(&conn->chan_lock); |
498 | 569 | ||
499 | read_lock(&l->lock); | 570 | list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) { |
571 | struct sock *sk = chan->sk; | ||
500 | 572 | ||
501 | for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) { | ||
502 | bh_lock_sock(sk); | 573 | bh_lock_sock(sk); |
503 | 574 | ||
504 | if (sk->sk_type != SOCK_SEQPACKET && | 575 | if (sk->sk_type != SOCK_SEQPACKET && |
@@ -510,40 +581,41 @@ static void l2cap_conn_start(struct l2cap_conn *conn) | |||
510 | if (sk->sk_state == BT_CONNECT) { | 581 | if (sk->sk_state == BT_CONNECT) { |
511 | struct l2cap_conn_req req; | 582 | struct l2cap_conn_req req; |
512 | 583 | ||
513 | if (!l2cap_check_security(sk) || | 584 | if (!l2cap_check_security(chan) || |
514 | !__l2cap_no_conn_pending(sk)) { | 585 | !__l2cap_no_conn_pending(chan)) { |
515 | bh_unlock_sock(sk); | 586 | bh_unlock_sock(sk); |
516 | continue; | 587 | continue; |
517 | } | 588 | } |
518 | 589 | ||
519 | if (!l2cap_mode_supported(l2cap_pi(sk)->mode, | 590 | if (!l2cap_mode_supported(chan->mode, |
520 | conn->feat_mask) | 591 | conn->feat_mask) |
521 | && l2cap_pi(sk)->conf_state & | 592 | && chan->conf_state & |
522 | L2CAP_CONF_STATE2_DEVICE) { | 593 | L2CAP_CONF_STATE2_DEVICE) { |
523 | tmp1 = kzalloc(sizeof(struct sock_del_list), | 594 | /* __l2cap_sock_close() calls list_del(chan) |
524 | GFP_ATOMIC); | 595 | * so release the lock */ |
525 | tmp1->sk = sk; | 596 | read_unlock_bh(&conn->chan_lock); |
526 | list_add_tail(&tmp1->list, &del.list); | 597 | __l2cap_sock_close(sk, ECONNRESET); |
598 | read_lock_bh(&conn->chan_lock); | ||
527 | bh_unlock_sock(sk); | 599 | bh_unlock_sock(sk); |
528 | continue; | 600 | continue; |
529 | } | 601 | } |
530 | 602 | ||
531 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | 603 | req.scid = cpu_to_le16(chan->scid); |
532 | req.psm = l2cap_pi(sk)->psm; | 604 | req.psm = chan->psm; |
533 | 605 | ||
534 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); | 606 | chan->ident = l2cap_get_ident(conn); |
535 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND; | 607 | chan->conf_state |= L2CAP_CONF_CONNECT_PEND; |
536 | 608 | ||
537 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, | 609 | l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, |
538 | L2CAP_CONN_REQ, sizeof(req), &req); | 610 | sizeof(req), &req); |
539 | 611 | ||
540 | } else if (sk->sk_state == BT_CONNECT2) { | 612 | } else if (sk->sk_state == BT_CONNECT2) { |
541 | struct l2cap_conn_rsp rsp; | 613 | struct l2cap_conn_rsp rsp; |
542 | char buf[128]; | 614 | char buf[128]; |
543 | rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid); | 615 | rsp.scid = cpu_to_le16(chan->dcid); |
544 | rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid); | 616 | rsp.dcid = cpu_to_le16(chan->scid); |
545 | 617 | ||
546 | if (l2cap_check_security(sk)) { | 618 | if (l2cap_check_security(chan)) { |
547 | if (bt_sk(sk)->defer_setup) { | 619 | if (bt_sk(sk)->defer_setup) { |
548 | struct sock *parent = bt_sk(sk)->parent; | 620 | struct sock *parent = bt_sk(sk)->parent; |
549 | rsp.result = cpu_to_le16(L2CAP_CR_PEND); | 621 | rsp.result = cpu_to_le16(L2CAP_CR_PEND); |
@@ -560,80 +632,77 @@ static void l2cap_conn_start(struct l2cap_conn *conn) | |||
560 | rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND); | 632 | rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND); |
561 | } | 633 | } |
562 | 634 | ||
563 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, | 635 | l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, |
564 | L2CAP_CONN_RSP, sizeof(rsp), &rsp); | 636 | sizeof(rsp), &rsp); |
565 | 637 | ||
566 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT || | 638 | if (chan->conf_state & L2CAP_CONF_REQ_SENT || |
567 | rsp.result != L2CAP_CR_SUCCESS) { | 639 | rsp.result != L2CAP_CR_SUCCESS) { |
568 | bh_unlock_sock(sk); | 640 | bh_unlock_sock(sk); |
569 | continue; | 641 | continue; |
570 | } | 642 | } |
571 | 643 | ||
572 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; | 644 | chan->conf_state |= L2CAP_CONF_REQ_SENT; |
573 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, | 645 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, |
574 | l2cap_build_conf_req(sk, buf), buf); | 646 | l2cap_build_conf_req(chan, buf), buf); |
575 | l2cap_pi(sk)->num_conf_req++; | 647 | chan->num_conf_req++; |
576 | } | 648 | } |
577 | 649 | ||
578 | bh_unlock_sock(sk); | 650 | bh_unlock_sock(sk); |
579 | } | 651 | } |
580 | 652 | ||
581 | read_unlock(&l->lock); | 653 | read_unlock(&conn->chan_lock); |
582 | |||
583 | list_for_each_entry_safe(tmp1, tmp2, &del.list, list) { | ||
584 | bh_lock_sock(tmp1->sk); | ||
585 | __l2cap_sock_close(tmp1->sk, ECONNRESET); | ||
586 | bh_unlock_sock(tmp1->sk); | ||
587 | list_del(&tmp1->list); | ||
588 | kfree(tmp1); | ||
589 | } | ||
590 | } | 654 | } |
591 | 655 | ||
592 | /* Find socket with cid and source bdaddr. | 656 | /* Find socket with cid and source bdaddr. |
593 | * Returns closest match, locked. | 657 | * Returns closest match, locked. |
594 | */ | 658 | */ |
595 | static struct sock *l2cap_get_sock_by_scid(int state, __le16 cid, bdaddr_t *src) | 659 | static struct l2cap_chan *l2cap_global_chan_by_scid(int state, __le16 cid, bdaddr_t *src) |
596 | { | 660 | { |
597 | struct sock *s, *sk = NULL, *sk1 = NULL; | 661 | struct l2cap_chan *c, *c1 = NULL; |
598 | struct hlist_node *node; | 662 | |
663 | read_lock(&chan_list_lock); | ||
599 | 664 | ||
600 | read_lock(&l2cap_sk_list.lock); | 665 | list_for_each_entry(c, &chan_list, global_l) { |
666 | struct sock *sk = c->sk; | ||
601 | 667 | ||
602 | sk_for_each(sk, node, &l2cap_sk_list.head) { | ||
603 | if (state && sk->sk_state != state) | 668 | if (state && sk->sk_state != state) |
604 | continue; | 669 | continue; |
605 | 670 | ||
606 | if (l2cap_pi(sk)->scid == cid) { | 671 | if (c->scid == cid) { |
607 | /* Exact match. */ | 672 | /* Exact match. */ |
608 | if (!bacmp(&bt_sk(sk)->src, src)) | 673 | if (!bacmp(&bt_sk(sk)->src, src)) { |
609 | break; | 674 | read_unlock(&chan_list_lock); |
675 | return c; | ||
676 | } | ||
610 | 677 | ||
611 | /* Closest match */ | 678 | /* Closest match */ |
612 | if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY)) | 679 | if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY)) |
613 | sk1 = sk; | 680 | c1 = c; |
614 | } | 681 | } |
615 | } | 682 | } |
616 | s = node ? sk : sk1; | ||
617 | if (s) | ||
618 | bh_lock_sock(s); | ||
619 | read_unlock(&l2cap_sk_list.lock); | ||
620 | 683 | ||
621 | return s; | 684 | read_unlock(&chan_list_lock); |
685 | |||
686 | return c1; | ||
622 | } | 687 | } |
623 | 688 | ||
624 | static void l2cap_le_conn_ready(struct l2cap_conn *conn) | 689 | static void l2cap_le_conn_ready(struct l2cap_conn *conn) |
625 | { | 690 | { |
626 | struct l2cap_chan_list *list = &conn->chan_list; | 691 | struct sock *parent, *sk; |
627 | struct sock *parent, *uninitialized_var(sk); | 692 | struct l2cap_chan *chan, *pchan; |
628 | 693 | ||
629 | BT_DBG(""); | 694 | BT_DBG(""); |
630 | 695 | ||
631 | /* Check if we have socket listening on cid */ | 696 | /* Check if we have socket listening on cid */ |
632 | parent = l2cap_get_sock_by_scid(BT_LISTEN, L2CAP_CID_LE_DATA, | 697 | pchan = l2cap_global_chan_by_scid(BT_LISTEN, L2CAP_CID_LE_DATA, |
633 | conn->src); | 698 | conn->src); |
634 | if (!parent) | 699 | if (!pchan) |
635 | return; | 700 | return; |
636 | 701 | ||
702 | parent = pchan->sk; | ||
703 | |||
704 | bh_lock_sock(parent); | ||
705 | |||
637 | /* Check for backlog size */ | 706 | /* Check for backlog size */ |
638 | if (sk_acceptq_is_full(parent)) { | 707 | if (sk_acceptq_is_full(parent)) { |
639 | BT_DBG("backlog full %d", parent->sk_ack_backlog); | 708 | BT_DBG("backlog full %d", parent->sk_ack_backlog); |
@@ -644,22 +713,33 @@ static void l2cap_le_conn_ready(struct l2cap_conn *conn) | |||
644 | if (!sk) | 713 | if (!sk) |
645 | goto clean; | 714 | goto clean; |
646 | 715 | ||
647 | write_lock_bh(&list->lock); | 716 | chan = l2cap_chan_create(sk); |
717 | if (!chan) { | ||
718 | l2cap_sock_kill(sk); | ||
719 | goto clean; | ||
720 | } | ||
721 | |||
722 | l2cap_pi(sk)->chan = chan; | ||
723 | |||
724 | write_lock_bh(&conn->chan_lock); | ||
648 | 725 | ||
649 | hci_conn_hold(conn->hcon); | 726 | hci_conn_hold(conn->hcon); |
650 | 727 | ||
651 | l2cap_sock_init(sk, parent); | 728 | l2cap_sock_init(sk, parent); |
729 | |||
652 | bacpy(&bt_sk(sk)->src, conn->src); | 730 | bacpy(&bt_sk(sk)->src, conn->src); |
653 | bacpy(&bt_sk(sk)->dst, conn->dst); | 731 | bacpy(&bt_sk(sk)->dst, conn->dst); |
654 | 732 | ||
655 | __l2cap_chan_add(conn, sk, parent); | 733 | bt_accept_enqueue(parent, sk); |
734 | |||
735 | __l2cap_chan_add(conn, chan); | ||
656 | 736 | ||
657 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); | 737 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); |
658 | 738 | ||
659 | sk->sk_state = BT_CONNECTED; | 739 | sk->sk_state = BT_CONNECTED; |
660 | parent->sk_data_ready(parent, 0); | 740 | parent->sk_data_ready(parent, 0); |
661 | 741 | ||
662 | write_unlock_bh(&list->lock); | 742 | write_unlock_bh(&conn->chan_lock); |
663 | 743 | ||
664 | clean: | 744 | clean: |
665 | bh_unlock_sock(parent); | 745 | bh_unlock_sock(parent); |
@@ -667,17 +747,18 @@ clean: | |||
667 | 747 | ||
668 | static void l2cap_conn_ready(struct l2cap_conn *conn) | 748 | static void l2cap_conn_ready(struct l2cap_conn *conn) |
669 | { | 749 | { |
670 | struct l2cap_chan_list *l = &conn->chan_list; | 750 | struct l2cap_chan *chan; |
671 | struct sock *sk; | ||
672 | 751 | ||
673 | BT_DBG("conn %p", conn); | 752 | BT_DBG("conn %p", conn); |
674 | 753 | ||
675 | if (!conn->hcon->out && conn->hcon->type == LE_LINK) | 754 | if (!conn->hcon->out && conn->hcon->type == LE_LINK) |
676 | l2cap_le_conn_ready(conn); | 755 | l2cap_le_conn_ready(conn); |
677 | 756 | ||
678 | read_lock(&l->lock); | 757 | read_lock(&conn->chan_lock); |
758 | |||
759 | list_for_each_entry(chan, &conn->chan_l, list) { | ||
760 | struct sock *sk = chan->sk; | ||
679 | 761 | ||
680 | for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) { | ||
681 | bh_lock_sock(sk); | 762 | bh_lock_sock(sk); |
682 | 763 | ||
683 | if (conn->hcon->type == LE_LINK) { | 764 | if (conn->hcon->type == LE_LINK) { |
@@ -692,30 +773,31 @@ static void l2cap_conn_ready(struct l2cap_conn *conn) | |||
692 | sk->sk_state = BT_CONNECTED; | 773 | sk->sk_state = BT_CONNECTED; |
693 | sk->sk_state_change(sk); | 774 | sk->sk_state_change(sk); |
694 | } else if (sk->sk_state == BT_CONNECT) | 775 | } else if (sk->sk_state == BT_CONNECT) |
695 | l2cap_do_start(sk); | 776 | l2cap_do_start(chan); |
696 | 777 | ||
697 | bh_unlock_sock(sk); | 778 | bh_unlock_sock(sk); |
698 | } | 779 | } |
699 | 780 | ||
700 | read_unlock(&l->lock); | 781 | read_unlock(&conn->chan_lock); |
701 | } | 782 | } |
702 | 783 | ||
703 | /* Notify sockets that we cannot guaranty reliability anymore */ | 784 | /* Notify sockets that we cannot guaranty reliability anymore */ |
704 | static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err) | 785 | static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err) |
705 | { | 786 | { |
706 | struct l2cap_chan_list *l = &conn->chan_list; | 787 | struct l2cap_chan *chan; |
707 | struct sock *sk; | ||
708 | 788 | ||
709 | BT_DBG("conn %p", conn); | 789 | BT_DBG("conn %p", conn); |
710 | 790 | ||
711 | read_lock(&l->lock); | 791 | read_lock(&conn->chan_lock); |
712 | 792 | ||
713 | for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) { | 793 | list_for_each_entry(chan, &conn->chan_l, list) { |
714 | if (l2cap_pi(sk)->force_reliable) | 794 | struct sock *sk = chan->sk; |
795 | |||
796 | if (chan->force_reliable) | ||
715 | sk->sk_err = err; | 797 | sk->sk_err = err; |
716 | } | 798 | } |
717 | 799 | ||
718 | read_unlock(&l->lock); | 800 | read_unlock(&conn->chan_lock); |
719 | } | 801 | } |
720 | 802 | ||
721 | static void l2cap_info_timeout(unsigned long arg) | 803 | static void l2cap_info_timeout(unsigned long arg) |
@@ -755,7 +837,9 @@ static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status) | |||
755 | conn->feat_mask = 0; | 837 | conn->feat_mask = 0; |
756 | 838 | ||
757 | spin_lock_init(&conn->lock); | 839 | spin_lock_init(&conn->lock); |
758 | rwlock_init(&conn->chan_list.lock); | 840 | rwlock_init(&conn->chan_lock); |
841 | |||
842 | INIT_LIST_HEAD(&conn->chan_l); | ||
759 | 843 | ||
760 | if (hcon->type != LE_LINK) | 844 | if (hcon->type != LE_LINK) |
761 | setup_timer(&conn->info_timer, l2cap_info_timeout, | 845 | setup_timer(&conn->info_timer, l2cap_info_timeout, |
@@ -769,6 +853,7 @@ static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status) | |||
769 | static void l2cap_conn_del(struct hci_conn *hcon, int err) | 853 | static void l2cap_conn_del(struct hci_conn *hcon, int err) |
770 | { | 854 | { |
771 | struct l2cap_conn *conn = hcon->l2cap_data; | 855 | struct l2cap_conn *conn = hcon->l2cap_data; |
856 | struct l2cap_chan *chan, *l; | ||
772 | struct sock *sk; | 857 | struct sock *sk; |
773 | 858 | ||
774 | if (!conn) | 859 | if (!conn) |
@@ -779,9 +864,10 @@ static void l2cap_conn_del(struct hci_conn *hcon, int err) | |||
779 | kfree_skb(conn->rx_skb); | 864 | kfree_skb(conn->rx_skb); |
780 | 865 | ||
781 | /* Kill channels */ | 866 | /* Kill channels */ |
782 | while ((sk = conn->chan_list.head)) { | 867 | list_for_each_entry_safe(chan, l, &conn->chan_l, list) { |
868 | sk = chan->sk; | ||
783 | bh_lock_sock(sk); | 869 | bh_lock_sock(sk); |
784 | l2cap_chan_del(sk, err); | 870 | l2cap_chan_del(chan, err); |
785 | bh_unlock_sock(sk); | 871 | bh_unlock_sock(sk); |
786 | l2cap_sock_kill(sk); | 872 | l2cap_sock_kill(sk); |
787 | } | 873 | } |
@@ -793,12 +879,11 @@ static void l2cap_conn_del(struct hci_conn *hcon, int err) | |||
793 | kfree(conn); | 879 | kfree(conn); |
794 | } | 880 | } |
795 | 881 | ||
796 | static inline void l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, struct sock *parent) | 882 | static inline void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) |
797 | { | 883 | { |
798 | struct l2cap_chan_list *l = &conn->chan_list; | 884 | write_lock_bh(&conn->chan_lock); |
799 | write_lock_bh(&l->lock); | 885 | __l2cap_chan_add(conn, chan); |
800 | __l2cap_chan_add(conn, sk, parent); | 886 | write_unlock_bh(&conn->chan_lock); |
801 | write_unlock_bh(&l->lock); | ||
802 | } | 887 | } |
803 | 888 | ||
804 | /* ---- Socket interface ---- */ | 889 | /* ---- Socket interface ---- */ |
@@ -806,35 +891,39 @@ static inline void l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, stru | |||
806 | /* Find socket with psm and source bdaddr. | 891 | /* Find socket with psm and source bdaddr. |
807 | * Returns closest match. | 892 | * Returns closest match. |
808 | */ | 893 | */ |
809 | static struct sock *l2cap_get_sock_by_psm(int state, __le16 psm, bdaddr_t *src) | 894 | static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm, bdaddr_t *src) |
810 | { | 895 | { |
811 | struct sock *sk = NULL, *sk1 = NULL; | 896 | struct l2cap_chan *c, *c1 = NULL; |
812 | struct hlist_node *node; | ||
813 | 897 | ||
814 | read_lock(&l2cap_sk_list.lock); | 898 | read_lock(&chan_list_lock); |
899 | |||
900 | list_for_each_entry(c, &chan_list, global_l) { | ||
901 | struct sock *sk = c->sk; | ||
815 | 902 | ||
816 | sk_for_each(sk, node, &l2cap_sk_list.head) { | ||
817 | if (state && sk->sk_state != state) | 903 | if (state && sk->sk_state != state) |
818 | continue; | 904 | continue; |
819 | 905 | ||
820 | if (l2cap_pi(sk)->psm == psm) { | 906 | if (c->psm == psm) { |
821 | /* Exact match. */ | 907 | /* Exact match. */ |
822 | if (!bacmp(&bt_sk(sk)->src, src)) | 908 | if (!bacmp(&bt_sk(sk)->src, src)) { |
823 | break; | 909 | read_unlock_bh(&chan_list_lock); |
910 | return c; | ||
911 | } | ||
824 | 912 | ||
825 | /* Closest match */ | 913 | /* Closest match */ |
826 | if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY)) | 914 | if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY)) |
827 | sk1 = sk; | 915 | c1 = c; |
828 | } | 916 | } |
829 | } | 917 | } |
830 | 918 | ||
831 | read_unlock(&l2cap_sk_list.lock); | 919 | read_unlock(&chan_list_lock); |
832 | 920 | ||
833 | return node ? sk : sk1; | 921 | return c1; |
834 | } | 922 | } |
835 | 923 | ||
836 | int l2cap_do_connect(struct sock *sk) | 924 | int l2cap_chan_connect(struct l2cap_chan *chan) |
837 | { | 925 | { |
926 | struct sock *sk = chan->sk; | ||
838 | bdaddr_t *src = &bt_sk(sk)->src; | 927 | bdaddr_t *src = &bt_sk(sk)->src; |
839 | bdaddr_t *dst = &bt_sk(sk)->dst; | 928 | bdaddr_t *dst = &bt_sk(sk)->dst; |
840 | struct l2cap_conn *conn; | 929 | struct l2cap_conn *conn; |
@@ -844,7 +933,7 @@ int l2cap_do_connect(struct sock *sk) | |||
844 | int err; | 933 | int err; |
845 | 934 | ||
846 | BT_DBG("%s -> %s psm 0x%2.2x", batostr(src), batostr(dst), | 935 | BT_DBG("%s -> %s psm 0x%2.2x", batostr(src), batostr(dst), |
847 | l2cap_pi(sk)->psm); | 936 | chan->psm); |
848 | 937 | ||
849 | hdev = hci_get_route(dst, src); | 938 | hdev = hci_get_route(dst, src); |
850 | if (!hdev) | 939 | if (!hdev) |
@@ -852,14 +941,14 @@ int l2cap_do_connect(struct sock *sk) | |||
852 | 941 | ||
853 | hci_dev_lock_bh(hdev); | 942 | hci_dev_lock_bh(hdev); |
854 | 943 | ||
855 | auth_type = l2cap_get_auth_type(sk); | 944 | auth_type = l2cap_get_auth_type(chan); |
856 | 945 | ||
857 | if (l2cap_pi(sk)->dcid == L2CAP_CID_LE_DATA) | 946 | if (chan->dcid == L2CAP_CID_LE_DATA) |
858 | hcon = hci_connect(hdev, LE_LINK, dst, | 947 | hcon = hci_connect(hdev, LE_LINK, dst, |
859 | l2cap_pi(sk)->sec_level, auth_type); | 948 | chan->sec_level, auth_type); |
860 | else | 949 | else |
861 | hcon = hci_connect(hdev, ACL_LINK, dst, | 950 | hcon = hci_connect(hdev, ACL_LINK, dst, |
862 | l2cap_pi(sk)->sec_level, auth_type); | 951 | chan->sec_level, auth_type); |
863 | 952 | ||
864 | if (IS_ERR(hcon)) { | 953 | if (IS_ERR(hcon)) { |
865 | err = PTR_ERR(hcon); | 954 | err = PTR_ERR(hcon); |
@@ -876,7 +965,7 @@ int l2cap_do_connect(struct sock *sk) | |||
876 | /* Update source addr of the socket */ | 965 | /* Update source addr of the socket */ |
877 | bacpy(src, conn->src); | 966 | bacpy(src, conn->src); |
878 | 967 | ||
879 | l2cap_chan_add(conn, sk, NULL); | 968 | l2cap_chan_add(conn, chan); |
880 | 969 | ||
881 | sk->sk_state = BT_CONNECT; | 970 | sk->sk_state = BT_CONNECT; |
882 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); | 971 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); |
@@ -885,10 +974,10 @@ int l2cap_do_connect(struct sock *sk) | |||
885 | if (sk->sk_type != SOCK_SEQPACKET && | 974 | if (sk->sk_type != SOCK_SEQPACKET && |
886 | sk->sk_type != SOCK_STREAM) { | 975 | sk->sk_type != SOCK_STREAM) { |
887 | l2cap_sock_clear_timer(sk); | 976 | l2cap_sock_clear_timer(sk); |
888 | if (l2cap_check_security(sk)) | 977 | if (l2cap_check_security(chan)) |
889 | sk->sk_state = BT_CONNECTED; | 978 | sk->sk_state = BT_CONNECTED; |
890 | } else | 979 | } else |
891 | l2cap_do_start(sk); | 980 | l2cap_do_start(chan); |
892 | } | 981 | } |
893 | 982 | ||
894 | err = 0; | 983 | err = 0; |
@@ -901,12 +990,13 @@ done: | |||
901 | 990 | ||
902 | int __l2cap_wait_ack(struct sock *sk) | 991 | int __l2cap_wait_ack(struct sock *sk) |
903 | { | 992 | { |
993 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | ||
904 | DECLARE_WAITQUEUE(wait, current); | 994 | DECLARE_WAITQUEUE(wait, current); |
905 | int err = 0; | 995 | int err = 0; |
906 | int timeo = HZ/5; | 996 | int timeo = HZ/5; |
907 | 997 | ||
908 | add_wait_queue(sk_sleep(sk), &wait); | 998 | add_wait_queue(sk_sleep(sk), &wait); |
909 | while ((l2cap_pi(sk)->unacked_frames > 0 && l2cap_pi(sk)->conn)) { | 999 | while ((chan->unacked_frames > 0 && chan->conn)) { |
910 | set_current_state(TASK_INTERRUPTIBLE); | 1000 | set_current_state(TASK_INTERRUPTIBLE); |
911 | 1001 | ||
912 | if (!timeo) | 1002 | if (!timeo) |
@@ -932,68 +1022,69 @@ int __l2cap_wait_ack(struct sock *sk) | |||
932 | 1022 | ||
933 | static void l2cap_monitor_timeout(unsigned long arg) | 1023 | static void l2cap_monitor_timeout(unsigned long arg) |
934 | { | 1024 | { |
935 | struct sock *sk = (void *) arg; | 1025 | struct l2cap_chan *chan = (void *) arg; |
1026 | struct sock *sk = chan->sk; | ||
936 | 1027 | ||
937 | BT_DBG("sk %p", sk); | 1028 | BT_DBG("chan %p", chan); |
938 | 1029 | ||
939 | bh_lock_sock(sk); | 1030 | bh_lock_sock(sk); |
940 | if (l2cap_pi(sk)->retry_count >= l2cap_pi(sk)->remote_max_tx) { | 1031 | if (chan->retry_count >= chan->remote_max_tx) { |
941 | l2cap_send_disconn_req(l2cap_pi(sk)->conn, sk, ECONNABORTED); | 1032 | l2cap_send_disconn_req(chan->conn, chan, ECONNABORTED); |
942 | bh_unlock_sock(sk); | 1033 | bh_unlock_sock(sk); |
943 | return; | 1034 | return; |
944 | } | 1035 | } |
945 | 1036 | ||
946 | l2cap_pi(sk)->retry_count++; | 1037 | chan->retry_count++; |
947 | __mod_monitor_timer(); | 1038 | __mod_monitor_timer(); |
948 | 1039 | ||
949 | l2cap_send_rr_or_rnr(l2cap_pi(sk), L2CAP_CTRL_POLL); | 1040 | l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL); |
950 | bh_unlock_sock(sk); | 1041 | bh_unlock_sock(sk); |
951 | } | 1042 | } |
952 | 1043 | ||
953 | static void l2cap_retrans_timeout(unsigned long arg) | 1044 | static void l2cap_retrans_timeout(unsigned long arg) |
954 | { | 1045 | { |
955 | struct sock *sk = (void *) arg; | 1046 | struct l2cap_chan *chan = (void *) arg; |
1047 | struct sock *sk = chan->sk; | ||
956 | 1048 | ||
957 | BT_DBG("sk %p", sk); | 1049 | BT_DBG("chan %p", chan); |
958 | 1050 | ||
959 | bh_lock_sock(sk); | 1051 | bh_lock_sock(sk); |
960 | l2cap_pi(sk)->retry_count = 1; | 1052 | chan->retry_count = 1; |
961 | __mod_monitor_timer(); | 1053 | __mod_monitor_timer(); |
962 | 1054 | ||
963 | l2cap_pi(sk)->conn_state |= L2CAP_CONN_WAIT_F; | 1055 | chan->conn_state |= L2CAP_CONN_WAIT_F; |
964 | 1056 | ||
965 | l2cap_send_rr_or_rnr(l2cap_pi(sk), L2CAP_CTRL_POLL); | 1057 | l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL); |
966 | bh_unlock_sock(sk); | 1058 | bh_unlock_sock(sk); |
967 | } | 1059 | } |
968 | 1060 | ||
969 | static void l2cap_drop_acked_frames(struct sock *sk) | 1061 | static void l2cap_drop_acked_frames(struct l2cap_chan *chan) |
970 | { | 1062 | { |
971 | struct sk_buff *skb; | 1063 | struct sk_buff *skb; |
972 | 1064 | ||
973 | while ((skb = skb_peek(TX_QUEUE(sk))) && | 1065 | while ((skb = skb_peek(&chan->tx_q)) && |
974 | l2cap_pi(sk)->unacked_frames) { | 1066 | chan->unacked_frames) { |
975 | if (bt_cb(skb)->tx_seq == l2cap_pi(sk)->expected_ack_seq) | 1067 | if (bt_cb(skb)->tx_seq == chan->expected_ack_seq) |
976 | break; | 1068 | break; |
977 | 1069 | ||
978 | skb = skb_dequeue(TX_QUEUE(sk)); | 1070 | skb = skb_dequeue(&chan->tx_q); |
979 | kfree_skb(skb); | 1071 | kfree_skb(skb); |
980 | 1072 | ||
981 | l2cap_pi(sk)->unacked_frames--; | 1073 | chan->unacked_frames--; |
982 | } | 1074 | } |
983 | 1075 | ||
984 | if (!l2cap_pi(sk)->unacked_frames) | 1076 | if (!chan->unacked_frames) |
985 | del_timer(&l2cap_pi(sk)->retrans_timer); | 1077 | del_timer(&chan->retrans_timer); |
986 | } | 1078 | } |
987 | 1079 | ||
988 | void l2cap_do_send(struct sock *sk, struct sk_buff *skb) | 1080 | void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb) |
989 | { | 1081 | { |
990 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 1082 | struct hci_conn *hcon = chan->conn->hcon; |
991 | struct hci_conn *hcon = pi->conn->hcon; | ||
992 | u16 flags; | 1083 | u16 flags; |
993 | 1084 | ||
994 | BT_DBG("sk %p, skb %p len %d", sk, skb, skb->len); | 1085 | BT_DBG("chan %p, skb %p len %d", chan, skb, skb->len); |
995 | 1086 | ||
996 | if (!pi->flushable && lmp_no_flush_capable(hcon->hdev)) | 1087 | if (!chan->flushable && lmp_no_flush_capable(hcon->hdev)) |
997 | flags = ACL_START_NO_FLUSH; | 1088 | flags = ACL_START_NO_FLUSH; |
998 | else | 1089 | else |
999 | flags = ACL_START; | 1090 | flags = ACL_START; |
@@ -1001,35 +1092,33 @@ void l2cap_do_send(struct sock *sk, struct sk_buff *skb) | |||
1001 | hci_send_acl(hcon, skb, flags); | 1092 | hci_send_acl(hcon, skb, flags); |
1002 | } | 1093 | } |
1003 | 1094 | ||
1004 | void l2cap_streaming_send(struct sock *sk) | 1095 | void l2cap_streaming_send(struct l2cap_chan *chan) |
1005 | { | 1096 | { |
1006 | struct sk_buff *skb; | 1097 | struct sk_buff *skb; |
1007 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
1008 | u16 control, fcs; | 1098 | u16 control, fcs; |
1009 | 1099 | ||
1010 | while ((skb = skb_dequeue(TX_QUEUE(sk)))) { | 1100 | while ((skb = skb_dequeue(&chan->tx_q))) { |
1011 | control = get_unaligned_le16(skb->data + L2CAP_HDR_SIZE); | 1101 | control = get_unaligned_le16(skb->data + L2CAP_HDR_SIZE); |
1012 | control |= pi->next_tx_seq << L2CAP_CTRL_TXSEQ_SHIFT; | 1102 | control |= chan->next_tx_seq << L2CAP_CTRL_TXSEQ_SHIFT; |
1013 | put_unaligned_le16(control, skb->data + L2CAP_HDR_SIZE); | 1103 | put_unaligned_le16(control, skb->data + L2CAP_HDR_SIZE); |
1014 | 1104 | ||
1015 | if (pi->fcs == L2CAP_FCS_CRC16) { | 1105 | if (chan->fcs == L2CAP_FCS_CRC16) { |
1016 | fcs = crc16(0, (u8 *)skb->data, skb->len - 2); | 1106 | fcs = crc16(0, (u8 *)skb->data, skb->len - 2); |
1017 | put_unaligned_le16(fcs, skb->data + skb->len - 2); | 1107 | put_unaligned_le16(fcs, skb->data + skb->len - 2); |
1018 | } | 1108 | } |
1019 | 1109 | ||
1020 | l2cap_do_send(sk, skb); | 1110 | l2cap_do_send(chan, skb); |
1021 | 1111 | ||
1022 | pi->next_tx_seq = (pi->next_tx_seq + 1) % 64; | 1112 | chan->next_tx_seq = (chan->next_tx_seq + 1) % 64; |
1023 | } | 1113 | } |
1024 | } | 1114 | } |
1025 | 1115 | ||
1026 | static void l2cap_retransmit_one_frame(struct sock *sk, u8 tx_seq) | 1116 | static void l2cap_retransmit_one_frame(struct l2cap_chan *chan, u8 tx_seq) |
1027 | { | 1117 | { |
1028 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
1029 | struct sk_buff *skb, *tx_skb; | 1118 | struct sk_buff *skb, *tx_skb; |
1030 | u16 control, fcs; | 1119 | u16 control, fcs; |
1031 | 1120 | ||
1032 | skb = skb_peek(TX_QUEUE(sk)); | 1121 | skb = skb_peek(&chan->tx_q); |
1033 | if (!skb) | 1122 | if (!skb) |
1034 | return; | 1123 | return; |
1035 | 1124 | ||
@@ -1037,14 +1126,14 @@ static void l2cap_retransmit_one_frame(struct sock *sk, u8 tx_seq) | |||
1037 | if (bt_cb(skb)->tx_seq == tx_seq) | 1126 | if (bt_cb(skb)->tx_seq == tx_seq) |
1038 | break; | 1127 | break; |
1039 | 1128 | ||
1040 | if (skb_queue_is_last(TX_QUEUE(sk), skb)) | 1129 | if (skb_queue_is_last(&chan->tx_q, skb)) |
1041 | return; | 1130 | return; |
1042 | 1131 | ||
1043 | } while ((skb = skb_queue_next(TX_QUEUE(sk), skb))); | 1132 | } while ((skb = skb_queue_next(&chan->tx_q, skb))); |
1044 | 1133 | ||
1045 | if (pi->remote_max_tx && | 1134 | if (chan->remote_max_tx && |
1046 | bt_cb(skb)->retries == pi->remote_max_tx) { | 1135 | bt_cb(skb)->retries == chan->remote_max_tx) { |
1047 | l2cap_send_disconn_req(pi->conn, sk, ECONNABORTED); | 1136 | l2cap_send_disconn_req(chan->conn, chan, ECONNABORTED); |
1048 | return; | 1137 | return; |
1049 | } | 1138 | } |
1050 | 1139 | ||
@@ -1053,39 +1142,39 @@ static void l2cap_retransmit_one_frame(struct sock *sk, u8 tx_seq) | |||
1053 | control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); | 1142 | control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); |
1054 | control &= L2CAP_CTRL_SAR; | 1143 | control &= L2CAP_CTRL_SAR; |
1055 | 1144 | ||
1056 | if (pi->conn_state & L2CAP_CONN_SEND_FBIT) { | 1145 | if (chan->conn_state & L2CAP_CONN_SEND_FBIT) { |
1057 | control |= L2CAP_CTRL_FINAL; | 1146 | control |= L2CAP_CTRL_FINAL; |
1058 | pi->conn_state &= ~L2CAP_CONN_SEND_FBIT; | 1147 | chan->conn_state &= ~L2CAP_CONN_SEND_FBIT; |
1059 | } | 1148 | } |
1060 | 1149 | ||
1061 | control |= (pi->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT) | 1150 | control |= (chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT) |
1062 | | (tx_seq << L2CAP_CTRL_TXSEQ_SHIFT); | 1151 | | (tx_seq << L2CAP_CTRL_TXSEQ_SHIFT); |
1063 | 1152 | ||
1064 | put_unaligned_le16(control, tx_skb->data + L2CAP_HDR_SIZE); | 1153 | put_unaligned_le16(control, tx_skb->data + L2CAP_HDR_SIZE); |
1065 | 1154 | ||
1066 | if (pi->fcs == L2CAP_FCS_CRC16) { | 1155 | if (chan->fcs == L2CAP_FCS_CRC16) { |
1067 | fcs = crc16(0, (u8 *)tx_skb->data, tx_skb->len - 2); | 1156 | fcs = crc16(0, (u8 *)tx_skb->data, tx_skb->len - 2); |
1068 | put_unaligned_le16(fcs, tx_skb->data + tx_skb->len - 2); | 1157 | put_unaligned_le16(fcs, tx_skb->data + tx_skb->len - 2); |
1069 | } | 1158 | } |
1070 | 1159 | ||
1071 | l2cap_do_send(sk, tx_skb); | 1160 | l2cap_do_send(chan, tx_skb); |
1072 | } | 1161 | } |
1073 | 1162 | ||
1074 | int l2cap_ertm_send(struct sock *sk) | 1163 | int l2cap_ertm_send(struct l2cap_chan *chan) |
1075 | { | 1164 | { |
1076 | struct sk_buff *skb, *tx_skb; | 1165 | struct sk_buff *skb, *tx_skb; |
1077 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 1166 | struct sock *sk = chan->sk; |
1078 | u16 control, fcs; | 1167 | u16 control, fcs; |
1079 | int nsent = 0; | 1168 | int nsent = 0; |
1080 | 1169 | ||
1081 | if (sk->sk_state != BT_CONNECTED) | 1170 | if (sk->sk_state != BT_CONNECTED) |
1082 | return -ENOTCONN; | 1171 | return -ENOTCONN; |
1083 | 1172 | ||
1084 | while ((skb = sk->sk_send_head) && (!l2cap_tx_window_full(sk))) { | 1173 | while ((skb = chan->tx_send_head) && (!l2cap_tx_window_full(chan))) { |
1085 | 1174 | ||
1086 | if (pi->remote_max_tx && | 1175 | if (chan->remote_max_tx && |
1087 | bt_cb(skb)->retries == pi->remote_max_tx) { | 1176 | bt_cb(skb)->retries == chan->remote_max_tx) { |
1088 | l2cap_send_disconn_req(pi->conn, sk, ECONNABORTED); | 1177 | l2cap_send_disconn_req(chan->conn, chan, ECONNABORTED); |
1089 | break; | 1178 | break; |
1090 | } | 1179 | } |
1091 | 1180 | ||
@@ -1096,36 +1185,36 @@ int l2cap_ertm_send(struct sock *sk) | |||
1096 | control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); | 1185 | control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); |
1097 | control &= L2CAP_CTRL_SAR; | 1186 | control &= L2CAP_CTRL_SAR; |
1098 | 1187 | ||
1099 | if (pi->conn_state & L2CAP_CONN_SEND_FBIT) { | 1188 | if (chan->conn_state & L2CAP_CONN_SEND_FBIT) { |
1100 | control |= L2CAP_CTRL_FINAL; | 1189 | control |= L2CAP_CTRL_FINAL; |
1101 | pi->conn_state &= ~L2CAP_CONN_SEND_FBIT; | 1190 | chan->conn_state &= ~L2CAP_CONN_SEND_FBIT; |
1102 | } | 1191 | } |
1103 | control |= (pi->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT) | 1192 | control |= (chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT) |
1104 | | (pi->next_tx_seq << L2CAP_CTRL_TXSEQ_SHIFT); | 1193 | | (chan->next_tx_seq << L2CAP_CTRL_TXSEQ_SHIFT); |
1105 | put_unaligned_le16(control, tx_skb->data + L2CAP_HDR_SIZE); | 1194 | put_unaligned_le16(control, tx_skb->data + L2CAP_HDR_SIZE); |
1106 | 1195 | ||
1107 | 1196 | ||
1108 | if (pi->fcs == L2CAP_FCS_CRC16) { | 1197 | if (chan->fcs == L2CAP_FCS_CRC16) { |
1109 | fcs = crc16(0, (u8 *)skb->data, tx_skb->len - 2); | 1198 | fcs = crc16(0, (u8 *)skb->data, tx_skb->len - 2); |
1110 | put_unaligned_le16(fcs, skb->data + tx_skb->len - 2); | 1199 | put_unaligned_le16(fcs, skb->data + tx_skb->len - 2); |
1111 | } | 1200 | } |
1112 | 1201 | ||
1113 | l2cap_do_send(sk, tx_skb); | 1202 | l2cap_do_send(chan, tx_skb); |
1114 | 1203 | ||
1115 | __mod_retrans_timer(); | 1204 | __mod_retrans_timer(); |
1116 | 1205 | ||
1117 | bt_cb(skb)->tx_seq = pi->next_tx_seq; | 1206 | bt_cb(skb)->tx_seq = chan->next_tx_seq; |
1118 | pi->next_tx_seq = (pi->next_tx_seq + 1) % 64; | 1207 | chan->next_tx_seq = (chan->next_tx_seq + 1) % 64; |
1119 | 1208 | ||
1120 | if (bt_cb(skb)->retries == 1) | 1209 | if (bt_cb(skb)->retries == 1) |
1121 | pi->unacked_frames++; | 1210 | chan->unacked_frames++; |
1122 | 1211 | ||
1123 | pi->frames_sent++; | 1212 | chan->frames_sent++; |
1124 | 1213 | ||
1125 | if (skb_queue_is_last(TX_QUEUE(sk), skb)) | 1214 | if (skb_queue_is_last(&chan->tx_q, skb)) |
1126 | sk->sk_send_head = NULL; | 1215 | chan->tx_send_head = NULL; |
1127 | else | 1216 | else |
1128 | sk->sk_send_head = skb_queue_next(TX_QUEUE(sk), skb); | 1217 | chan->tx_send_head = skb_queue_next(&chan->tx_q, skb); |
1129 | 1218 | ||
1130 | nsent++; | 1219 | nsent++; |
1131 | } | 1220 | } |
@@ -1133,41 +1222,39 @@ int l2cap_ertm_send(struct sock *sk) | |||
1133 | return nsent; | 1222 | return nsent; |
1134 | } | 1223 | } |
1135 | 1224 | ||
1136 | static int l2cap_retransmit_frames(struct sock *sk) | 1225 | static int l2cap_retransmit_frames(struct l2cap_chan *chan) |
1137 | { | 1226 | { |
1138 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
1139 | int ret; | 1227 | int ret; |
1140 | 1228 | ||
1141 | if (!skb_queue_empty(TX_QUEUE(sk))) | 1229 | if (!skb_queue_empty(&chan->tx_q)) |
1142 | sk->sk_send_head = TX_QUEUE(sk)->next; | 1230 | chan->tx_send_head = chan->tx_q.next; |
1143 | 1231 | ||
1144 | pi->next_tx_seq = pi->expected_ack_seq; | 1232 | chan->next_tx_seq = chan->expected_ack_seq; |
1145 | ret = l2cap_ertm_send(sk); | 1233 | ret = l2cap_ertm_send(chan); |
1146 | return ret; | 1234 | return ret; |
1147 | } | 1235 | } |
1148 | 1236 | ||
1149 | static void l2cap_send_ack(struct l2cap_pinfo *pi) | 1237 | static void l2cap_send_ack(struct l2cap_chan *chan) |
1150 | { | 1238 | { |
1151 | struct sock *sk = (struct sock *)pi; | ||
1152 | u16 control = 0; | 1239 | u16 control = 0; |
1153 | 1240 | ||
1154 | control |= pi->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; | 1241 | control |= chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; |
1155 | 1242 | ||
1156 | if (pi->conn_state & L2CAP_CONN_LOCAL_BUSY) { | 1243 | if (chan->conn_state & L2CAP_CONN_LOCAL_BUSY) { |
1157 | control |= L2CAP_SUPER_RCV_NOT_READY; | 1244 | control |= L2CAP_SUPER_RCV_NOT_READY; |
1158 | pi->conn_state |= L2CAP_CONN_RNR_SENT; | 1245 | chan->conn_state |= L2CAP_CONN_RNR_SENT; |
1159 | l2cap_send_sframe(pi, control); | 1246 | l2cap_send_sframe(chan, control); |
1160 | return; | 1247 | return; |
1161 | } | 1248 | } |
1162 | 1249 | ||
1163 | if (l2cap_ertm_send(sk) > 0) | 1250 | if (l2cap_ertm_send(chan) > 0) |
1164 | return; | 1251 | return; |
1165 | 1252 | ||
1166 | control |= L2CAP_SUPER_RCV_READY; | 1253 | control |= L2CAP_SUPER_RCV_READY; |
1167 | l2cap_send_sframe(pi, control); | 1254 | l2cap_send_sframe(chan, control); |
1168 | } | 1255 | } |
1169 | 1256 | ||
1170 | static void l2cap_send_srejtail(struct sock *sk) | 1257 | static void l2cap_send_srejtail(struct l2cap_chan *chan) |
1171 | { | 1258 | { |
1172 | struct srej_list *tail; | 1259 | struct srej_list *tail; |
1173 | u16 control; | 1260 | u16 control; |
@@ -1175,15 +1262,15 @@ static void l2cap_send_srejtail(struct sock *sk) | |||
1175 | control = L2CAP_SUPER_SELECT_REJECT; | 1262 | control = L2CAP_SUPER_SELECT_REJECT; |
1176 | control |= L2CAP_CTRL_FINAL; | 1263 | control |= L2CAP_CTRL_FINAL; |
1177 | 1264 | ||
1178 | tail = list_entry(SREJ_LIST(sk)->prev, struct srej_list, list); | 1265 | tail = list_entry((&chan->srej_l)->prev, struct srej_list, list); |
1179 | control |= tail->tx_seq << L2CAP_CTRL_REQSEQ_SHIFT; | 1266 | control |= tail->tx_seq << L2CAP_CTRL_REQSEQ_SHIFT; |
1180 | 1267 | ||
1181 | l2cap_send_sframe(l2cap_pi(sk), control); | 1268 | l2cap_send_sframe(chan, control); |
1182 | } | 1269 | } |
1183 | 1270 | ||
1184 | static inline int l2cap_skbuff_fromiovec(struct sock *sk, struct msghdr *msg, int len, int count, struct sk_buff *skb) | 1271 | static inline int l2cap_skbuff_fromiovec(struct sock *sk, struct msghdr *msg, int len, int count, struct sk_buff *skb) |
1185 | { | 1272 | { |
1186 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; | 1273 | struct l2cap_conn *conn = l2cap_pi(sk)->chan->conn; |
1187 | struct sk_buff **frag; | 1274 | struct sk_buff **frag; |
1188 | int err, sent = 0; | 1275 | int err, sent = 0; |
1189 | 1276 | ||
@@ -1213,9 +1300,10 @@ static inline int l2cap_skbuff_fromiovec(struct sock *sk, struct msghdr *msg, in | |||
1213 | return sent; | 1300 | return sent; |
1214 | } | 1301 | } |
1215 | 1302 | ||
1216 | struct sk_buff *l2cap_create_connless_pdu(struct sock *sk, struct msghdr *msg, size_t len) | 1303 | struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len) |
1217 | { | 1304 | { |
1218 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; | 1305 | struct sock *sk = chan->sk; |
1306 | struct l2cap_conn *conn = chan->conn; | ||
1219 | struct sk_buff *skb; | 1307 | struct sk_buff *skb; |
1220 | int err, count, hlen = L2CAP_HDR_SIZE + 2; | 1308 | int err, count, hlen = L2CAP_HDR_SIZE + 2; |
1221 | struct l2cap_hdr *lh; | 1309 | struct l2cap_hdr *lh; |
@@ -1230,9 +1318,9 @@ struct sk_buff *l2cap_create_connless_pdu(struct sock *sk, struct msghdr *msg, s | |||
1230 | 1318 | ||
1231 | /* Create L2CAP header */ | 1319 | /* Create L2CAP header */ |
1232 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); | 1320 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); |
1233 | lh->cid = cpu_to_le16(l2cap_pi(sk)->dcid); | 1321 | lh->cid = cpu_to_le16(chan->dcid); |
1234 | lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE)); | 1322 | lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE)); |
1235 | put_unaligned_le16(l2cap_pi(sk)->psm, skb_put(skb, 2)); | 1323 | put_unaligned_le16(chan->psm, skb_put(skb, 2)); |
1236 | 1324 | ||
1237 | err = l2cap_skbuff_fromiovec(sk, msg, len, count, skb); | 1325 | err = l2cap_skbuff_fromiovec(sk, msg, len, count, skb); |
1238 | if (unlikely(err < 0)) { | 1326 | if (unlikely(err < 0)) { |
@@ -1242,9 +1330,10 @@ struct sk_buff *l2cap_create_connless_pdu(struct sock *sk, struct msghdr *msg, s | |||
1242 | return skb; | 1330 | return skb; |
1243 | } | 1331 | } |
1244 | 1332 | ||
1245 | struct sk_buff *l2cap_create_basic_pdu(struct sock *sk, struct msghdr *msg, size_t len) | 1333 | struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len) |
1246 | { | 1334 | { |
1247 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; | 1335 | struct sock *sk = chan->sk; |
1336 | struct l2cap_conn *conn = chan->conn; | ||
1248 | struct sk_buff *skb; | 1337 | struct sk_buff *skb; |
1249 | int err, count, hlen = L2CAP_HDR_SIZE; | 1338 | int err, count, hlen = L2CAP_HDR_SIZE; |
1250 | struct l2cap_hdr *lh; | 1339 | struct l2cap_hdr *lh; |
@@ -1259,7 +1348,7 @@ struct sk_buff *l2cap_create_basic_pdu(struct sock *sk, struct msghdr *msg, size | |||
1259 | 1348 | ||
1260 | /* Create L2CAP header */ | 1349 | /* Create L2CAP header */ |
1261 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); | 1350 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); |
1262 | lh->cid = cpu_to_le16(l2cap_pi(sk)->dcid); | 1351 | lh->cid = cpu_to_le16(chan->dcid); |
1263 | lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE)); | 1352 | lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE)); |
1264 | 1353 | ||
1265 | err = l2cap_skbuff_fromiovec(sk, msg, len, count, skb); | 1354 | err = l2cap_skbuff_fromiovec(sk, msg, len, count, skb); |
@@ -1270,9 +1359,10 @@ struct sk_buff *l2cap_create_basic_pdu(struct sock *sk, struct msghdr *msg, size | |||
1270 | return skb; | 1359 | return skb; |
1271 | } | 1360 | } |
1272 | 1361 | ||
1273 | struct sk_buff *l2cap_create_iframe_pdu(struct sock *sk, struct msghdr *msg, size_t len, u16 control, u16 sdulen) | 1362 | struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len, u16 control, u16 sdulen) |
1274 | { | 1363 | { |
1275 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; | 1364 | struct sock *sk = chan->sk; |
1365 | struct l2cap_conn *conn = chan->conn; | ||
1276 | struct sk_buff *skb; | 1366 | struct sk_buff *skb; |
1277 | int err, count, hlen = L2CAP_HDR_SIZE + 2; | 1367 | int err, count, hlen = L2CAP_HDR_SIZE + 2; |
1278 | struct l2cap_hdr *lh; | 1368 | struct l2cap_hdr *lh; |
@@ -1285,7 +1375,7 @@ struct sk_buff *l2cap_create_iframe_pdu(struct sock *sk, struct msghdr *msg, siz | |||
1285 | if (sdulen) | 1375 | if (sdulen) |
1286 | hlen += 2; | 1376 | hlen += 2; |
1287 | 1377 | ||
1288 | if (l2cap_pi(sk)->fcs == L2CAP_FCS_CRC16) | 1378 | if (chan->fcs == L2CAP_FCS_CRC16) |
1289 | hlen += 2; | 1379 | hlen += 2; |
1290 | 1380 | ||
1291 | count = min_t(unsigned int, (conn->mtu - hlen), len); | 1381 | count = min_t(unsigned int, (conn->mtu - hlen), len); |
@@ -1296,7 +1386,7 @@ struct sk_buff *l2cap_create_iframe_pdu(struct sock *sk, struct msghdr *msg, siz | |||
1296 | 1386 | ||
1297 | /* Create L2CAP header */ | 1387 | /* Create L2CAP header */ |
1298 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); | 1388 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); |
1299 | lh->cid = cpu_to_le16(l2cap_pi(sk)->dcid); | 1389 | lh->cid = cpu_to_le16(chan->dcid); |
1300 | lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE)); | 1390 | lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE)); |
1301 | put_unaligned_le16(control, skb_put(skb, 2)); | 1391 | put_unaligned_le16(control, skb_put(skb, 2)); |
1302 | if (sdulen) | 1392 | if (sdulen) |
@@ -1308,16 +1398,15 @@ struct sk_buff *l2cap_create_iframe_pdu(struct sock *sk, struct msghdr *msg, siz | |||
1308 | return ERR_PTR(err); | 1398 | return ERR_PTR(err); |
1309 | } | 1399 | } |
1310 | 1400 | ||
1311 | if (l2cap_pi(sk)->fcs == L2CAP_FCS_CRC16) | 1401 | if (chan->fcs == L2CAP_FCS_CRC16) |
1312 | put_unaligned_le16(0, skb_put(skb, 2)); | 1402 | put_unaligned_le16(0, skb_put(skb, 2)); |
1313 | 1403 | ||
1314 | bt_cb(skb)->retries = 0; | 1404 | bt_cb(skb)->retries = 0; |
1315 | return skb; | 1405 | return skb; |
1316 | } | 1406 | } |
1317 | 1407 | ||
1318 | int l2cap_sar_segment_sdu(struct sock *sk, struct msghdr *msg, size_t len) | 1408 | int l2cap_sar_segment_sdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len) |
1319 | { | 1409 | { |
1320 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
1321 | struct sk_buff *skb; | 1410 | struct sk_buff *skb; |
1322 | struct sk_buff_head sar_queue; | 1411 | struct sk_buff_head sar_queue; |
1323 | u16 control; | 1412 | u16 control; |
@@ -1325,26 +1414,26 @@ int l2cap_sar_segment_sdu(struct sock *sk, struct msghdr *msg, size_t len) | |||
1325 | 1414 | ||
1326 | skb_queue_head_init(&sar_queue); | 1415 | skb_queue_head_init(&sar_queue); |
1327 | control = L2CAP_SDU_START; | 1416 | control = L2CAP_SDU_START; |
1328 | skb = l2cap_create_iframe_pdu(sk, msg, pi->remote_mps, control, len); | 1417 | skb = l2cap_create_iframe_pdu(chan, msg, chan->remote_mps, control, len); |
1329 | if (IS_ERR(skb)) | 1418 | if (IS_ERR(skb)) |
1330 | return PTR_ERR(skb); | 1419 | return PTR_ERR(skb); |
1331 | 1420 | ||
1332 | __skb_queue_tail(&sar_queue, skb); | 1421 | __skb_queue_tail(&sar_queue, skb); |
1333 | len -= pi->remote_mps; | 1422 | len -= chan->remote_mps; |
1334 | size += pi->remote_mps; | 1423 | size += chan->remote_mps; |
1335 | 1424 | ||
1336 | while (len > 0) { | 1425 | while (len > 0) { |
1337 | size_t buflen; | 1426 | size_t buflen; |
1338 | 1427 | ||
1339 | if (len > pi->remote_mps) { | 1428 | if (len > chan->remote_mps) { |
1340 | control = L2CAP_SDU_CONTINUE; | 1429 | control = L2CAP_SDU_CONTINUE; |
1341 | buflen = pi->remote_mps; | 1430 | buflen = chan->remote_mps; |
1342 | } else { | 1431 | } else { |
1343 | control = L2CAP_SDU_END; | 1432 | control = L2CAP_SDU_END; |
1344 | buflen = len; | 1433 | buflen = len; |
1345 | } | 1434 | } |
1346 | 1435 | ||
1347 | skb = l2cap_create_iframe_pdu(sk, msg, buflen, control, 0); | 1436 | skb = l2cap_create_iframe_pdu(chan, msg, buflen, control, 0); |
1348 | if (IS_ERR(skb)) { | 1437 | if (IS_ERR(skb)) { |
1349 | skb_queue_purge(&sar_queue); | 1438 | skb_queue_purge(&sar_queue); |
1350 | return PTR_ERR(skb); | 1439 | return PTR_ERR(skb); |
@@ -1354,9 +1443,9 @@ int l2cap_sar_segment_sdu(struct sock *sk, struct msghdr *msg, size_t len) | |||
1354 | len -= buflen; | 1443 | len -= buflen; |
1355 | size += buflen; | 1444 | size += buflen; |
1356 | } | 1445 | } |
1357 | skb_queue_splice_tail(&sar_queue, TX_QUEUE(sk)); | 1446 | skb_queue_splice_tail(&sar_queue, &chan->tx_q); |
1358 | if (sk->sk_send_head == NULL) | 1447 | if (chan->tx_send_head == NULL) |
1359 | sk->sk_send_head = sar_queue.next; | 1448 | chan->tx_send_head = sar_queue.next; |
1360 | 1449 | ||
1361 | return size; | 1450 | return size; |
1362 | } | 1451 | } |
@@ -1364,10 +1453,11 @@ int l2cap_sar_segment_sdu(struct sock *sk, struct msghdr *msg, size_t len) | |||
1364 | static void l2cap_chan_ready(struct sock *sk) | 1453 | static void l2cap_chan_ready(struct sock *sk) |
1365 | { | 1454 | { |
1366 | struct sock *parent = bt_sk(sk)->parent; | 1455 | struct sock *parent = bt_sk(sk)->parent; |
1456 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | ||
1367 | 1457 | ||
1368 | BT_DBG("sk %p, parent %p", sk, parent); | 1458 | BT_DBG("sk %p, parent %p", sk, parent); |
1369 | 1459 | ||
1370 | l2cap_pi(sk)->conf_state = 0; | 1460 | chan->conf_state = 0; |
1371 | l2cap_sock_clear_timer(sk); | 1461 | l2cap_sock_clear_timer(sk); |
1372 | 1462 | ||
1373 | if (!parent) { | 1463 | if (!parent) { |
@@ -1387,14 +1477,14 @@ static void l2cap_chan_ready(struct sock *sk) | |||
1387 | /* Copy frame to all raw sockets on that connection */ | 1477 | /* Copy frame to all raw sockets on that connection */ |
1388 | static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb) | 1478 | static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb) |
1389 | { | 1479 | { |
1390 | struct l2cap_chan_list *l = &conn->chan_list; | ||
1391 | struct sk_buff *nskb; | 1480 | struct sk_buff *nskb; |
1392 | struct sock *sk; | 1481 | struct l2cap_chan *chan; |
1393 | 1482 | ||
1394 | BT_DBG("conn %p", conn); | 1483 | BT_DBG("conn %p", conn); |
1395 | 1484 | ||
1396 | read_lock(&l->lock); | 1485 | read_lock(&conn->chan_lock); |
1397 | for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) { | 1486 | list_for_each_entry(chan, &conn->chan_l, list) { |
1487 | struct sock *sk = chan->sk; | ||
1398 | if (sk->sk_type != SOCK_RAW) | 1488 | if (sk->sk_type != SOCK_RAW) |
1399 | continue; | 1489 | continue; |
1400 | 1490 | ||
@@ -1408,7 +1498,7 @@ static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb) | |||
1408 | if (sock_queue_rcv_skb(sk, nskb)) | 1498 | if (sock_queue_rcv_skb(sk, nskb)) |
1409 | kfree_skb(nskb); | 1499 | kfree_skb(nskb); |
1410 | } | 1500 | } |
1411 | read_unlock(&l->lock); | 1501 | read_unlock(&conn->chan_lock); |
1412 | } | 1502 | } |
1413 | 1503 | ||
1414 | /* ---- L2CAP signalling commands ---- */ | 1504 | /* ---- L2CAP signalling commands ---- */ |
@@ -1540,32 +1630,35 @@ static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val) | |||
1540 | 1630 | ||
1541 | static void l2cap_ack_timeout(unsigned long arg) | 1631 | static void l2cap_ack_timeout(unsigned long arg) |
1542 | { | 1632 | { |
1543 | struct sock *sk = (void *) arg; | 1633 | struct l2cap_chan *chan = (void *) arg; |
1544 | 1634 | ||
1545 | bh_lock_sock(sk); | 1635 | bh_lock_sock(chan->sk); |
1546 | l2cap_send_ack(l2cap_pi(sk)); | 1636 | l2cap_send_ack(chan); |
1547 | bh_unlock_sock(sk); | 1637 | bh_unlock_sock(chan->sk); |
1548 | } | 1638 | } |
1549 | 1639 | ||
1550 | static inline void l2cap_ertm_init(struct sock *sk) | 1640 | static inline void l2cap_ertm_init(struct l2cap_chan *chan) |
1551 | { | 1641 | { |
1552 | l2cap_pi(sk)->expected_ack_seq = 0; | 1642 | struct sock *sk = chan->sk; |
1553 | l2cap_pi(sk)->unacked_frames = 0; | 1643 | |
1554 | l2cap_pi(sk)->buffer_seq = 0; | 1644 | chan->expected_ack_seq = 0; |
1555 | l2cap_pi(sk)->num_acked = 0; | 1645 | chan->unacked_frames = 0; |
1556 | l2cap_pi(sk)->frames_sent = 0; | 1646 | chan->buffer_seq = 0; |
1647 | chan->num_acked = 0; | ||
1648 | chan->frames_sent = 0; | ||
1557 | 1649 | ||
1558 | setup_timer(&l2cap_pi(sk)->retrans_timer, | 1650 | setup_timer(&chan->retrans_timer, l2cap_retrans_timeout, |
1559 | l2cap_retrans_timeout, (unsigned long) sk); | 1651 | (unsigned long) chan); |
1560 | setup_timer(&l2cap_pi(sk)->monitor_timer, | 1652 | setup_timer(&chan->monitor_timer, l2cap_monitor_timeout, |
1561 | l2cap_monitor_timeout, (unsigned long) sk); | 1653 | (unsigned long) chan); |
1562 | setup_timer(&l2cap_pi(sk)->ack_timer, | 1654 | setup_timer(&chan->ack_timer, l2cap_ack_timeout, (unsigned long) chan); |
1563 | l2cap_ack_timeout, (unsigned long) sk); | ||
1564 | 1655 | ||
1565 | __skb_queue_head_init(SREJ_QUEUE(sk)); | 1656 | skb_queue_head_init(&chan->srej_q); |
1566 | __skb_queue_head_init(BUSY_QUEUE(sk)); | 1657 | skb_queue_head_init(&chan->busy_q); |
1567 | 1658 | ||
1568 | INIT_WORK(&l2cap_pi(sk)->busy_work, l2cap_busy_work); | 1659 | INIT_LIST_HEAD(&chan->srej_l); |
1660 | |||
1661 | INIT_WORK(&chan->busy_work, l2cap_busy_work); | ||
1569 | 1662 | ||
1570 | sk->sk_backlog_rcv = l2cap_ertm_data_rcv; | 1663 | sk->sk_backlog_rcv = l2cap_ertm_data_rcv; |
1571 | } | 1664 | } |
@@ -1583,38 +1676,37 @@ static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask) | |||
1583 | } | 1676 | } |
1584 | } | 1677 | } |
1585 | 1678 | ||
1586 | int l2cap_build_conf_req(struct sock *sk, void *data) | 1679 | static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data) |
1587 | { | 1680 | { |
1588 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
1589 | struct l2cap_conf_req *req = data; | 1681 | struct l2cap_conf_req *req = data; |
1590 | struct l2cap_conf_rfc rfc = { .mode = pi->mode }; | 1682 | struct l2cap_conf_rfc rfc = { .mode = chan->mode }; |
1591 | void *ptr = req->data; | 1683 | void *ptr = req->data; |
1592 | 1684 | ||
1593 | BT_DBG("sk %p", sk); | 1685 | BT_DBG("chan %p", chan); |
1594 | 1686 | ||
1595 | if (pi->num_conf_req || pi->num_conf_rsp) | 1687 | if (chan->num_conf_req || chan->num_conf_rsp) |
1596 | goto done; | 1688 | goto done; |
1597 | 1689 | ||
1598 | switch (pi->mode) { | 1690 | switch (chan->mode) { |
1599 | case L2CAP_MODE_STREAMING: | 1691 | case L2CAP_MODE_STREAMING: |
1600 | case L2CAP_MODE_ERTM: | 1692 | case L2CAP_MODE_ERTM: |
1601 | if (pi->conf_state & L2CAP_CONF_STATE2_DEVICE) | 1693 | if (chan->conf_state & L2CAP_CONF_STATE2_DEVICE) |
1602 | break; | 1694 | break; |
1603 | 1695 | ||
1604 | /* fall through */ | 1696 | /* fall through */ |
1605 | default: | 1697 | default: |
1606 | pi->mode = l2cap_select_mode(rfc.mode, pi->conn->feat_mask); | 1698 | chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask); |
1607 | break; | 1699 | break; |
1608 | } | 1700 | } |
1609 | 1701 | ||
1610 | done: | 1702 | done: |
1611 | if (pi->imtu != L2CAP_DEFAULT_MTU) | 1703 | if (chan->imtu != L2CAP_DEFAULT_MTU) |
1612 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->imtu); | 1704 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu); |
1613 | 1705 | ||
1614 | switch (pi->mode) { | 1706 | switch (chan->mode) { |
1615 | case L2CAP_MODE_BASIC: | 1707 | case L2CAP_MODE_BASIC: |
1616 | if (!(pi->conn->feat_mask & L2CAP_FEAT_ERTM) && | 1708 | if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) && |
1617 | !(pi->conn->feat_mask & L2CAP_FEAT_STREAMING)) | 1709 | !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING)) |
1618 | break; | 1710 | break; |
1619 | 1711 | ||
1620 | rfc.mode = L2CAP_MODE_BASIC; | 1712 | rfc.mode = L2CAP_MODE_BASIC; |
@@ -1630,24 +1722,24 @@ done: | |||
1630 | 1722 | ||
1631 | case L2CAP_MODE_ERTM: | 1723 | case L2CAP_MODE_ERTM: |
1632 | rfc.mode = L2CAP_MODE_ERTM; | 1724 | rfc.mode = L2CAP_MODE_ERTM; |
1633 | rfc.txwin_size = pi->tx_win; | 1725 | rfc.txwin_size = chan->tx_win; |
1634 | rfc.max_transmit = pi->max_tx; | 1726 | rfc.max_transmit = chan->max_tx; |
1635 | rfc.retrans_timeout = 0; | 1727 | rfc.retrans_timeout = 0; |
1636 | rfc.monitor_timeout = 0; | 1728 | rfc.monitor_timeout = 0; |
1637 | rfc.max_pdu_size = cpu_to_le16(L2CAP_DEFAULT_MAX_PDU_SIZE); | 1729 | rfc.max_pdu_size = cpu_to_le16(L2CAP_DEFAULT_MAX_PDU_SIZE); |
1638 | if (L2CAP_DEFAULT_MAX_PDU_SIZE > pi->conn->mtu - 10) | 1730 | if (L2CAP_DEFAULT_MAX_PDU_SIZE > chan->conn->mtu - 10) |
1639 | rfc.max_pdu_size = cpu_to_le16(pi->conn->mtu - 10); | 1731 | rfc.max_pdu_size = cpu_to_le16(chan->conn->mtu - 10); |
1640 | 1732 | ||
1641 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc), | 1733 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc), |
1642 | (unsigned long) &rfc); | 1734 | (unsigned long) &rfc); |
1643 | 1735 | ||
1644 | if (!(pi->conn->feat_mask & L2CAP_FEAT_FCS)) | 1736 | if (!(chan->conn->feat_mask & L2CAP_FEAT_FCS)) |
1645 | break; | 1737 | break; |
1646 | 1738 | ||
1647 | if (pi->fcs == L2CAP_FCS_NONE || | 1739 | if (chan->fcs == L2CAP_FCS_NONE || |
1648 | pi->conf_state & L2CAP_CONF_NO_FCS_RECV) { | 1740 | chan->conf_state & L2CAP_CONF_NO_FCS_RECV) { |
1649 | pi->fcs = L2CAP_FCS_NONE; | 1741 | chan->fcs = L2CAP_FCS_NONE; |
1650 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, pi->fcs); | 1742 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, chan->fcs); |
1651 | } | 1743 | } |
1652 | break; | 1744 | break; |
1653 | 1745 | ||
@@ -1658,43 +1750,42 @@ done: | |||
1658 | rfc.retrans_timeout = 0; | 1750 | rfc.retrans_timeout = 0; |
1659 | rfc.monitor_timeout = 0; | 1751 | rfc.monitor_timeout = 0; |
1660 | rfc.max_pdu_size = cpu_to_le16(L2CAP_DEFAULT_MAX_PDU_SIZE); | 1752 | rfc.max_pdu_size = cpu_to_le16(L2CAP_DEFAULT_MAX_PDU_SIZE); |
1661 | if (L2CAP_DEFAULT_MAX_PDU_SIZE > pi->conn->mtu - 10) | 1753 | if (L2CAP_DEFAULT_MAX_PDU_SIZE > chan->conn->mtu - 10) |
1662 | rfc.max_pdu_size = cpu_to_le16(pi->conn->mtu - 10); | 1754 | rfc.max_pdu_size = cpu_to_le16(chan->conn->mtu - 10); |
1663 | 1755 | ||
1664 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc), | 1756 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc), |
1665 | (unsigned long) &rfc); | 1757 | (unsigned long) &rfc); |
1666 | 1758 | ||
1667 | if (!(pi->conn->feat_mask & L2CAP_FEAT_FCS)) | 1759 | if (!(chan->conn->feat_mask & L2CAP_FEAT_FCS)) |
1668 | break; | 1760 | break; |
1669 | 1761 | ||
1670 | if (pi->fcs == L2CAP_FCS_NONE || | 1762 | if (chan->fcs == L2CAP_FCS_NONE || |
1671 | pi->conf_state & L2CAP_CONF_NO_FCS_RECV) { | 1763 | chan->conf_state & L2CAP_CONF_NO_FCS_RECV) { |
1672 | pi->fcs = L2CAP_FCS_NONE; | 1764 | chan->fcs = L2CAP_FCS_NONE; |
1673 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, pi->fcs); | 1765 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, chan->fcs); |
1674 | } | 1766 | } |
1675 | break; | 1767 | break; |
1676 | } | 1768 | } |
1677 | 1769 | ||
1678 | req->dcid = cpu_to_le16(pi->dcid); | 1770 | req->dcid = cpu_to_le16(chan->dcid); |
1679 | req->flags = cpu_to_le16(0); | 1771 | req->flags = cpu_to_le16(0); |
1680 | 1772 | ||
1681 | return ptr - data; | 1773 | return ptr - data; |
1682 | } | 1774 | } |
1683 | 1775 | ||
1684 | static int l2cap_parse_conf_req(struct sock *sk, void *data) | 1776 | static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data) |
1685 | { | 1777 | { |
1686 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
1687 | struct l2cap_conf_rsp *rsp = data; | 1778 | struct l2cap_conf_rsp *rsp = data; |
1688 | void *ptr = rsp->data; | 1779 | void *ptr = rsp->data; |
1689 | void *req = pi->conf_req; | 1780 | void *req = chan->conf_req; |
1690 | int len = pi->conf_len; | 1781 | int len = chan->conf_len; |
1691 | int type, hint, olen; | 1782 | int type, hint, olen; |
1692 | unsigned long val; | 1783 | unsigned long val; |
1693 | struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC }; | 1784 | struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC }; |
1694 | u16 mtu = L2CAP_DEFAULT_MTU; | 1785 | u16 mtu = L2CAP_DEFAULT_MTU; |
1695 | u16 result = L2CAP_CONF_SUCCESS; | 1786 | u16 result = L2CAP_CONF_SUCCESS; |
1696 | 1787 | ||
1697 | BT_DBG("sk %p", sk); | 1788 | BT_DBG("chan %p", chan); |
1698 | 1789 | ||
1699 | while (len >= L2CAP_CONF_OPT_SIZE) { | 1790 | while (len >= L2CAP_CONF_OPT_SIZE) { |
1700 | len -= l2cap_get_conf_opt(&req, &type, &olen, &val); | 1791 | len -= l2cap_get_conf_opt(&req, &type, &olen, &val); |
@@ -1708,7 +1799,7 @@ static int l2cap_parse_conf_req(struct sock *sk, void *data) | |||
1708 | break; | 1799 | break; |
1709 | 1800 | ||
1710 | case L2CAP_CONF_FLUSH_TO: | 1801 | case L2CAP_CONF_FLUSH_TO: |
1711 | pi->flush_to = val; | 1802 | chan->flush_to = val; |
1712 | break; | 1803 | break; |
1713 | 1804 | ||
1714 | case L2CAP_CONF_QOS: | 1805 | case L2CAP_CONF_QOS: |
@@ -1721,7 +1812,7 @@ static int l2cap_parse_conf_req(struct sock *sk, void *data) | |||
1721 | 1812 | ||
1722 | case L2CAP_CONF_FCS: | 1813 | case L2CAP_CONF_FCS: |
1723 | if (val == L2CAP_FCS_NONE) | 1814 | if (val == L2CAP_FCS_NONE) |
1724 | pi->conf_state |= L2CAP_CONF_NO_FCS_RECV; | 1815 | chan->conf_state |= L2CAP_CONF_NO_FCS_RECV; |
1725 | 1816 | ||
1726 | break; | 1817 | break; |
1727 | 1818 | ||
@@ -1735,30 +1826,30 @@ static int l2cap_parse_conf_req(struct sock *sk, void *data) | |||
1735 | } | 1826 | } |
1736 | } | 1827 | } |
1737 | 1828 | ||
1738 | if (pi->num_conf_rsp || pi->num_conf_req > 1) | 1829 | if (chan->num_conf_rsp || chan->num_conf_req > 1) |
1739 | goto done; | 1830 | goto done; |
1740 | 1831 | ||
1741 | switch (pi->mode) { | 1832 | switch (chan->mode) { |
1742 | case L2CAP_MODE_STREAMING: | 1833 | case L2CAP_MODE_STREAMING: |
1743 | case L2CAP_MODE_ERTM: | 1834 | case L2CAP_MODE_ERTM: |
1744 | if (!(pi->conf_state & L2CAP_CONF_STATE2_DEVICE)) { | 1835 | if (!(chan->conf_state & L2CAP_CONF_STATE2_DEVICE)) { |
1745 | pi->mode = l2cap_select_mode(rfc.mode, | 1836 | chan->mode = l2cap_select_mode(rfc.mode, |
1746 | pi->conn->feat_mask); | 1837 | chan->conn->feat_mask); |
1747 | break; | 1838 | break; |
1748 | } | 1839 | } |
1749 | 1840 | ||
1750 | if (pi->mode != rfc.mode) | 1841 | if (chan->mode != rfc.mode) |
1751 | return -ECONNREFUSED; | 1842 | return -ECONNREFUSED; |
1752 | 1843 | ||
1753 | break; | 1844 | break; |
1754 | } | 1845 | } |
1755 | 1846 | ||
1756 | done: | 1847 | done: |
1757 | if (pi->mode != rfc.mode) { | 1848 | if (chan->mode != rfc.mode) { |
1758 | result = L2CAP_CONF_UNACCEPT; | 1849 | result = L2CAP_CONF_UNACCEPT; |
1759 | rfc.mode = pi->mode; | 1850 | rfc.mode = chan->mode; |
1760 | 1851 | ||
1761 | if (pi->num_conf_rsp == 1) | 1852 | if (chan->num_conf_rsp == 1) |
1762 | return -ECONNREFUSED; | 1853 | return -ECONNREFUSED; |
1763 | 1854 | ||
1764 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, | 1855 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, |
@@ -1773,32 +1864,32 @@ done: | |||
1773 | if (mtu < L2CAP_DEFAULT_MIN_MTU) | 1864 | if (mtu < L2CAP_DEFAULT_MIN_MTU) |
1774 | result = L2CAP_CONF_UNACCEPT; | 1865 | result = L2CAP_CONF_UNACCEPT; |
1775 | else { | 1866 | else { |
1776 | pi->omtu = mtu; | 1867 | chan->omtu = mtu; |
1777 | pi->conf_state |= L2CAP_CONF_MTU_DONE; | 1868 | chan->conf_state |= L2CAP_CONF_MTU_DONE; |
1778 | } | 1869 | } |
1779 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu); | 1870 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu); |
1780 | 1871 | ||
1781 | switch (rfc.mode) { | 1872 | switch (rfc.mode) { |
1782 | case L2CAP_MODE_BASIC: | 1873 | case L2CAP_MODE_BASIC: |
1783 | pi->fcs = L2CAP_FCS_NONE; | 1874 | chan->fcs = L2CAP_FCS_NONE; |
1784 | pi->conf_state |= L2CAP_CONF_MODE_DONE; | 1875 | chan->conf_state |= L2CAP_CONF_MODE_DONE; |
1785 | break; | 1876 | break; |
1786 | 1877 | ||
1787 | case L2CAP_MODE_ERTM: | 1878 | case L2CAP_MODE_ERTM: |
1788 | pi->remote_tx_win = rfc.txwin_size; | 1879 | chan->remote_tx_win = rfc.txwin_size; |
1789 | pi->remote_max_tx = rfc.max_transmit; | 1880 | chan->remote_max_tx = rfc.max_transmit; |
1790 | 1881 | ||
1791 | if (le16_to_cpu(rfc.max_pdu_size) > pi->conn->mtu - 10) | 1882 | if (le16_to_cpu(rfc.max_pdu_size) > chan->conn->mtu - 10) |
1792 | rfc.max_pdu_size = cpu_to_le16(pi->conn->mtu - 10); | 1883 | rfc.max_pdu_size = cpu_to_le16(chan->conn->mtu - 10); |
1793 | 1884 | ||
1794 | pi->remote_mps = le16_to_cpu(rfc.max_pdu_size); | 1885 | chan->remote_mps = le16_to_cpu(rfc.max_pdu_size); |
1795 | 1886 | ||
1796 | rfc.retrans_timeout = | 1887 | rfc.retrans_timeout = |
1797 | le16_to_cpu(L2CAP_DEFAULT_RETRANS_TO); | 1888 | le16_to_cpu(L2CAP_DEFAULT_RETRANS_TO); |
1798 | rfc.monitor_timeout = | 1889 | rfc.monitor_timeout = |
1799 | le16_to_cpu(L2CAP_DEFAULT_MONITOR_TO); | 1890 | le16_to_cpu(L2CAP_DEFAULT_MONITOR_TO); |
1800 | 1891 | ||
1801 | pi->conf_state |= L2CAP_CONF_MODE_DONE; | 1892 | chan->conf_state |= L2CAP_CONF_MODE_DONE; |
1802 | 1893 | ||
1803 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, | 1894 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, |
1804 | sizeof(rfc), (unsigned long) &rfc); | 1895 | sizeof(rfc), (unsigned long) &rfc); |
@@ -1806,12 +1897,12 @@ done: | |||
1806 | break; | 1897 | break; |
1807 | 1898 | ||
1808 | case L2CAP_MODE_STREAMING: | 1899 | case L2CAP_MODE_STREAMING: |
1809 | if (le16_to_cpu(rfc.max_pdu_size) > pi->conn->mtu - 10) | 1900 | if (le16_to_cpu(rfc.max_pdu_size) > chan->conn->mtu - 10) |
1810 | rfc.max_pdu_size = cpu_to_le16(pi->conn->mtu - 10); | 1901 | rfc.max_pdu_size = cpu_to_le16(chan->conn->mtu - 10); |
1811 | 1902 | ||
1812 | pi->remote_mps = le16_to_cpu(rfc.max_pdu_size); | 1903 | chan->remote_mps = le16_to_cpu(rfc.max_pdu_size); |
1813 | 1904 | ||
1814 | pi->conf_state |= L2CAP_CONF_MODE_DONE; | 1905 | chan->conf_state |= L2CAP_CONF_MODE_DONE; |
1815 | 1906 | ||
1816 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, | 1907 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, |
1817 | sizeof(rfc), (unsigned long) &rfc); | 1908 | sizeof(rfc), (unsigned long) &rfc); |
@@ -1822,29 +1913,28 @@ done: | |||
1822 | result = L2CAP_CONF_UNACCEPT; | 1913 | result = L2CAP_CONF_UNACCEPT; |
1823 | 1914 | ||
1824 | memset(&rfc, 0, sizeof(rfc)); | 1915 | memset(&rfc, 0, sizeof(rfc)); |
1825 | rfc.mode = pi->mode; | 1916 | rfc.mode = chan->mode; |
1826 | } | 1917 | } |
1827 | 1918 | ||
1828 | if (result == L2CAP_CONF_SUCCESS) | 1919 | if (result == L2CAP_CONF_SUCCESS) |
1829 | pi->conf_state |= L2CAP_CONF_OUTPUT_DONE; | 1920 | chan->conf_state |= L2CAP_CONF_OUTPUT_DONE; |
1830 | } | 1921 | } |
1831 | rsp->scid = cpu_to_le16(pi->dcid); | 1922 | rsp->scid = cpu_to_le16(chan->dcid); |
1832 | rsp->result = cpu_to_le16(result); | 1923 | rsp->result = cpu_to_le16(result); |
1833 | rsp->flags = cpu_to_le16(0x0000); | 1924 | rsp->flags = cpu_to_le16(0x0000); |
1834 | 1925 | ||
1835 | return ptr - data; | 1926 | return ptr - data; |
1836 | } | 1927 | } |
1837 | 1928 | ||
1838 | static int l2cap_parse_conf_rsp(struct sock *sk, void *rsp, int len, void *data, u16 *result) | 1929 | static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, void *data, u16 *result) |
1839 | { | 1930 | { |
1840 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
1841 | struct l2cap_conf_req *req = data; | 1931 | struct l2cap_conf_req *req = data; |
1842 | void *ptr = req->data; | 1932 | void *ptr = req->data; |
1843 | int type, olen; | 1933 | int type, olen; |
1844 | unsigned long val; | 1934 | unsigned long val; |
1845 | struct l2cap_conf_rfc rfc; | 1935 | struct l2cap_conf_rfc rfc; |
1846 | 1936 | ||
1847 | BT_DBG("sk %p, rsp %p, len %d, req %p", sk, rsp, len, data); | 1937 | BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data); |
1848 | 1938 | ||
1849 | while (len >= L2CAP_CONF_OPT_SIZE) { | 1939 | while (len >= L2CAP_CONF_OPT_SIZE) { |
1850 | len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val); | 1940 | len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val); |
@@ -1853,27 +1943,27 @@ static int l2cap_parse_conf_rsp(struct sock *sk, void *rsp, int len, void *data, | |||
1853 | case L2CAP_CONF_MTU: | 1943 | case L2CAP_CONF_MTU: |
1854 | if (val < L2CAP_DEFAULT_MIN_MTU) { | 1944 | if (val < L2CAP_DEFAULT_MIN_MTU) { |
1855 | *result = L2CAP_CONF_UNACCEPT; | 1945 | *result = L2CAP_CONF_UNACCEPT; |
1856 | pi->imtu = L2CAP_DEFAULT_MIN_MTU; | 1946 | chan->imtu = L2CAP_DEFAULT_MIN_MTU; |
1857 | } else | 1947 | } else |
1858 | pi->imtu = val; | 1948 | chan->imtu = val; |
1859 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->imtu); | 1949 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu); |
1860 | break; | 1950 | break; |
1861 | 1951 | ||
1862 | case L2CAP_CONF_FLUSH_TO: | 1952 | case L2CAP_CONF_FLUSH_TO: |
1863 | pi->flush_to = val; | 1953 | chan->flush_to = val; |
1864 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO, | 1954 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO, |
1865 | 2, pi->flush_to); | 1955 | 2, chan->flush_to); |
1866 | break; | 1956 | break; |
1867 | 1957 | ||
1868 | case L2CAP_CONF_RFC: | 1958 | case L2CAP_CONF_RFC: |
1869 | if (olen == sizeof(rfc)) | 1959 | if (olen == sizeof(rfc)) |
1870 | memcpy(&rfc, (void *)val, olen); | 1960 | memcpy(&rfc, (void *)val, olen); |
1871 | 1961 | ||
1872 | if ((pi->conf_state & L2CAP_CONF_STATE2_DEVICE) && | 1962 | if ((chan->conf_state & L2CAP_CONF_STATE2_DEVICE) && |
1873 | rfc.mode != pi->mode) | 1963 | rfc.mode != chan->mode) |
1874 | return -ECONNREFUSED; | 1964 | return -ECONNREFUSED; |
1875 | 1965 | ||
1876 | pi->fcs = 0; | 1966 | chan->fcs = 0; |
1877 | 1967 | ||
1878 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, | 1968 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, |
1879 | sizeof(rfc), (unsigned long) &rfc); | 1969 | sizeof(rfc), (unsigned long) &rfc); |
@@ -1881,53 +1971,74 @@ static int l2cap_parse_conf_rsp(struct sock *sk, void *rsp, int len, void *data, | |||
1881 | } | 1971 | } |
1882 | } | 1972 | } |
1883 | 1973 | ||
1884 | if (pi->mode == L2CAP_MODE_BASIC && pi->mode != rfc.mode) | 1974 | if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode) |
1885 | return -ECONNREFUSED; | 1975 | return -ECONNREFUSED; |
1886 | 1976 | ||
1887 | pi->mode = rfc.mode; | 1977 | chan->mode = rfc.mode; |
1888 | 1978 | ||
1889 | if (*result == L2CAP_CONF_SUCCESS) { | 1979 | if (*result == L2CAP_CONF_SUCCESS) { |
1890 | switch (rfc.mode) { | 1980 | switch (rfc.mode) { |
1891 | case L2CAP_MODE_ERTM: | 1981 | case L2CAP_MODE_ERTM: |
1892 | pi->retrans_timeout = le16_to_cpu(rfc.retrans_timeout); | 1982 | chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout); |
1893 | pi->monitor_timeout = le16_to_cpu(rfc.monitor_timeout); | 1983 | chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout); |
1894 | pi->mps = le16_to_cpu(rfc.max_pdu_size); | 1984 | chan->mps = le16_to_cpu(rfc.max_pdu_size); |
1895 | break; | 1985 | break; |
1896 | case L2CAP_MODE_STREAMING: | 1986 | case L2CAP_MODE_STREAMING: |
1897 | pi->mps = le16_to_cpu(rfc.max_pdu_size); | 1987 | chan->mps = le16_to_cpu(rfc.max_pdu_size); |
1898 | } | 1988 | } |
1899 | } | 1989 | } |
1900 | 1990 | ||
1901 | req->dcid = cpu_to_le16(pi->dcid); | 1991 | req->dcid = cpu_to_le16(chan->dcid); |
1902 | req->flags = cpu_to_le16(0x0000); | 1992 | req->flags = cpu_to_le16(0x0000); |
1903 | 1993 | ||
1904 | return ptr - data; | 1994 | return ptr - data; |
1905 | } | 1995 | } |
1906 | 1996 | ||
1907 | static int l2cap_build_conf_rsp(struct sock *sk, void *data, u16 result, u16 flags) | 1997 | static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data, u16 result, u16 flags) |
1908 | { | 1998 | { |
1909 | struct l2cap_conf_rsp *rsp = data; | 1999 | struct l2cap_conf_rsp *rsp = data; |
1910 | void *ptr = rsp->data; | 2000 | void *ptr = rsp->data; |
1911 | 2001 | ||
1912 | BT_DBG("sk %p", sk); | 2002 | BT_DBG("chan %p", chan); |
1913 | 2003 | ||
1914 | rsp->scid = cpu_to_le16(l2cap_pi(sk)->dcid); | 2004 | rsp->scid = cpu_to_le16(chan->dcid); |
1915 | rsp->result = cpu_to_le16(result); | 2005 | rsp->result = cpu_to_le16(result); |
1916 | rsp->flags = cpu_to_le16(flags); | 2006 | rsp->flags = cpu_to_le16(flags); |
1917 | 2007 | ||
1918 | return ptr - data; | 2008 | return ptr - data; |
1919 | } | 2009 | } |
1920 | 2010 | ||
1921 | static void l2cap_conf_rfc_get(struct sock *sk, void *rsp, int len) | 2011 | void __l2cap_connect_rsp_defer(struct l2cap_chan *chan) |
2012 | { | ||
2013 | struct l2cap_conn_rsp rsp; | ||
2014 | struct l2cap_conn *conn = chan->conn; | ||
2015 | u8 buf[128]; | ||
2016 | |||
2017 | rsp.scid = cpu_to_le16(chan->dcid); | ||
2018 | rsp.dcid = cpu_to_le16(chan->scid); | ||
2019 | rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS); | ||
2020 | rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); | ||
2021 | l2cap_send_cmd(conn, chan->ident, | ||
2022 | L2CAP_CONN_RSP, sizeof(rsp), &rsp); | ||
2023 | |||
2024 | if (chan->conf_state & L2CAP_CONF_REQ_SENT) | ||
2025 | return; | ||
2026 | |||
2027 | chan->conf_state |= L2CAP_CONF_REQ_SENT; | ||
2028 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, | ||
2029 | l2cap_build_conf_req(chan, buf), buf); | ||
2030 | chan->num_conf_req++; | ||
2031 | } | ||
2032 | |||
2033 | static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len) | ||
1922 | { | 2034 | { |
1923 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
1924 | int type, olen; | 2035 | int type, olen; |
1925 | unsigned long val; | 2036 | unsigned long val; |
1926 | struct l2cap_conf_rfc rfc; | 2037 | struct l2cap_conf_rfc rfc; |
1927 | 2038 | ||
1928 | BT_DBG("sk %p, rsp %p, len %d", sk, rsp, len); | 2039 | BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len); |
1929 | 2040 | ||
1930 | if ((pi->mode != L2CAP_MODE_ERTM) && (pi->mode != L2CAP_MODE_STREAMING)) | 2041 | if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING)) |
1931 | return; | 2042 | return; |
1932 | 2043 | ||
1933 | while (len >= L2CAP_CONF_OPT_SIZE) { | 2044 | while (len >= L2CAP_CONF_OPT_SIZE) { |
@@ -1944,12 +2055,12 @@ static void l2cap_conf_rfc_get(struct sock *sk, void *rsp, int len) | |||
1944 | done: | 2055 | done: |
1945 | switch (rfc.mode) { | 2056 | switch (rfc.mode) { |
1946 | case L2CAP_MODE_ERTM: | 2057 | case L2CAP_MODE_ERTM: |
1947 | pi->retrans_timeout = le16_to_cpu(rfc.retrans_timeout); | 2058 | chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout); |
1948 | pi->monitor_timeout = le16_to_cpu(rfc.monitor_timeout); | 2059 | chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout); |
1949 | pi->mps = le16_to_cpu(rfc.max_pdu_size); | 2060 | chan->mps = le16_to_cpu(rfc.max_pdu_size); |
1950 | break; | 2061 | break; |
1951 | case L2CAP_MODE_STREAMING: | 2062 | case L2CAP_MODE_STREAMING: |
1952 | pi->mps = le16_to_cpu(rfc.max_pdu_size); | 2063 | chan->mps = le16_to_cpu(rfc.max_pdu_size); |
1953 | } | 2064 | } |
1954 | } | 2065 | } |
1955 | 2066 | ||
@@ -1975,9 +2086,9 @@ static inline int l2cap_command_rej(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
1975 | 2086 | ||
1976 | static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data) | 2087 | static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data) |
1977 | { | 2088 | { |
1978 | struct l2cap_chan_list *list = &conn->chan_list; | ||
1979 | struct l2cap_conn_req *req = (struct l2cap_conn_req *) data; | 2089 | struct l2cap_conn_req *req = (struct l2cap_conn_req *) data; |
1980 | struct l2cap_conn_rsp rsp; | 2090 | struct l2cap_conn_rsp rsp; |
2091 | struct l2cap_chan *chan = NULL, *pchan; | ||
1981 | struct sock *parent, *sk = NULL; | 2092 | struct sock *parent, *sk = NULL; |
1982 | int result, status = L2CAP_CS_NO_INFO; | 2093 | int result, status = L2CAP_CS_NO_INFO; |
1983 | 2094 | ||
@@ -1987,12 +2098,14 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
1987 | BT_DBG("psm 0x%2.2x scid 0x%4.4x", psm, scid); | 2098 | BT_DBG("psm 0x%2.2x scid 0x%4.4x", psm, scid); |
1988 | 2099 | ||
1989 | /* Check if we have socket listening on psm */ | 2100 | /* Check if we have socket listening on psm */ |
1990 | parent = l2cap_get_sock_by_psm(BT_LISTEN, psm, conn->src); | 2101 | pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, conn->src); |
1991 | if (!parent) { | 2102 | if (!pchan) { |
1992 | result = L2CAP_CR_BAD_PSM; | 2103 | result = L2CAP_CR_BAD_PSM; |
1993 | goto sendresp; | 2104 | goto sendresp; |
1994 | } | 2105 | } |
1995 | 2106 | ||
2107 | parent = pchan->sk; | ||
2108 | |||
1996 | bh_lock_sock(parent); | 2109 | bh_lock_sock(parent); |
1997 | 2110 | ||
1998 | /* Check if the ACL is secure enough (if not SDP) */ | 2111 | /* Check if the ACL is secure enough (if not SDP) */ |
@@ -2015,11 +2128,19 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
2015 | if (!sk) | 2128 | if (!sk) |
2016 | goto response; | 2129 | goto response; |
2017 | 2130 | ||
2018 | write_lock_bh(&list->lock); | 2131 | chan = l2cap_chan_create(sk); |
2132 | if (!chan) { | ||
2133 | l2cap_sock_kill(sk); | ||
2134 | goto response; | ||
2135 | } | ||
2136 | |||
2137 | l2cap_pi(sk)->chan = chan; | ||
2138 | |||
2139 | write_lock_bh(&conn->chan_lock); | ||
2019 | 2140 | ||
2020 | /* Check if we already have channel with that dcid */ | 2141 | /* Check if we already have channel with that dcid */ |
2021 | if (__l2cap_get_chan_by_dcid(list, scid)) { | 2142 | if (__l2cap_get_chan_by_dcid(conn, scid)) { |
2022 | write_unlock_bh(&list->lock); | 2143 | write_unlock_bh(&conn->chan_lock); |
2023 | sock_set_flag(sk, SOCK_ZAPPED); | 2144 | sock_set_flag(sk, SOCK_ZAPPED); |
2024 | l2cap_sock_kill(sk); | 2145 | l2cap_sock_kill(sk); |
2025 | goto response; | 2146 | goto response; |
@@ -2030,18 +2151,21 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
2030 | l2cap_sock_init(sk, parent); | 2151 | l2cap_sock_init(sk, parent); |
2031 | bacpy(&bt_sk(sk)->src, conn->src); | 2152 | bacpy(&bt_sk(sk)->src, conn->src); |
2032 | bacpy(&bt_sk(sk)->dst, conn->dst); | 2153 | bacpy(&bt_sk(sk)->dst, conn->dst); |
2033 | l2cap_pi(sk)->psm = psm; | 2154 | chan->psm = psm; |
2034 | l2cap_pi(sk)->dcid = scid; | 2155 | chan->dcid = scid; |
2156 | |||
2157 | bt_accept_enqueue(parent, sk); | ||
2158 | |||
2159 | __l2cap_chan_add(conn, chan); | ||
2035 | 2160 | ||
2036 | __l2cap_chan_add(conn, sk, parent); | 2161 | dcid = chan->scid; |
2037 | dcid = l2cap_pi(sk)->scid; | ||
2038 | 2162 | ||
2039 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); | 2163 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); |
2040 | 2164 | ||
2041 | l2cap_pi(sk)->ident = cmd->ident; | 2165 | chan->ident = cmd->ident; |
2042 | 2166 | ||
2043 | if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) { | 2167 | if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) { |
2044 | if (l2cap_check_security(sk)) { | 2168 | if (l2cap_check_security(chan)) { |
2045 | if (bt_sk(sk)->defer_setup) { | 2169 | if (bt_sk(sk)->defer_setup) { |
2046 | sk->sk_state = BT_CONNECT2; | 2170 | sk->sk_state = BT_CONNECT2; |
2047 | result = L2CAP_CR_PEND; | 2171 | result = L2CAP_CR_PEND; |
@@ -2063,7 +2187,7 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
2063 | status = L2CAP_CS_NO_INFO; | 2187 | status = L2CAP_CS_NO_INFO; |
2064 | } | 2188 | } |
2065 | 2189 | ||
2066 | write_unlock_bh(&list->lock); | 2190 | write_unlock_bh(&conn->chan_lock); |
2067 | 2191 | ||
2068 | response: | 2192 | response: |
2069 | bh_unlock_sock(parent); | 2193 | bh_unlock_sock(parent); |
@@ -2089,13 +2213,13 @@ sendresp: | |||
2089 | L2CAP_INFO_REQ, sizeof(info), &info); | 2213 | L2CAP_INFO_REQ, sizeof(info), &info); |
2090 | } | 2214 | } |
2091 | 2215 | ||
2092 | if (sk && !(l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT) && | 2216 | if (chan && !(chan->conf_state & L2CAP_CONF_REQ_SENT) && |
2093 | result == L2CAP_CR_SUCCESS) { | 2217 | result == L2CAP_CR_SUCCESS) { |
2094 | u8 buf[128]; | 2218 | u8 buf[128]; |
2095 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; | 2219 | chan->conf_state |= L2CAP_CONF_REQ_SENT; |
2096 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, | 2220 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, |
2097 | l2cap_build_conf_req(sk, buf), buf); | 2221 | l2cap_build_conf_req(chan, buf), buf); |
2098 | l2cap_pi(sk)->num_conf_req++; | 2222 | chan->num_conf_req++; |
2099 | } | 2223 | } |
2100 | 2224 | ||
2101 | return 0; | 2225 | return 0; |
@@ -2105,6 +2229,7 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
2105 | { | 2229 | { |
2106 | struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data; | 2230 | struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data; |
2107 | u16 scid, dcid, result, status; | 2231 | u16 scid, dcid, result, status; |
2232 | struct l2cap_chan *chan; | ||
2108 | struct sock *sk; | 2233 | struct sock *sk; |
2109 | u8 req[128]; | 2234 | u8 req[128]; |
2110 | 2235 | ||
@@ -2116,34 +2241,36 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
2116 | BT_DBG("dcid 0x%4.4x scid 0x%4.4x result 0x%2.2x status 0x%2.2x", dcid, scid, result, status); | 2241 | BT_DBG("dcid 0x%4.4x scid 0x%4.4x result 0x%2.2x status 0x%2.2x", dcid, scid, result, status); |
2117 | 2242 | ||
2118 | if (scid) { | 2243 | if (scid) { |
2119 | sk = l2cap_get_chan_by_scid(&conn->chan_list, scid); | 2244 | chan = l2cap_get_chan_by_scid(conn, scid); |
2120 | if (!sk) | 2245 | if (!chan) |
2121 | return -EFAULT; | 2246 | return -EFAULT; |
2122 | } else { | 2247 | } else { |
2123 | sk = l2cap_get_chan_by_ident(&conn->chan_list, cmd->ident); | 2248 | chan = l2cap_get_chan_by_ident(conn, cmd->ident); |
2124 | if (!sk) | 2249 | if (!chan) |
2125 | return -EFAULT; | 2250 | return -EFAULT; |
2126 | } | 2251 | } |
2127 | 2252 | ||
2253 | sk = chan->sk; | ||
2254 | |||
2128 | switch (result) { | 2255 | switch (result) { |
2129 | case L2CAP_CR_SUCCESS: | 2256 | case L2CAP_CR_SUCCESS: |
2130 | sk->sk_state = BT_CONFIG; | 2257 | sk->sk_state = BT_CONFIG; |
2131 | l2cap_pi(sk)->ident = 0; | 2258 | chan->ident = 0; |
2132 | l2cap_pi(sk)->dcid = dcid; | 2259 | chan->dcid = dcid; |
2133 | l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_CONNECT_PEND; | 2260 | chan->conf_state &= ~L2CAP_CONF_CONNECT_PEND; |
2134 | 2261 | ||
2135 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT) | 2262 | if (chan->conf_state & L2CAP_CONF_REQ_SENT) |
2136 | break; | 2263 | break; |
2137 | 2264 | ||
2138 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; | 2265 | chan->conf_state |= L2CAP_CONF_REQ_SENT; |
2139 | 2266 | ||
2140 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, | 2267 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, |
2141 | l2cap_build_conf_req(sk, req), req); | 2268 | l2cap_build_conf_req(chan, req), req); |
2142 | l2cap_pi(sk)->num_conf_req++; | 2269 | chan->num_conf_req++; |
2143 | break; | 2270 | break; |
2144 | 2271 | ||
2145 | case L2CAP_CR_PEND: | 2272 | case L2CAP_CR_PEND: |
2146 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND; | 2273 | chan->conf_state |= L2CAP_CONF_CONNECT_PEND; |
2147 | break; | 2274 | break; |
2148 | 2275 | ||
2149 | default: | 2276 | default: |
@@ -2155,7 +2282,7 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
2155 | break; | 2282 | break; |
2156 | } | 2283 | } |
2157 | 2284 | ||
2158 | l2cap_chan_del(sk, ECONNREFUSED); | 2285 | l2cap_chan_del(chan, ECONNREFUSED); |
2159 | break; | 2286 | break; |
2160 | } | 2287 | } |
2161 | 2288 | ||
@@ -2163,15 +2290,17 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
2163 | return 0; | 2290 | return 0; |
2164 | } | 2291 | } |
2165 | 2292 | ||
2166 | static inline void set_default_fcs(struct l2cap_pinfo *pi) | 2293 | static inline void set_default_fcs(struct l2cap_chan *chan) |
2167 | { | 2294 | { |
2295 | struct l2cap_pinfo *pi = l2cap_pi(chan->sk); | ||
2296 | |||
2168 | /* FCS is enabled only in ERTM or streaming mode, if one or both | 2297 | /* FCS is enabled only in ERTM or streaming mode, if one or both |
2169 | * sides request it. | 2298 | * sides request it. |
2170 | */ | 2299 | */ |
2171 | if (pi->mode != L2CAP_MODE_ERTM && pi->mode != L2CAP_MODE_STREAMING) | 2300 | if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING) |
2172 | pi->fcs = L2CAP_FCS_NONE; | 2301 | chan->fcs = L2CAP_FCS_NONE; |
2173 | else if (!(pi->conf_state & L2CAP_CONF_NO_FCS_RECV)) | 2302 | else if (!(pi->chan->conf_state & L2CAP_CONF_NO_FCS_RECV)) |
2174 | pi->fcs = L2CAP_FCS_CRC16; | 2303 | chan->fcs = L2CAP_FCS_CRC16; |
2175 | } | 2304 | } |
2176 | 2305 | ||
2177 | static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data) | 2306 | static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data) |
@@ -2179,6 +2308,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2179 | struct l2cap_conf_req *req = (struct l2cap_conf_req *) data; | 2308 | struct l2cap_conf_req *req = (struct l2cap_conf_req *) data; |
2180 | u16 dcid, flags; | 2309 | u16 dcid, flags; |
2181 | u8 rsp[64]; | 2310 | u8 rsp[64]; |
2311 | struct l2cap_chan *chan; | ||
2182 | struct sock *sk; | 2312 | struct sock *sk; |
2183 | int len; | 2313 | int len; |
2184 | 2314 | ||
@@ -2187,10 +2317,12 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2187 | 2317 | ||
2188 | BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags); | 2318 | BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags); |
2189 | 2319 | ||
2190 | sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid); | 2320 | chan = l2cap_get_chan_by_scid(conn, dcid); |
2191 | if (!sk) | 2321 | if (!chan) |
2192 | return -ENOENT; | 2322 | return -ENOENT; |
2193 | 2323 | ||
2324 | sk = chan->sk; | ||
2325 | |||
2194 | if (sk->sk_state != BT_CONFIG) { | 2326 | if (sk->sk_state != BT_CONFIG) { |
2195 | struct l2cap_cmd_rej rej; | 2327 | struct l2cap_cmd_rej rej; |
2196 | 2328 | ||
@@ -2202,62 +2334,62 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2202 | 2334 | ||
2203 | /* Reject if config buffer is too small. */ | 2335 | /* Reject if config buffer is too small. */ |
2204 | len = cmd_len - sizeof(*req); | 2336 | len = cmd_len - sizeof(*req); |
2205 | if (l2cap_pi(sk)->conf_len + len > sizeof(l2cap_pi(sk)->conf_req)) { | 2337 | if (chan->conf_len + len > sizeof(chan->conf_req)) { |
2206 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, | 2338 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, |
2207 | l2cap_build_conf_rsp(sk, rsp, | 2339 | l2cap_build_conf_rsp(chan, rsp, |
2208 | L2CAP_CONF_REJECT, flags), rsp); | 2340 | L2CAP_CONF_REJECT, flags), rsp); |
2209 | goto unlock; | 2341 | goto unlock; |
2210 | } | 2342 | } |
2211 | 2343 | ||
2212 | /* Store config. */ | 2344 | /* Store config. */ |
2213 | memcpy(l2cap_pi(sk)->conf_req + l2cap_pi(sk)->conf_len, req->data, len); | 2345 | memcpy(chan->conf_req + chan->conf_len, req->data, len); |
2214 | l2cap_pi(sk)->conf_len += len; | 2346 | chan->conf_len += len; |
2215 | 2347 | ||
2216 | if (flags & 0x0001) { | 2348 | if (flags & 0x0001) { |
2217 | /* Incomplete config. Send empty response. */ | 2349 | /* Incomplete config. Send empty response. */ |
2218 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, | 2350 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, |
2219 | l2cap_build_conf_rsp(sk, rsp, | 2351 | l2cap_build_conf_rsp(chan, rsp, |
2220 | L2CAP_CONF_SUCCESS, 0x0001), rsp); | 2352 | L2CAP_CONF_SUCCESS, 0x0001), rsp); |
2221 | goto unlock; | 2353 | goto unlock; |
2222 | } | 2354 | } |
2223 | 2355 | ||
2224 | /* Complete config. */ | 2356 | /* Complete config. */ |
2225 | len = l2cap_parse_conf_req(sk, rsp); | 2357 | len = l2cap_parse_conf_req(chan, rsp); |
2226 | if (len < 0) { | 2358 | if (len < 0) { |
2227 | l2cap_send_disconn_req(conn, sk, ECONNRESET); | 2359 | l2cap_send_disconn_req(conn, chan, ECONNRESET); |
2228 | goto unlock; | 2360 | goto unlock; |
2229 | } | 2361 | } |
2230 | 2362 | ||
2231 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp); | 2363 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp); |
2232 | l2cap_pi(sk)->num_conf_rsp++; | 2364 | chan->num_conf_rsp++; |
2233 | 2365 | ||
2234 | /* Reset config buffer. */ | 2366 | /* Reset config buffer. */ |
2235 | l2cap_pi(sk)->conf_len = 0; | 2367 | chan->conf_len = 0; |
2236 | 2368 | ||
2237 | if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE)) | 2369 | if (!(chan->conf_state & L2CAP_CONF_OUTPUT_DONE)) |
2238 | goto unlock; | 2370 | goto unlock; |
2239 | 2371 | ||
2240 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) { | 2372 | if (chan->conf_state & L2CAP_CONF_INPUT_DONE) { |
2241 | set_default_fcs(l2cap_pi(sk)); | 2373 | set_default_fcs(chan); |
2242 | 2374 | ||
2243 | sk->sk_state = BT_CONNECTED; | 2375 | sk->sk_state = BT_CONNECTED; |
2244 | 2376 | ||
2245 | l2cap_pi(sk)->next_tx_seq = 0; | 2377 | chan->next_tx_seq = 0; |
2246 | l2cap_pi(sk)->expected_tx_seq = 0; | 2378 | chan->expected_tx_seq = 0; |
2247 | __skb_queue_head_init(TX_QUEUE(sk)); | 2379 | skb_queue_head_init(&chan->tx_q); |
2248 | if (l2cap_pi(sk)->mode == L2CAP_MODE_ERTM) | 2380 | if (chan->mode == L2CAP_MODE_ERTM) |
2249 | l2cap_ertm_init(sk); | 2381 | l2cap_ertm_init(chan); |
2250 | 2382 | ||
2251 | l2cap_chan_ready(sk); | 2383 | l2cap_chan_ready(sk); |
2252 | goto unlock; | 2384 | goto unlock; |
2253 | } | 2385 | } |
2254 | 2386 | ||
2255 | if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT)) { | 2387 | if (!(chan->conf_state & L2CAP_CONF_REQ_SENT)) { |
2256 | u8 buf[64]; | 2388 | u8 buf[64]; |
2257 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; | 2389 | chan->conf_state |= L2CAP_CONF_REQ_SENT; |
2258 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, | 2390 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, |
2259 | l2cap_build_conf_req(sk, buf), buf); | 2391 | l2cap_build_conf_req(chan, buf), buf); |
2260 | l2cap_pi(sk)->num_conf_req++; | 2392 | chan->num_conf_req++; |
2261 | } | 2393 | } |
2262 | 2394 | ||
2263 | unlock: | 2395 | unlock: |
@@ -2269,6 +2401,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2269 | { | 2401 | { |
2270 | struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data; | 2402 | struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data; |
2271 | u16 scid, flags, result; | 2403 | u16 scid, flags, result; |
2404 | struct l2cap_chan *chan; | ||
2272 | struct sock *sk; | 2405 | struct sock *sk; |
2273 | int len = cmd->len - sizeof(*rsp); | 2406 | int len = cmd->len - sizeof(*rsp); |
2274 | 2407 | ||
@@ -2279,36 +2412,38 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2279 | BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x", | 2412 | BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x", |
2280 | scid, flags, result); | 2413 | scid, flags, result); |
2281 | 2414 | ||
2282 | sk = l2cap_get_chan_by_scid(&conn->chan_list, scid); | 2415 | chan = l2cap_get_chan_by_scid(conn, scid); |
2283 | if (!sk) | 2416 | if (!chan) |
2284 | return 0; | 2417 | return 0; |
2285 | 2418 | ||
2419 | sk = chan->sk; | ||
2420 | |||
2286 | switch (result) { | 2421 | switch (result) { |
2287 | case L2CAP_CONF_SUCCESS: | 2422 | case L2CAP_CONF_SUCCESS: |
2288 | l2cap_conf_rfc_get(sk, rsp->data, len); | 2423 | l2cap_conf_rfc_get(chan, rsp->data, len); |
2289 | break; | 2424 | break; |
2290 | 2425 | ||
2291 | case L2CAP_CONF_UNACCEPT: | 2426 | case L2CAP_CONF_UNACCEPT: |
2292 | if (l2cap_pi(sk)->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) { | 2427 | if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) { |
2293 | char req[64]; | 2428 | char req[64]; |
2294 | 2429 | ||
2295 | if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) { | 2430 | if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) { |
2296 | l2cap_send_disconn_req(conn, sk, ECONNRESET); | 2431 | l2cap_send_disconn_req(conn, chan, ECONNRESET); |
2297 | goto done; | 2432 | goto done; |
2298 | } | 2433 | } |
2299 | 2434 | ||
2300 | /* throw out any old stored conf requests */ | 2435 | /* throw out any old stored conf requests */ |
2301 | result = L2CAP_CONF_SUCCESS; | 2436 | result = L2CAP_CONF_SUCCESS; |
2302 | len = l2cap_parse_conf_rsp(sk, rsp->data, | 2437 | len = l2cap_parse_conf_rsp(chan, rsp->data, len, |
2303 | len, req, &result); | 2438 | req, &result); |
2304 | if (len < 0) { | 2439 | if (len < 0) { |
2305 | l2cap_send_disconn_req(conn, sk, ECONNRESET); | 2440 | l2cap_send_disconn_req(conn, chan, ECONNRESET); |
2306 | goto done; | 2441 | goto done; |
2307 | } | 2442 | } |
2308 | 2443 | ||
2309 | l2cap_send_cmd(conn, l2cap_get_ident(conn), | 2444 | l2cap_send_cmd(conn, l2cap_get_ident(conn), |
2310 | L2CAP_CONF_REQ, len, req); | 2445 | L2CAP_CONF_REQ, len, req); |
2311 | l2cap_pi(sk)->num_conf_req++; | 2446 | chan->num_conf_req++; |
2312 | if (result != L2CAP_CONF_SUCCESS) | 2447 | if (result != L2CAP_CONF_SUCCESS) |
2313 | goto done; | 2448 | goto done; |
2314 | break; | 2449 | break; |
@@ -2317,24 +2452,24 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2317 | default: | 2452 | default: |
2318 | sk->sk_err = ECONNRESET; | 2453 | sk->sk_err = ECONNRESET; |
2319 | l2cap_sock_set_timer(sk, HZ * 5); | 2454 | l2cap_sock_set_timer(sk, HZ * 5); |
2320 | l2cap_send_disconn_req(conn, sk, ECONNRESET); | 2455 | l2cap_send_disconn_req(conn, chan, ECONNRESET); |
2321 | goto done; | 2456 | goto done; |
2322 | } | 2457 | } |
2323 | 2458 | ||
2324 | if (flags & 0x01) | 2459 | if (flags & 0x01) |
2325 | goto done; | 2460 | goto done; |
2326 | 2461 | ||
2327 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_INPUT_DONE; | 2462 | chan->conf_state |= L2CAP_CONF_INPUT_DONE; |
2328 | 2463 | ||
2329 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE) { | 2464 | if (chan->conf_state & L2CAP_CONF_OUTPUT_DONE) { |
2330 | set_default_fcs(l2cap_pi(sk)); | 2465 | set_default_fcs(chan); |
2331 | 2466 | ||
2332 | sk->sk_state = BT_CONNECTED; | 2467 | sk->sk_state = BT_CONNECTED; |
2333 | l2cap_pi(sk)->next_tx_seq = 0; | 2468 | chan->next_tx_seq = 0; |
2334 | l2cap_pi(sk)->expected_tx_seq = 0; | 2469 | chan->expected_tx_seq = 0; |
2335 | __skb_queue_head_init(TX_QUEUE(sk)); | 2470 | skb_queue_head_init(&chan->tx_q); |
2336 | if (l2cap_pi(sk)->mode == L2CAP_MODE_ERTM) | 2471 | if (chan->mode == L2CAP_MODE_ERTM) |
2337 | l2cap_ertm_init(sk); | 2472 | l2cap_ertm_init(chan); |
2338 | 2473 | ||
2339 | l2cap_chan_ready(sk); | 2474 | l2cap_chan_ready(sk); |
2340 | } | 2475 | } |
@@ -2349,6 +2484,7 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn, struct l2cap_cmd | |||
2349 | struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data; | 2484 | struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data; |
2350 | struct l2cap_disconn_rsp rsp; | 2485 | struct l2cap_disconn_rsp rsp; |
2351 | u16 dcid, scid; | 2486 | u16 dcid, scid; |
2487 | struct l2cap_chan *chan; | ||
2352 | struct sock *sk; | 2488 | struct sock *sk; |
2353 | 2489 | ||
2354 | scid = __le16_to_cpu(req->scid); | 2490 | scid = __le16_to_cpu(req->scid); |
@@ -2356,12 +2492,14 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn, struct l2cap_cmd | |||
2356 | 2492 | ||
2357 | BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid); | 2493 | BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid); |
2358 | 2494 | ||
2359 | sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid); | 2495 | chan = l2cap_get_chan_by_scid(conn, dcid); |
2360 | if (!sk) | 2496 | if (!chan) |
2361 | return 0; | 2497 | return 0; |
2362 | 2498 | ||
2363 | rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid); | 2499 | sk = chan->sk; |
2364 | rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid); | 2500 | |
2501 | rsp.dcid = cpu_to_le16(chan->scid); | ||
2502 | rsp.scid = cpu_to_le16(chan->dcid); | ||
2365 | l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp); | 2503 | l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp); |
2366 | 2504 | ||
2367 | sk->sk_shutdown = SHUTDOWN_MASK; | 2505 | sk->sk_shutdown = SHUTDOWN_MASK; |
@@ -2375,7 +2513,7 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn, struct l2cap_cmd | |||
2375 | return 0; | 2513 | return 0; |
2376 | } | 2514 | } |
2377 | 2515 | ||
2378 | l2cap_chan_del(sk, ECONNRESET); | 2516 | l2cap_chan_del(chan, ECONNRESET); |
2379 | bh_unlock_sock(sk); | 2517 | bh_unlock_sock(sk); |
2380 | 2518 | ||
2381 | l2cap_sock_kill(sk); | 2519 | l2cap_sock_kill(sk); |
@@ -2386,6 +2524,7 @@ static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, struct l2cap_cmd | |||
2386 | { | 2524 | { |
2387 | struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data; | 2525 | struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data; |
2388 | u16 dcid, scid; | 2526 | u16 dcid, scid; |
2527 | struct l2cap_chan *chan; | ||
2389 | struct sock *sk; | 2528 | struct sock *sk; |
2390 | 2529 | ||
2391 | scid = __le16_to_cpu(rsp->scid); | 2530 | scid = __le16_to_cpu(rsp->scid); |
@@ -2393,10 +2532,12 @@ static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, struct l2cap_cmd | |||
2393 | 2532 | ||
2394 | BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid); | 2533 | BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid); |
2395 | 2534 | ||
2396 | sk = l2cap_get_chan_by_scid(&conn->chan_list, scid); | 2535 | chan = l2cap_get_chan_by_scid(conn, scid); |
2397 | if (!sk) | 2536 | if (!chan) |
2398 | return 0; | 2537 | return 0; |
2399 | 2538 | ||
2539 | sk = chan->sk; | ||
2540 | |||
2400 | /* don't delete l2cap channel if sk is owned by user */ | 2541 | /* don't delete l2cap channel if sk is owned by user */ |
2401 | if (sock_owned_by_user(sk)) { | 2542 | if (sock_owned_by_user(sk)) { |
2402 | sk->sk_state = BT_DISCONN; | 2543 | sk->sk_state = BT_DISCONN; |
@@ -2406,7 +2547,7 @@ static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, struct l2cap_cmd | |||
2406 | return 0; | 2547 | return 0; |
2407 | } | 2548 | } |
2408 | 2549 | ||
2409 | l2cap_chan_del(sk, 0); | 2550 | l2cap_chan_del(chan, 0); |
2410 | bh_unlock_sock(sk); | 2551 | bh_unlock_sock(sk); |
2411 | 2552 | ||
2412 | l2cap_sock_kill(sk); | 2553 | l2cap_sock_kill(sk); |
@@ -2463,6 +2604,11 @@ static inline int l2cap_information_rsp(struct l2cap_conn *conn, struct l2cap_cm | |||
2463 | 2604 | ||
2464 | BT_DBG("type 0x%4.4x result 0x%2.2x", type, result); | 2605 | BT_DBG("type 0x%4.4x result 0x%2.2x", type, result); |
2465 | 2606 | ||
2607 | /* L2CAP Info req/rsp are unbound to channels, add extra checks */ | ||
2608 | if (cmd->ident != conn->info_ident || | ||
2609 | conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) | ||
2610 | return 0; | ||
2611 | |||
2466 | del_timer(&conn->info_timer); | 2612 | del_timer(&conn->info_timer); |
2467 | 2613 | ||
2468 | if (result != L2CAP_IR_SUCCESS) { | 2614 | if (result != L2CAP_IR_SUCCESS) { |
@@ -2673,7 +2819,8 @@ static inline void l2cap_sig_channel(struct l2cap_conn *conn, | |||
2673 | 2819 | ||
2674 | if (err) { | 2820 | if (err) { |
2675 | struct l2cap_cmd_rej rej; | 2821 | struct l2cap_cmd_rej rej; |
2676 | BT_DBG("error %d", err); | 2822 | |
2823 | BT_ERR("Wrong link type (%d)", err); | ||
2677 | 2824 | ||
2678 | /* FIXME: Map err to a valid reason */ | 2825 | /* FIXME: Map err to a valid reason */ |
2679 | rej.reason = cpu_to_le16(0); | 2826 | rej.reason = cpu_to_le16(0); |
@@ -2687,12 +2834,12 @@ static inline void l2cap_sig_channel(struct l2cap_conn *conn, | |||
2687 | kfree_skb(skb); | 2834 | kfree_skb(skb); |
2688 | } | 2835 | } |
2689 | 2836 | ||
2690 | static int l2cap_check_fcs(struct l2cap_pinfo *pi, struct sk_buff *skb) | 2837 | static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb) |
2691 | { | 2838 | { |
2692 | u16 our_fcs, rcv_fcs; | 2839 | u16 our_fcs, rcv_fcs; |
2693 | int hdr_size = L2CAP_HDR_SIZE + 2; | 2840 | int hdr_size = L2CAP_HDR_SIZE + 2; |
2694 | 2841 | ||
2695 | if (pi->fcs == L2CAP_FCS_CRC16) { | 2842 | if (chan->fcs == L2CAP_FCS_CRC16) { |
2696 | skb_trim(skb, skb->len - 2); | 2843 | skb_trim(skb, skb->len - 2); |
2697 | rcv_fcs = get_unaligned_le16(skb->data + skb->len); | 2844 | rcv_fcs = get_unaligned_le16(skb->data + skb->len); |
2698 | our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size); | 2845 | our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size); |
@@ -2703,49 +2850,47 @@ static int l2cap_check_fcs(struct l2cap_pinfo *pi, struct sk_buff *skb) | |||
2703 | return 0; | 2850 | return 0; |
2704 | } | 2851 | } |
2705 | 2852 | ||
2706 | static inline void l2cap_send_i_or_rr_or_rnr(struct sock *sk) | 2853 | static inline void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan) |
2707 | { | 2854 | { |
2708 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
2709 | u16 control = 0; | 2855 | u16 control = 0; |
2710 | 2856 | ||
2711 | pi->frames_sent = 0; | 2857 | chan->frames_sent = 0; |
2712 | 2858 | ||
2713 | control |= pi->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; | 2859 | control |= chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; |
2714 | 2860 | ||
2715 | if (pi->conn_state & L2CAP_CONN_LOCAL_BUSY) { | 2861 | if (chan->conn_state & L2CAP_CONN_LOCAL_BUSY) { |
2716 | control |= L2CAP_SUPER_RCV_NOT_READY; | 2862 | control |= L2CAP_SUPER_RCV_NOT_READY; |
2717 | l2cap_send_sframe(pi, control); | 2863 | l2cap_send_sframe(chan, control); |
2718 | pi->conn_state |= L2CAP_CONN_RNR_SENT; | 2864 | chan->conn_state |= L2CAP_CONN_RNR_SENT; |
2719 | } | 2865 | } |
2720 | 2866 | ||
2721 | if (pi->conn_state & L2CAP_CONN_REMOTE_BUSY) | 2867 | if (chan->conn_state & L2CAP_CONN_REMOTE_BUSY) |
2722 | l2cap_retransmit_frames(sk); | 2868 | l2cap_retransmit_frames(chan); |
2723 | 2869 | ||
2724 | l2cap_ertm_send(sk); | 2870 | l2cap_ertm_send(chan); |
2725 | 2871 | ||
2726 | if (!(pi->conn_state & L2CAP_CONN_LOCAL_BUSY) && | 2872 | if (!(chan->conn_state & L2CAP_CONN_LOCAL_BUSY) && |
2727 | pi->frames_sent == 0) { | 2873 | chan->frames_sent == 0) { |
2728 | control |= L2CAP_SUPER_RCV_READY; | 2874 | control |= L2CAP_SUPER_RCV_READY; |
2729 | l2cap_send_sframe(pi, control); | 2875 | l2cap_send_sframe(chan, control); |
2730 | } | 2876 | } |
2731 | } | 2877 | } |
2732 | 2878 | ||
2733 | static int l2cap_add_to_srej_queue(struct sock *sk, struct sk_buff *skb, u8 tx_seq, u8 sar) | 2879 | static int l2cap_add_to_srej_queue(struct l2cap_chan *chan, struct sk_buff *skb, u8 tx_seq, u8 sar) |
2734 | { | 2880 | { |
2735 | struct sk_buff *next_skb; | 2881 | struct sk_buff *next_skb; |
2736 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
2737 | int tx_seq_offset, next_tx_seq_offset; | 2882 | int tx_seq_offset, next_tx_seq_offset; |
2738 | 2883 | ||
2739 | bt_cb(skb)->tx_seq = tx_seq; | 2884 | bt_cb(skb)->tx_seq = tx_seq; |
2740 | bt_cb(skb)->sar = sar; | 2885 | bt_cb(skb)->sar = sar; |
2741 | 2886 | ||
2742 | next_skb = skb_peek(SREJ_QUEUE(sk)); | 2887 | next_skb = skb_peek(&chan->srej_q); |
2743 | if (!next_skb) { | 2888 | if (!next_skb) { |
2744 | __skb_queue_tail(SREJ_QUEUE(sk), skb); | 2889 | __skb_queue_tail(&chan->srej_q, skb); |
2745 | return 0; | 2890 | return 0; |
2746 | } | 2891 | } |
2747 | 2892 | ||
2748 | tx_seq_offset = (tx_seq - pi->buffer_seq) % 64; | 2893 | tx_seq_offset = (tx_seq - chan->buffer_seq) % 64; |
2749 | if (tx_seq_offset < 0) | 2894 | if (tx_seq_offset < 0) |
2750 | tx_seq_offset += 64; | 2895 | tx_seq_offset += 64; |
2751 | 2896 | ||
@@ -2754,53 +2899,52 @@ static int l2cap_add_to_srej_queue(struct sock *sk, struct sk_buff *skb, u8 tx_s | |||
2754 | return -EINVAL; | 2899 | return -EINVAL; |
2755 | 2900 | ||
2756 | next_tx_seq_offset = (bt_cb(next_skb)->tx_seq - | 2901 | next_tx_seq_offset = (bt_cb(next_skb)->tx_seq - |
2757 | pi->buffer_seq) % 64; | 2902 | chan->buffer_seq) % 64; |
2758 | if (next_tx_seq_offset < 0) | 2903 | if (next_tx_seq_offset < 0) |
2759 | next_tx_seq_offset += 64; | 2904 | next_tx_seq_offset += 64; |
2760 | 2905 | ||
2761 | if (next_tx_seq_offset > tx_seq_offset) { | 2906 | if (next_tx_seq_offset > tx_seq_offset) { |
2762 | __skb_queue_before(SREJ_QUEUE(sk), next_skb, skb); | 2907 | __skb_queue_before(&chan->srej_q, next_skb, skb); |
2763 | return 0; | 2908 | return 0; |
2764 | } | 2909 | } |
2765 | 2910 | ||
2766 | if (skb_queue_is_last(SREJ_QUEUE(sk), next_skb)) | 2911 | if (skb_queue_is_last(&chan->srej_q, next_skb)) |
2767 | break; | 2912 | break; |
2768 | 2913 | ||
2769 | } while ((next_skb = skb_queue_next(SREJ_QUEUE(sk), next_skb))); | 2914 | } while ((next_skb = skb_queue_next(&chan->srej_q, next_skb))); |
2770 | 2915 | ||
2771 | __skb_queue_tail(SREJ_QUEUE(sk), skb); | 2916 | __skb_queue_tail(&chan->srej_q, skb); |
2772 | 2917 | ||
2773 | return 0; | 2918 | return 0; |
2774 | } | 2919 | } |
2775 | 2920 | ||
2776 | static int l2cap_ertm_reassembly_sdu(struct sock *sk, struct sk_buff *skb, u16 control) | 2921 | static int l2cap_ertm_reassembly_sdu(struct l2cap_chan *chan, struct sk_buff *skb, u16 control) |
2777 | { | 2922 | { |
2778 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
2779 | struct sk_buff *_skb; | 2923 | struct sk_buff *_skb; |
2780 | int err; | 2924 | int err; |
2781 | 2925 | ||
2782 | switch (control & L2CAP_CTRL_SAR) { | 2926 | switch (control & L2CAP_CTRL_SAR) { |
2783 | case L2CAP_SDU_UNSEGMENTED: | 2927 | case L2CAP_SDU_UNSEGMENTED: |
2784 | if (pi->conn_state & L2CAP_CONN_SAR_SDU) | 2928 | if (chan->conn_state & L2CAP_CONN_SAR_SDU) |
2785 | goto drop; | 2929 | goto drop; |
2786 | 2930 | ||
2787 | err = sock_queue_rcv_skb(sk, skb); | 2931 | err = sock_queue_rcv_skb(chan->sk, skb); |
2788 | if (!err) | 2932 | if (!err) |
2789 | return err; | 2933 | return err; |
2790 | 2934 | ||
2791 | break; | 2935 | break; |
2792 | 2936 | ||
2793 | case L2CAP_SDU_START: | 2937 | case L2CAP_SDU_START: |
2794 | if (pi->conn_state & L2CAP_CONN_SAR_SDU) | 2938 | if (chan->conn_state & L2CAP_CONN_SAR_SDU) |
2795 | goto drop; | 2939 | goto drop; |
2796 | 2940 | ||
2797 | pi->sdu_len = get_unaligned_le16(skb->data); | 2941 | chan->sdu_len = get_unaligned_le16(skb->data); |
2798 | 2942 | ||
2799 | if (pi->sdu_len > pi->imtu) | 2943 | if (chan->sdu_len > chan->imtu) |
2800 | goto disconnect; | 2944 | goto disconnect; |
2801 | 2945 | ||
2802 | pi->sdu = bt_skb_alloc(pi->sdu_len, GFP_ATOMIC); | 2946 | chan->sdu = bt_skb_alloc(chan->sdu_len, GFP_ATOMIC); |
2803 | if (!pi->sdu) | 2947 | if (!chan->sdu) |
2804 | return -ENOMEM; | 2948 | return -ENOMEM; |
2805 | 2949 | ||
2806 | /* pull sdu_len bytes only after alloc, because of Local Busy | 2950 | /* pull sdu_len bytes only after alloc, because of Local Busy |
@@ -2808,63 +2952,63 @@ static int l2cap_ertm_reassembly_sdu(struct sock *sk, struct sk_buff *skb, u16 c | |||
2808 | * only once, i.e., when alloc does not fail */ | 2952 | * only once, i.e., when alloc does not fail */ |
2809 | skb_pull(skb, 2); | 2953 | skb_pull(skb, 2); |
2810 | 2954 | ||
2811 | memcpy(skb_put(pi->sdu, skb->len), skb->data, skb->len); | 2955 | memcpy(skb_put(chan->sdu, skb->len), skb->data, skb->len); |
2812 | 2956 | ||
2813 | pi->conn_state |= L2CAP_CONN_SAR_SDU; | 2957 | chan->conn_state |= L2CAP_CONN_SAR_SDU; |
2814 | pi->partial_sdu_len = skb->len; | 2958 | chan->partial_sdu_len = skb->len; |
2815 | break; | 2959 | break; |
2816 | 2960 | ||
2817 | case L2CAP_SDU_CONTINUE: | 2961 | case L2CAP_SDU_CONTINUE: |
2818 | if (!(pi->conn_state & L2CAP_CONN_SAR_SDU)) | 2962 | if (!(chan->conn_state & L2CAP_CONN_SAR_SDU)) |
2819 | goto disconnect; | 2963 | goto disconnect; |
2820 | 2964 | ||
2821 | if (!pi->sdu) | 2965 | if (!chan->sdu) |
2822 | goto disconnect; | 2966 | goto disconnect; |
2823 | 2967 | ||
2824 | pi->partial_sdu_len += skb->len; | 2968 | chan->partial_sdu_len += skb->len; |
2825 | if (pi->partial_sdu_len > pi->sdu_len) | 2969 | if (chan->partial_sdu_len > chan->sdu_len) |
2826 | goto drop; | 2970 | goto drop; |
2827 | 2971 | ||
2828 | memcpy(skb_put(pi->sdu, skb->len), skb->data, skb->len); | 2972 | memcpy(skb_put(chan->sdu, skb->len), skb->data, skb->len); |
2829 | 2973 | ||
2830 | break; | 2974 | break; |
2831 | 2975 | ||
2832 | case L2CAP_SDU_END: | 2976 | case L2CAP_SDU_END: |
2833 | if (!(pi->conn_state & L2CAP_CONN_SAR_SDU)) | 2977 | if (!(chan->conn_state & L2CAP_CONN_SAR_SDU)) |
2834 | goto disconnect; | 2978 | goto disconnect; |
2835 | 2979 | ||
2836 | if (!pi->sdu) | 2980 | if (!chan->sdu) |
2837 | goto disconnect; | 2981 | goto disconnect; |
2838 | 2982 | ||
2839 | if (!(pi->conn_state & L2CAP_CONN_SAR_RETRY)) { | 2983 | if (!(chan->conn_state & L2CAP_CONN_SAR_RETRY)) { |
2840 | pi->partial_sdu_len += skb->len; | 2984 | chan->partial_sdu_len += skb->len; |
2841 | 2985 | ||
2842 | if (pi->partial_sdu_len > pi->imtu) | 2986 | if (chan->partial_sdu_len > chan->imtu) |
2843 | goto drop; | 2987 | goto drop; |
2844 | 2988 | ||
2845 | if (pi->partial_sdu_len != pi->sdu_len) | 2989 | if (chan->partial_sdu_len != chan->sdu_len) |
2846 | goto drop; | 2990 | goto drop; |
2847 | 2991 | ||
2848 | memcpy(skb_put(pi->sdu, skb->len), skb->data, skb->len); | 2992 | memcpy(skb_put(chan->sdu, skb->len), skb->data, skb->len); |
2849 | } | 2993 | } |
2850 | 2994 | ||
2851 | _skb = skb_clone(pi->sdu, GFP_ATOMIC); | 2995 | _skb = skb_clone(chan->sdu, GFP_ATOMIC); |
2852 | if (!_skb) { | 2996 | if (!_skb) { |
2853 | pi->conn_state |= L2CAP_CONN_SAR_RETRY; | 2997 | chan->conn_state |= L2CAP_CONN_SAR_RETRY; |
2854 | return -ENOMEM; | 2998 | return -ENOMEM; |
2855 | } | 2999 | } |
2856 | 3000 | ||
2857 | err = sock_queue_rcv_skb(sk, _skb); | 3001 | err = sock_queue_rcv_skb(chan->sk, _skb); |
2858 | if (err < 0) { | 3002 | if (err < 0) { |
2859 | kfree_skb(_skb); | 3003 | kfree_skb(_skb); |
2860 | pi->conn_state |= L2CAP_CONN_SAR_RETRY; | 3004 | chan->conn_state |= L2CAP_CONN_SAR_RETRY; |
2861 | return err; | 3005 | return err; |
2862 | } | 3006 | } |
2863 | 3007 | ||
2864 | pi->conn_state &= ~L2CAP_CONN_SAR_RETRY; | 3008 | chan->conn_state &= ~L2CAP_CONN_SAR_RETRY; |
2865 | pi->conn_state &= ~L2CAP_CONN_SAR_SDU; | 3009 | chan->conn_state &= ~L2CAP_CONN_SAR_SDU; |
2866 | 3010 | ||
2867 | kfree_skb(pi->sdu); | 3011 | kfree_skb(chan->sdu); |
2868 | break; | 3012 | break; |
2869 | } | 3013 | } |
2870 | 3014 | ||
@@ -2872,51 +3016,50 @@ static int l2cap_ertm_reassembly_sdu(struct sock *sk, struct sk_buff *skb, u16 c | |||
2872 | return 0; | 3016 | return 0; |
2873 | 3017 | ||
2874 | drop: | 3018 | drop: |
2875 | kfree_skb(pi->sdu); | 3019 | kfree_skb(chan->sdu); |
2876 | pi->sdu = NULL; | 3020 | chan->sdu = NULL; |
2877 | 3021 | ||
2878 | disconnect: | 3022 | disconnect: |
2879 | l2cap_send_disconn_req(pi->conn, sk, ECONNRESET); | 3023 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); |
2880 | kfree_skb(skb); | 3024 | kfree_skb(skb); |
2881 | return 0; | 3025 | return 0; |
2882 | } | 3026 | } |
2883 | 3027 | ||
2884 | static int l2cap_try_push_rx_skb(struct sock *sk) | 3028 | static int l2cap_try_push_rx_skb(struct l2cap_chan *chan) |
2885 | { | 3029 | { |
2886 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
2887 | struct sk_buff *skb; | 3030 | struct sk_buff *skb; |
2888 | u16 control; | 3031 | u16 control; |
2889 | int err; | 3032 | int err; |
2890 | 3033 | ||
2891 | while ((skb = skb_dequeue(BUSY_QUEUE(sk)))) { | 3034 | while ((skb = skb_dequeue(&chan->busy_q))) { |
2892 | control = bt_cb(skb)->sar << L2CAP_CTRL_SAR_SHIFT; | 3035 | control = bt_cb(skb)->sar << L2CAP_CTRL_SAR_SHIFT; |
2893 | err = l2cap_ertm_reassembly_sdu(sk, skb, control); | 3036 | err = l2cap_ertm_reassembly_sdu(chan, skb, control); |
2894 | if (err < 0) { | 3037 | if (err < 0) { |
2895 | skb_queue_head(BUSY_QUEUE(sk), skb); | 3038 | skb_queue_head(&chan->busy_q, skb); |
2896 | return -EBUSY; | 3039 | return -EBUSY; |
2897 | } | 3040 | } |
2898 | 3041 | ||
2899 | pi->buffer_seq = (pi->buffer_seq + 1) % 64; | 3042 | chan->buffer_seq = (chan->buffer_seq + 1) % 64; |
2900 | } | 3043 | } |
2901 | 3044 | ||
2902 | if (!(pi->conn_state & L2CAP_CONN_RNR_SENT)) | 3045 | if (!(chan->conn_state & L2CAP_CONN_RNR_SENT)) |
2903 | goto done; | 3046 | goto done; |
2904 | 3047 | ||
2905 | control = pi->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; | 3048 | control = chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; |
2906 | control |= L2CAP_SUPER_RCV_READY | L2CAP_CTRL_POLL; | 3049 | control |= L2CAP_SUPER_RCV_READY | L2CAP_CTRL_POLL; |
2907 | l2cap_send_sframe(pi, control); | 3050 | l2cap_send_sframe(chan, control); |
2908 | l2cap_pi(sk)->retry_count = 1; | 3051 | chan->retry_count = 1; |
2909 | 3052 | ||
2910 | del_timer(&pi->retrans_timer); | 3053 | del_timer(&chan->retrans_timer); |
2911 | __mod_monitor_timer(); | 3054 | __mod_monitor_timer(); |
2912 | 3055 | ||
2913 | l2cap_pi(sk)->conn_state |= L2CAP_CONN_WAIT_F; | 3056 | chan->conn_state |= L2CAP_CONN_WAIT_F; |
2914 | 3057 | ||
2915 | done: | 3058 | done: |
2916 | pi->conn_state &= ~L2CAP_CONN_LOCAL_BUSY; | 3059 | chan->conn_state &= ~L2CAP_CONN_LOCAL_BUSY; |
2917 | pi->conn_state &= ~L2CAP_CONN_RNR_SENT; | 3060 | chan->conn_state &= ~L2CAP_CONN_RNR_SENT; |
2918 | 3061 | ||
2919 | BT_DBG("sk %p, Exit local busy", sk); | 3062 | BT_DBG("chan %p, Exit local busy", chan); |
2920 | 3063 | ||
2921 | return 0; | 3064 | return 0; |
2922 | } | 3065 | } |
@@ -2924,21 +3067,21 @@ done: | |||
2924 | static void l2cap_busy_work(struct work_struct *work) | 3067 | static void l2cap_busy_work(struct work_struct *work) |
2925 | { | 3068 | { |
2926 | DECLARE_WAITQUEUE(wait, current); | 3069 | DECLARE_WAITQUEUE(wait, current); |
2927 | struct l2cap_pinfo *pi = | 3070 | struct l2cap_chan *chan = |
2928 | container_of(work, struct l2cap_pinfo, busy_work); | 3071 | container_of(work, struct l2cap_chan, busy_work); |
2929 | struct sock *sk = (struct sock *)pi; | 3072 | struct sock *sk = chan->sk; |
2930 | int n_tries = 0, timeo = HZ/5, err; | 3073 | int n_tries = 0, timeo = HZ/5, err; |
2931 | struct sk_buff *skb; | 3074 | struct sk_buff *skb; |
2932 | 3075 | ||
2933 | lock_sock(sk); | 3076 | lock_sock(sk); |
2934 | 3077 | ||
2935 | add_wait_queue(sk_sleep(sk), &wait); | 3078 | add_wait_queue(sk_sleep(sk), &wait); |
2936 | while ((skb = skb_peek(BUSY_QUEUE(sk)))) { | 3079 | while ((skb = skb_peek(&chan->busy_q))) { |
2937 | set_current_state(TASK_INTERRUPTIBLE); | 3080 | set_current_state(TASK_INTERRUPTIBLE); |
2938 | 3081 | ||
2939 | if (n_tries++ > L2CAP_LOCAL_BUSY_TRIES) { | 3082 | if (n_tries++ > L2CAP_LOCAL_BUSY_TRIES) { |
2940 | err = -EBUSY; | 3083 | err = -EBUSY; |
2941 | l2cap_send_disconn_req(pi->conn, sk, EBUSY); | 3084 | l2cap_send_disconn_req(chan->conn, chan, EBUSY); |
2942 | break; | 3085 | break; |
2943 | } | 3086 | } |
2944 | 3087 | ||
@@ -2958,7 +3101,7 @@ static void l2cap_busy_work(struct work_struct *work) | |||
2958 | if (err) | 3101 | if (err) |
2959 | break; | 3102 | break; |
2960 | 3103 | ||
2961 | if (l2cap_try_push_rx_skb(sk) == 0) | 3104 | if (l2cap_try_push_rx_skb(chan) == 0) |
2962 | break; | 3105 | break; |
2963 | } | 3106 | } |
2964 | 3107 | ||
@@ -2968,48 +3111,46 @@ static void l2cap_busy_work(struct work_struct *work) | |||
2968 | release_sock(sk); | 3111 | release_sock(sk); |
2969 | } | 3112 | } |
2970 | 3113 | ||
2971 | static int l2cap_push_rx_skb(struct sock *sk, struct sk_buff *skb, u16 control) | 3114 | static int l2cap_push_rx_skb(struct l2cap_chan *chan, struct sk_buff *skb, u16 control) |
2972 | { | 3115 | { |
2973 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
2974 | int sctrl, err; | 3116 | int sctrl, err; |
2975 | 3117 | ||
2976 | if (pi->conn_state & L2CAP_CONN_LOCAL_BUSY) { | 3118 | if (chan->conn_state & L2CAP_CONN_LOCAL_BUSY) { |
2977 | bt_cb(skb)->sar = control >> L2CAP_CTRL_SAR_SHIFT; | 3119 | bt_cb(skb)->sar = control >> L2CAP_CTRL_SAR_SHIFT; |
2978 | __skb_queue_tail(BUSY_QUEUE(sk), skb); | 3120 | __skb_queue_tail(&chan->busy_q, skb); |
2979 | return l2cap_try_push_rx_skb(sk); | 3121 | return l2cap_try_push_rx_skb(chan); |
2980 | 3122 | ||
2981 | 3123 | ||
2982 | } | 3124 | } |
2983 | 3125 | ||
2984 | err = l2cap_ertm_reassembly_sdu(sk, skb, control); | 3126 | err = l2cap_ertm_reassembly_sdu(chan, skb, control); |
2985 | if (err >= 0) { | 3127 | if (err >= 0) { |
2986 | pi->buffer_seq = (pi->buffer_seq + 1) % 64; | 3128 | chan->buffer_seq = (chan->buffer_seq + 1) % 64; |
2987 | return err; | 3129 | return err; |
2988 | } | 3130 | } |
2989 | 3131 | ||
2990 | /* Busy Condition */ | 3132 | /* Busy Condition */ |
2991 | BT_DBG("sk %p, Enter local busy", sk); | 3133 | BT_DBG("chan %p, Enter local busy", chan); |
2992 | 3134 | ||
2993 | pi->conn_state |= L2CAP_CONN_LOCAL_BUSY; | 3135 | chan->conn_state |= L2CAP_CONN_LOCAL_BUSY; |
2994 | bt_cb(skb)->sar = control >> L2CAP_CTRL_SAR_SHIFT; | 3136 | bt_cb(skb)->sar = control >> L2CAP_CTRL_SAR_SHIFT; |
2995 | __skb_queue_tail(BUSY_QUEUE(sk), skb); | 3137 | __skb_queue_tail(&chan->busy_q, skb); |
2996 | 3138 | ||
2997 | sctrl = pi->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; | 3139 | sctrl = chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; |
2998 | sctrl |= L2CAP_SUPER_RCV_NOT_READY; | 3140 | sctrl |= L2CAP_SUPER_RCV_NOT_READY; |
2999 | l2cap_send_sframe(pi, sctrl); | 3141 | l2cap_send_sframe(chan, sctrl); |
3000 | 3142 | ||
3001 | pi->conn_state |= L2CAP_CONN_RNR_SENT; | 3143 | chan->conn_state |= L2CAP_CONN_RNR_SENT; |
3002 | 3144 | ||
3003 | del_timer(&pi->ack_timer); | 3145 | del_timer(&chan->ack_timer); |
3004 | 3146 | ||
3005 | queue_work(_busy_wq, &pi->busy_work); | 3147 | queue_work(_busy_wq, &chan->busy_work); |
3006 | 3148 | ||
3007 | return err; | 3149 | return err; |
3008 | } | 3150 | } |
3009 | 3151 | ||
3010 | static int l2cap_streaming_reassembly_sdu(struct sock *sk, struct sk_buff *skb, u16 control) | 3152 | static int l2cap_streaming_reassembly_sdu(struct l2cap_chan *chan, struct sk_buff *skb, u16 control) |
3011 | { | 3153 | { |
3012 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
3013 | struct sk_buff *_skb; | 3154 | struct sk_buff *_skb; |
3014 | int err = -EINVAL; | 3155 | int err = -EINVAL; |
3015 | 3156 | ||
@@ -3020,80 +3161,80 @@ static int l2cap_streaming_reassembly_sdu(struct sock *sk, struct sk_buff *skb, | |||
3020 | 3161 | ||
3021 | switch (control & L2CAP_CTRL_SAR) { | 3162 | switch (control & L2CAP_CTRL_SAR) { |
3022 | case L2CAP_SDU_UNSEGMENTED: | 3163 | case L2CAP_SDU_UNSEGMENTED: |
3023 | if (pi->conn_state & L2CAP_CONN_SAR_SDU) { | 3164 | if (chan->conn_state & L2CAP_CONN_SAR_SDU) { |
3024 | kfree_skb(pi->sdu); | 3165 | kfree_skb(chan->sdu); |
3025 | break; | 3166 | break; |
3026 | } | 3167 | } |
3027 | 3168 | ||
3028 | err = sock_queue_rcv_skb(sk, skb); | 3169 | err = sock_queue_rcv_skb(chan->sk, skb); |
3029 | if (!err) | 3170 | if (!err) |
3030 | return 0; | 3171 | return 0; |
3031 | 3172 | ||
3032 | break; | 3173 | break; |
3033 | 3174 | ||
3034 | case L2CAP_SDU_START: | 3175 | case L2CAP_SDU_START: |
3035 | if (pi->conn_state & L2CAP_CONN_SAR_SDU) { | 3176 | if (chan->conn_state & L2CAP_CONN_SAR_SDU) { |
3036 | kfree_skb(pi->sdu); | 3177 | kfree_skb(chan->sdu); |
3037 | break; | 3178 | break; |
3038 | } | 3179 | } |
3039 | 3180 | ||
3040 | pi->sdu_len = get_unaligned_le16(skb->data); | 3181 | chan->sdu_len = get_unaligned_le16(skb->data); |
3041 | skb_pull(skb, 2); | 3182 | skb_pull(skb, 2); |
3042 | 3183 | ||
3043 | if (pi->sdu_len > pi->imtu) { | 3184 | if (chan->sdu_len > chan->imtu) { |
3044 | err = -EMSGSIZE; | 3185 | err = -EMSGSIZE; |
3045 | break; | 3186 | break; |
3046 | } | 3187 | } |
3047 | 3188 | ||
3048 | pi->sdu = bt_skb_alloc(pi->sdu_len, GFP_ATOMIC); | 3189 | chan->sdu = bt_skb_alloc(chan->sdu_len, GFP_ATOMIC); |
3049 | if (!pi->sdu) { | 3190 | if (!chan->sdu) { |
3050 | err = -ENOMEM; | 3191 | err = -ENOMEM; |
3051 | break; | 3192 | break; |
3052 | } | 3193 | } |
3053 | 3194 | ||
3054 | memcpy(skb_put(pi->sdu, skb->len), skb->data, skb->len); | 3195 | memcpy(skb_put(chan->sdu, skb->len), skb->data, skb->len); |
3055 | 3196 | ||
3056 | pi->conn_state |= L2CAP_CONN_SAR_SDU; | 3197 | chan->conn_state |= L2CAP_CONN_SAR_SDU; |
3057 | pi->partial_sdu_len = skb->len; | 3198 | chan->partial_sdu_len = skb->len; |
3058 | err = 0; | 3199 | err = 0; |
3059 | break; | 3200 | break; |
3060 | 3201 | ||
3061 | case L2CAP_SDU_CONTINUE: | 3202 | case L2CAP_SDU_CONTINUE: |
3062 | if (!(pi->conn_state & L2CAP_CONN_SAR_SDU)) | 3203 | if (!(chan->conn_state & L2CAP_CONN_SAR_SDU)) |
3063 | break; | 3204 | break; |
3064 | 3205 | ||
3065 | memcpy(skb_put(pi->sdu, skb->len), skb->data, skb->len); | 3206 | memcpy(skb_put(chan->sdu, skb->len), skb->data, skb->len); |
3066 | 3207 | ||
3067 | pi->partial_sdu_len += skb->len; | 3208 | chan->partial_sdu_len += skb->len; |
3068 | if (pi->partial_sdu_len > pi->sdu_len) | 3209 | if (chan->partial_sdu_len > chan->sdu_len) |
3069 | kfree_skb(pi->sdu); | 3210 | kfree_skb(chan->sdu); |
3070 | else | 3211 | else |
3071 | err = 0; | 3212 | err = 0; |
3072 | 3213 | ||
3073 | break; | 3214 | break; |
3074 | 3215 | ||
3075 | case L2CAP_SDU_END: | 3216 | case L2CAP_SDU_END: |
3076 | if (!(pi->conn_state & L2CAP_CONN_SAR_SDU)) | 3217 | if (!(chan->conn_state & L2CAP_CONN_SAR_SDU)) |
3077 | break; | 3218 | break; |
3078 | 3219 | ||
3079 | memcpy(skb_put(pi->sdu, skb->len), skb->data, skb->len); | 3220 | memcpy(skb_put(chan->sdu, skb->len), skb->data, skb->len); |
3080 | 3221 | ||
3081 | pi->conn_state &= ~L2CAP_CONN_SAR_SDU; | 3222 | chan->conn_state &= ~L2CAP_CONN_SAR_SDU; |
3082 | pi->partial_sdu_len += skb->len; | 3223 | chan->partial_sdu_len += skb->len; |
3083 | 3224 | ||
3084 | if (pi->partial_sdu_len > pi->imtu) | 3225 | if (chan->partial_sdu_len > chan->imtu) |
3085 | goto drop; | 3226 | goto drop; |
3086 | 3227 | ||
3087 | if (pi->partial_sdu_len == pi->sdu_len) { | 3228 | if (chan->partial_sdu_len == chan->sdu_len) { |
3088 | _skb = skb_clone(pi->sdu, GFP_ATOMIC); | 3229 | _skb = skb_clone(chan->sdu, GFP_ATOMIC); |
3089 | err = sock_queue_rcv_skb(sk, _skb); | 3230 | err = sock_queue_rcv_skb(chan->sk, _skb); |
3090 | if (err < 0) | 3231 | if (err < 0) |
3091 | kfree_skb(_skb); | 3232 | kfree_skb(_skb); |
3092 | } | 3233 | } |
3093 | err = 0; | 3234 | err = 0; |
3094 | 3235 | ||
3095 | drop: | 3236 | drop: |
3096 | kfree_skb(pi->sdu); | 3237 | kfree_skb(chan->sdu); |
3097 | break; | 3238 | break; |
3098 | } | 3239 | } |
3099 | 3240 | ||
@@ -3101,31 +3242,30 @@ drop: | |||
3101 | return err; | 3242 | return err; |
3102 | } | 3243 | } |
3103 | 3244 | ||
3104 | static void l2cap_check_srej_gap(struct sock *sk, u8 tx_seq) | 3245 | static void l2cap_check_srej_gap(struct l2cap_chan *chan, u8 tx_seq) |
3105 | { | 3246 | { |
3106 | struct sk_buff *skb; | 3247 | struct sk_buff *skb; |
3107 | u16 control; | 3248 | u16 control; |
3108 | 3249 | ||
3109 | while ((skb = skb_peek(SREJ_QUEUE(sk)))) { | 3250 | while ((skb = skb_peek(&chan->srej_q))) { |
3110 | if (bt_cb(skb)->tx_seq != tx_seq) | 3251 | if (bt_cb(skb)->tx_seq != tx_seq) |
3111 | break; | 3252 | break; |
3112 | 3253 | ||
3113 | skb = skb_dequeue(SREJ_QUEUE(sk)); | 3254 | skb = skb_dequeue(&chan->srej_q); |
3114 | control = bt_cb(skb)->sar << L2CAP_CTRL_SAR_SHIFT; | 3255 | control = bt_cb(skb)->sar << L2CAP_CTRL_SAR_SHIFT; |
3115 | l2cap_ertm_reassembly_sdu(sk, skb, control); | 3256 | l2cap_ertm_reassembly_sdu(chan, skb, control); |
3116 | l2cap_pi(sk)->buffer_seq_srej = | 3257 | chan->buffer_seq_srej = |
3117 | (l2cap_pi(sk)->buffer_seq_srej + 1) % 64; | 3258 | (chan->buffer_seq_srej + 1) % 64; |
3118 | tx_seq = (tx_seq + 1) % 64; | 3259 | tx_seq = (tx_seq + 1) % 64; |
3119 | } | 3260 | } |
3120 | } | 3261 | } |
3121 | 3262 | ||
3122 | static void l2cap_resend_srejframe(struct sock *sk, u8 tx_seq) | 3263 | static void l2cap_resend_srejframe(struct l2cap_chan *chan, u8 tx_seq) |
3123 | { | 3264 | { |
3124 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
3125 | struct srej_list *l, *tmp; | 3265 | struct srej_list *l, *tmp; |
3126 | u16 control; | 3266 | u16 control; |
3127 | 3267 | ||
3128 | list_for_each_entry_safe(l, tmp, SREJ_LIST(sk), list) { | 3268 | list_for_each_entry_safe(l, tmp, &chan->srej_l, list) { |
3129 | if (l->tx_seq == tx_seq) { | 3269 | if (l->tx_seq == tx_seq) { |
3130 | list_del(&l->list); | 3270 | list_del(&l->list); |
3131 | kfree(l); | 3271 | kfree(l); |
@@ -3133,107 +3273,105 @@ static void l2cap_resend_srejframe(struct sock *sk, u8 tx_seq) | |||
3133 | } | 3273 | } |
3134 | control = L2CAP_SUPER_SELECT_REJECT; | 3274 | control = L2CAP_SUPER_SELECT_REJECT; |
3135 | control |= l->tx_seq << L2CAP_CTRL_REQSEQ_SHIFT; | 3275 | control |= l->tx_seq << L2CAP_CTRL_REQSEQ_SHIFT; |
3136 | l2cap_send_sframe(pi, control); | 3276 | l2cap_send_sframe(chan, control); |
3137 | list_del(&l->list); | 3277 | list_del(&l->list); |
3138 | list_add_tail(&l->list, SREJ_LIST(sk)); | 3278 | list_add_tail(&l->list, &chan->srej_l); |
3139 | } | 3279 | } |
3140 | } | 3280 | } |
3141 | 3281 | ||
3142 | static void l2cap_send_srejframe(struct sock *sk, u8 tx_seq) | 3282 | static void l2cap_send_srejframe(struct l2cap_chan *chan, u8 tx_seq) |
3143 | { | 3283 | { |
3144 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
3145 | struct srej_list *new; | 3284 | struct srej_list *new; |
3146 | u16 control; | 3285 | u16 control; |
3147 | 3286 | ||
3148 | while (tx_seq != pi->expected_tx_seq) { | 3287 | while (tx_seq != chan->expected_tx_seq) { |
3149 | control = L2CAP_SUPER_SELECT_REJECT; | 3288 | control = L2CAP_SUPER_SELECT_REJECT; |
3150 | control |= pi->expected_tx_seq << L2CAP_CTRL_REQSEQ_SHIFT; | 3289 | control |= chan->expected_tx_seq << L2CAP_CTRL_REQSEQ_SHIFT; |
3151 | l2cap_send_sframe(pi, control); | 3290 | l2cap_send_sframe(chan, control); |
3152 | 3291 | ||
3153 | new = kzalloc(sizeof(struct srej_list), GFP_ATOMIC); | 3292 | new = kzalloc(sizeof(struct srej_list), GFP_ATOMIC); |
3154 | new->tx_seq = pi->expected_tx_seq; | 3293 | new->tx_seq = chan->expected_tx_seq; |
3155 | pi->expected_tx_seq = (pi->expected_tx_seq + 1) % 64; | 3294 | chan->expected_tx_seq = (chan->expected_tx_seq + 1) % 64; |
3156 | list_add_tail(&new->list, SREJ_LIST(sk)); | 3295 | list_add_tail(&new->list, &chan->srej_l); |
3157 | } | 3296 | } |
3158 | pi->expected_tx_seq = (pi->expected_tx_seq + 1) % 64; | 3297 | chan->expected_tx_seq = (chan->expected_tx_seq + 1) % 64; |
3159 | } | 3298 | } |
3160 | 3299 | ||
3161 | static inline int l2cap_data_channel_iframe(struct sock *sk, u16 rx_control, struct sk_buff *skb) | 3300 | static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_control, struct sk_buff *skb) |
3162 | { | 3301 | { |
3163 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
3164 | u8 tx_seq = __get_txseq(rx_control); | 3302 | u8 tx_seq = __get_txseq(rx_control); |
3165 | u8 req_seq = __get_reqseq(rx_control); | 3303 | u8 req_seq = __get_reqseq(rx_control); |
3166 | u8 sar = rx_control >> L2CAP_CTRL_SAR_SHIFT; | 3304 | u8 sar = rx_control >> L2CAP_CTRL_SAR_SHIFT; |
3167 | int tx_seq_offset, expected_tx_seq_offset; | 3305 | int tx_seq_offset, expected_tx_seq_offset; |
3168 | int num_to_ack = (pi->tx_win/6) + 1; | 3306 | int num_to_ack = (chan->tx_win/6) + 1; |
3169 | int err = 0; | 3307 | int err = 0; |
3170 | 3308 | ||
3171 | BT_DBG("sk %p len %d tx_seq %d rx_control 0x%4.4x", sk, skb->len, tx_seq, | 3309 | BT_DBG("chan %p len %d tx_seq %d rx_control 0x%4.4x", chan, skb->len, |
3172 | rx_control); | 3310 | tx_seq, rx_control); |
3173 | 3311 | ||
3174 | if (L2CAP_CTRL_FINAL & rx_control && | 3312 | if (L2CAP_CTRL_FINAL & rx_control && |
3175 | l2cap_pi(sk)->conn_state & L2CAP_CONN_WAIT_F) { | 3313 | chan->conn_state & L2CAP_CONN_WAIT_F) { |
3176 | del_timer(&pi->monitor_timer); | 3314 | del_timer(&chan->monitor_timer); |
3177 | if (pi->unacked_frames > 0) | 3315 | if (chan->unacked_frames > 0) |
3178 | __mod_retrans_timer(); | 3316 | __mod_retrans_timer(); |
3179 | pi->conn_state &= ~L2CAP_CONN_WAIT_F; | 3317 | chan->conn_state &= ~L2CAP_CONN_WAIT_F; |
3180 | } | 3318 | } |
3181 | 3319 | ||
3182 | pi->expected_ack_seq = req_seq; | 3320 | chan->expected_ack_seq = req_seq; |
3183 | l2cap_drop_acked_frames(sk); | 3321 | l2cap_drop_acked_frames(chan); |
3184 | 3322 | ||
3185 | if (tx_seq == pi->expected_tx_seq) | 3323 | if (tx_seq == chan->expected_tx_seq) |
3186 | goto expected; | 3324 | goto expected; |
3187 | 3325 | ||
3188 | tx_seq_offset = (tx_seq - pi->buffer_seq) % 64; | 3326 | tx_seq_offset = (tx_seq - chan->buffer_seq) % 64; |
3189 | if (tx_seq_offset < 0) | 3327 | if (tx_seq_offset < 0) |
3190 | tx_seq_offset += 64; | 3328 | tx_seq_offset += 64; |
3191 | 3329 | ||
3192 | /* invalid tx_seq */ | 3330 | /* invalid tx_seq */ |
3193 | if (tx_seq_offset >= pi->tx_win) { | 3331 | if (tx_seq_offset >= chan->tx_win) { |
3194 | l2cap_send_disconn_req(pi->conn, sk, ECONNRESET); | 3332 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); |
3195 | goto drop; | 3333 | goto drop; |
3196 | } | 3334 | } |
3197 | 3335 | ||
3198 | if (pi->conn_state == L2CAP_CONN_LOCAL_BUSY) | 3336 | if (chan->conn_state == L2CAP_CONN_LOCAL_BUSY) |
3199 | goto drop; | 3337 | goto drop; |
3200 | 3338 | ||
3201 | if (pi->conn_state & L2CAP_CONN_SREJ_SENT) { | 3339 | if (chan->conn_state & L2CAP_CONN_SREJ_SENT) { |
3202 | struct srej_list *first; | 3340 | struct srej_list *first; |
3203 | 3341 | ||
3204 | first = list_first_entry(SREJ_LIST(sk), | 3342 | first = list_first_entry(&chan->srej_l, |
3205 | struct srej_list, list); | 3343 | struct srej_list, list); |
3206 | if (tx_seq == first->tx_seq) { | 3344 | if (tx_seq == first->tx_seq) { |
3207 | l2cap_add_to_srej_queue(sk, skb, tx_seq, sar); | 3345 | l2cap_add_to_srej_queue(chan, skb, tx_seq, sar); |
3208 | l2cap_check_srej_gap(sk, tx_seq); | 3346 | l2cap_check_srej_gap(chan, tx_seq); |
3209 | 3347 | ||
3210 | list_del(&first->list); | 3348 | list_del(&first->list); |
3211 | kfree(first); | 3349 | kfree(first); |
3212 | 3350 | ||
3213 | if (list_empty(SREJ_LIST(sk))) { | 3351 | if (list_empty(&chan->srej_l)) { |
3214 | pi->buffer_seq = pi->buffer_seq_srej; | 3352 | chan->buffer_seq = chan->buffer_seq_srej; |
3215 | pi->conn_state &= ~L2CAP_CONN_SREJ_SENT; | 3353 | chan->conn_state &= ~L2CAP_CONN_SREJ_SENT; |
3216 | l2cap_send_ack(pi); | 3354 | l2cap_send_ack(chan); |
3217 | BT_DBG("sk %p, Exit SREJ_SENT", sk); | 3355 | BT_DBG("chan %p, Exit SREJ_SENT", chan); |
3218 | } | 3356 | } |
3219 | } else { | 3357 | } else { |
3220 | struct srej_list *l; | 3358 | struct srej_list *l; |
3221 | 3359 | ||
3222 | /* duplicated tx_seq */ | 3360 | /* duplicated tx_seq */ |
3223 | if (l2cap_add_to_srej_queue(sk, skb, tx_seq, sar) < 0) | 3361 | if (l2cap_add_to_srej_queue(chan, skb, tx_seq, sar) < 0) |
3224 | goto drop; | 3362 | goto drop; |
3225 | 3363 | ||
3226 | list_for_each_entry(l, SREJ_LIST(sk), list) { | 3364 | list_for_each_entry(l, &chan->srej_l, list) { |
3227 | if (l->tx_seq == tx_seq) { | 3365 | if (l->tx_seq == tx_seq) { |
3228 | l2cap_resend_srejframe(sk, tx_seq); | 3366 | l2cap_resend_srejframe(chan, tx_seq); |
3229 | return 0; | 3367 | return 0; |
3230 | } | 3368 | } |
3231 | } | 3369 | } |
3232 | l2cap_send_srejframe(sk, tx_seq); | 3370 | l2cap_send_srejframe(chan, tx_seq); |
3233 | } | 3371 | } |
3234 | } else { | 3372 | } else { |
3235 | expected_tx_seq_offset = | 3373 | expected_tx_seq_offset = |
3236 | (pi->expected_tx_seq - pi->buffer_seq) % 64; | 3374 | (chan->expected_tx_seq - chan->buffer_seq) % 64; |
3237 | if (expected_tx_seq_offset < 0) | 3375 | if (expected_tx_seq_offset < 0) |
3238 | expected_tx_seq_offset += 64; | 3376 | expected_tx_seq_offset += 64; |
3239 | 3377 | ||
@@ -3241,51 +3379,51 @@ static inline int l2cap_data_channel_iframe(struct sock *sk, u16 rx_control, str | |||
3241 | if (tx_seq_offset < expected_tx_seq_offset) | 3379 | if (tx_seq_offset < expected_tx_seq_offset) |
3242 | goto drop; | 3380 | goto drop; |
3243 | 3381 | ||
3244 | pi->conn_state |= L2CAP_CONN_SREJ_SENT; | 3382 | chan->conn_state |= L2CAP_CONN_SREJ_SENT; |
3245 | 3383 | ||
3246 | BT_DBG("sk %p, Enter SREJ", sk); | 3384 | BT_DBG("chan %p, Enter SREJ", chan); |
3247 | 3385 | ||
3248 | INIT_LIST_HEAD(SREJ_LIST(sk)); | 3386 | INIT_LIST_HEAD(&chan->srej_l); |
3249 | pi->buffer_seq_srej = pi->buffer_seq; | 3387 | chan->buffer_seq_srej = chan->buffer_seq; |
3250 | 3388 | ||
3251 | __skb_queue_head_init(SREJ_QUEUE(sk)); | 3389 | __skb_queue_head_init(&chan->srej_q); |
3252 | __skb_queue_head_init(BUSY_QUEUE(sk)); | 3390 | __skb_queue_head_init(&chan->busy_q); |
3253 | l2cap_add_to_srej_queue(sk, skb, tx_seq, sar); | 3391 | l2cap_add_to_srej_queue(chan, skb, tx_seq, sar); |
3254 | 3392 | ||
3255 | pi->conn_state |= L2CAP_CONN_SEND_PBIT; | 3393 | chan->conn_state |= L2CAP_CONN_SEND_PBIT; |
3256 | 3394 | ||
3257 | l2cap_send_srejframe(sk, tx_seq); | 3395 | l2cap_send_srejframe(chan, tx_seq); |
3258 | 3396 | ||
3259 | del_timer(&pi->ack_timer); | 3397 | del_timer(&chan->ack_timer); |
3260 | } | 3398 | } |
3261 | return 0; | 3399 | return 0; |
3262 | 3400 | ||
3263 | expected: | 3401 | expected: |
3264 | pi->expected_tx_seq = (pi->expected_tx_seq + 1) % 64; | 3402 | chan->expected_tx_seq = (chan->expected_tx_seq + 1) % 64; |
3265 | 3403 | ||
3266 | if (pi->conn_state & L2CAP_CONN_SREJ_SENT) { | 3404 | if (chan->conn_state & L2CAP_CONN_SREJ_SENT) { |
3267 | bt_cb(skb)->tx_seq = tx_seq; | 3405 | bt_cb(skb)->tx_seq = tx_seq; |
3268 | bt_cb(skb)->sar = sar; | 3406 | bt_cb(skb)->sar = sar; |
3269 | __skb_queue_tail(SREJ_QUEUE(sk), skb); | 3407 | __skb_queue_tail(&chan->srej_q, skb); |
3270 | return 0; | 3408 | return 0; |
3271 | } | 3409 | } |
3272 | 3410 | ||
3273 | err = l2cap_push_rx_skb(sk, skb, rx_control); | 3411 | err = l2cap_push_rx_skb(chan, skb, rx_control); |
3274 | if (err < 0) | 3412 | if (err < 0) |
3275 | return 0; | 3413 | return 0; |
3276 | 3414 | ||
3277 | if (rx_control & L2CAP_CTRL_FINAL) { | 3415 | if (rx_control & L2CAP_CTRL_FINAL) { |
3278 | if (pi->conn_state & L2CAP_CONN_REJ_ACT) | 3416 | if (chan->conn_state & L2CAP_CONN_REJ_ACT) |
3279 | pi->conn_state &= ~L2CAP_CONN_REJ_ACT; | 3417 | chan->conn_state &= ~L2CAP_CONN_REJ_ACT; |
3280 | else | 3418 | else |
3281 | l2cap_retransmit_frames(sk); | 3419 | l2cap_retransmit_frames(chan); |
3282 | } | 3420 | } |
3283 | 3421 | ||
3284 | __mod_ack_timer(); | 3422 | __mod_ack_timer(); |
3285 | 3423 | ||
3286 | pi->num_acked = (pi->num_acked + 1) % num_to_ack; | 3424 | chan->num_acked = (chan->num_acked + 1) % num_to_ack; |
3287 | if (pi->num_acked == num_to_ack - 1) | 3425 | if (chan->num_acked == num_to_ack - 1) |
3288 | l2cap_send_ack(pi); | 3426 | l2cap_send_ack(chan); |
3289 | 3427 | ||
3290 | return 0; | 3428 | return 0; |
3291 | 3429 | ||
@@ -3294,165 +3432,160 @@ drop: | |||
3294 | return 0; | 3432 | return 0; |
3295 | } | 3433 | } |
3296 | 3434 | ||
3297 | static inline void l2cap_data_channel_rrframe(struct sock *sk, u16 rx_control) | 3435 | static inline void l2cap_data_channel_rrframe(struct l2cap_chan *chan, u16 rx_control) |
3298 | { | 3436 | { |
3299 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 3437 | BT_DBG("chan %p, req_seq %d ctrl 0x%4.4x", chan, __get_reqseq(rx_control), |
3300 | |||
3301 | BT_DBG("sk %p, req_seq %d ctrl 0x%4.4x", sk, __get_reqseq(rx_control), | ||
3302 | rx_control); | 3438 | rx_control); |
3303 | 3439 | ||
3304 | pi->expected_ack_seq = __get_reqseq(rx_control); | 3440 | chan->expected_ack_seq = __get_reqseq(rx_control); |
3305 | l2cap_drop_acked_frames(sk); | 3441 | l2cap_drop_acked_frames(chan); |
3306 | 3442 | ||
3307 | if (rx_control & L2CAP_CTRL_POLL) { | 3443 | if (rx_control & L2CAP_CTRL_POLL) { |
3308 | pi->conn_state |= L2CAP_CONN_SEND_FBIT; | 3444 | chan->conn_state |= L2CAP_CONN_SEND_FBIT; |
3309 | if (pi->conn_state & L2CAP_CONN_SREJ_SENT) { | 3445 | if (chan->conn_state & L2CAP_CONN_SREJ_SENT) { |
3310 | if ((pi->conn_state & L2CAP_CONN_REMOTE_BUSY) && | 3446 | if ((chan->conn_state & L2CAP_CONN_REMOTE_BUSY) && |
3311 | (pi->unacked_frames > 0)) | 3447 | (chan->unacked_frames > 0)) |
3312 | __mod_retrans_timer(); | 3448 | __mod_retrans_timer(); |
3313 | 3449 | ||
3314 | pi->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; | 3450 | chan->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; |
3315 | l2cap_send_srejtail(sk); | 3451 | l2cap_send_srejtail(chan); |
3316 | } else { | 3452 | } else { |
3317 | l2cap_send_i_or_rr_or_rnr(sk); | 3453 | l2cap_send_i_or_rr_or_rnr(chan); |
3318 | } | 3454 | } |
3319 | 3455 | ||
3320 | } else if (rx_control & L2CAP_CTRL_FINAL) { | 3456 | } else if (rx_control & L2CAP_CTRL_FINAL) { |
3321 | pi->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; | 3457 | chan->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; |
3322 | 3458 | ||
3323 | if (pi->conn_state & L2CAP_CONN_REJ_ACT) | 3459 | if (chan->conn_state & L2CAP_CONN_REJ_ACT) |
3324 | pi->conn_state &= ~L2CAP_CONN_REJ_ACT; | 3460 | chan->conn_state &= ~L2CAP_CONN_REJ_ACT; |
3325 | else | 3461 | else |
3326 | l2cap_retransmit_frames(sk); | 3462 | l2cap_retransmit_frames(chan); |
3327 | 3463 | ||
3328 | } else { | 3464 | } else { |
3329 | if ((pi->conn_state & L2CAP_CONN_REMOTE_BUSY) && | 3465 | if ((chan->conn_state & L2CAP_CONN_REMOTE_BUSY) && |
3330 | (pi->unacked_frames > 0)) | 3466 | (chan->unacked_frames > 0)) |
3331 | __mod_retrans_timer(); | 3467 | __mod_retrans_timer(); |
3332 | 3468 | ||
3333 | pi->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; | 3469 | chan->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; |
3334 | if (pi->conn_state & L2CAP_CONN_SREJ_SENT) | 3470 | if (chan->conn_state & L2CAP_CONN_SREJ_SENT) |
3335 | l2cap_send_ack(pi); | 3471 | l2cap_send_ack(chan); |
3336 | else | 3472 | else |
3337 | l2cap_ertm_send(sk); | 3473 | l2cap_ertm_send(chan); |
3338 | } | 3474 | } |
3339 | } | 3475 | } |
3340 | 3476 | ||
3341 | static inline void l2cap_data_channel_rejframe(struct sock *sk, u16 rx_control) | 3477 | static inline void l2cap_data_channel_rejframe(struct l2cap_chan *chan, u16 rx_control) |
3342 | { | 3478 | { |
3343 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
3344 | u8 tx_seq = __get_reqseq(rx_control); | 3479 | u8 tx_seq = __get_reqseq(rx_control); |
3345 | 3480 | ||
3346 | BT_DBG("sk %p, req_seq %d ctrl 0x%4.4x", sk, tx_seq, rx_control); | 3481 | BT_DBG("chan %p, req_seq %d ctrl 0x%4.4x", chan, tx_seq, rx_control); |
3347 | 3482 | ||
3348 | pi->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; | 3483 | chan->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; |
3349 | 3484 | ||
3350 | pi->expected_ack_seq = tx_seq; | 3485 | chan->expected_ack_seq = tx_seq; |
3351 | l2cap_drop_acked_frames(sk); | 3486 | l2cap_drop_acked_frames(chan); |
3352 | 3487 | ||
3353 | if (rx_control & L2CAP_CTRL_FINAL) { | 3488 | if (rx_control & L2CAP_CTRL_FINAL) { |
3354 | if (pi->conn_state & L2CAP_CONN_REJ_ACT) | 3489 | if (chan->conn_state & L2CAP_CONN_REJ_ACT) |
3355 | pi->conn_state &= ~L2CAP_CONN_REJ_ACT; | 3490 | chan->conn_state &= ~L2CAP_CONN_REJ_ACT; |
3356 | else | 3491 | else |
3357 | l2cap_retransmit_frames(sk); | 3492 | l2cap_retransmit_frames(chan); |
3358 | } else { | 3493 | } else { |
3359 | l2cap_retransmit_frames(sk); | 3494 | l2cap_retransmit_frames(chan); |
3360 | 3495 | ||
3361 | if (pi->conn_state & L2CAP_CONN_WAIT_F) | 3496 | if (chan->conn_state & L2CAP_CONN_WAIT_F) |
3362 | pi->conn_state |= L2CAP_CONN_REJ_ACT; | 3497 | chan->conn_state |= L2CAP_CONN_REJ_ACT; |
3363 | } | 3498 | } |
3364 | } | 3499 | } |
3365 | static inline void l2cap_data_channel_srejframe(struct sock *sk, u16 rx_control) | 3500 | static inline void l2cap_data_channel_srejframe(struct l2cap_chan *chan, u16 rx_control) |
3366 | { | 3501 | { |
3367 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
3368 | u8 tx_seq = __get_reqseq(rx_control); | 3502 | u8 tx_seq = __get_reqseq(rx_control); |
3369 | 3503 | ||
3370 | BT_DBG("sk %p, req_seq %d ctrl 0x%4.4x", sk, tx_seq, rx_control); | 3504 | BT_DBG("chan %p, req_seq %d ctrl 0x%4.4x", chan, tx_seq, rx_control); |
3371 | 3505 | ||
3372 | pi->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; | 3506 | chan->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; |
3373 | 3507 | ||
3374 | if (rx_control & L2CAP_CTRL_POLL) { | 3508 | if (rx_control & L2CAP_CTRL_POLL) { |
3375 | pi->expected_ack_seq = tx_seq; | 3509 | chan->expected_ack_seq = tx_seq; |
3376 | l2cap_drop_acked_frames(sk); | 3510 | l2cap_drop_acked_frames(chan); |
3377 | 3511 | ||
3378 | pi->conn_state |= L2CAP_CONN_SEND_FBIT; | 3512 | chan->conn_state |= L2CAP_CONN_SEND_FBIT; |
3379 | l2cap_retransmit_one_frame(sk, tx_seq); | 3513 | l2cap_retransmit_one_frame(chan, tx_seq); |
3380 | 3514 | ||
3381 | l2cap_ertm_send(sk); | 3515 | l2cap_ertm_send(chan); |
3382 | 3516 | ||
3383 | if (pi->conn_state & L2CAP_CONN_WAIT_F) { | 3517 | if (chan->conn_state & L2CAP_CONN_WAIT_F) { |
3384 | pi->srej_save_reqseq = tx_seq; | 3518 | chan->srej_save_reqseq = tx_seq; |
3385 | pi->conn_state |= L2CAP_CONN_SREJ_ACT; | 3519 | chan->conn_state |= L2CAP_CONN_SREJ_ACT; |
3386 | } | 3520 | } |
3387 | } else if (rx_control & L2CAP_CTRL_FINAL) { | 3521 | } else if (rx_control & L2CAP_CTRL_FINAL) { |
3388 | if ((pi->conn_state & L2CAP_CONN_SREJ_ACT) && | 3522 | if ((chan->conn_state & L2CAP_CONN_SREJ_ACT) && |
3389 | pi->srej_save_reqseq == tx_seq) | 3523 | chan->srej_save_reqseq == tx_seq) |
3390 | pi->conn_state &= ~L2CAP_CONN_SREJ_ACT; | 3524 | chan->conn_state &= ~L2CAP_CONN_SREJ_ACT; |
3391 | else | 3525 | else |
3392 | l2cap_retransmit_one_frame(sk, tx_seq); | 3526 | l2cap_retransmit_one_frame(chan, tx_seq); |
3393 | } else { | 3527 | } else { |
3394 | l2cap_retransmit_one_frame(sk, tx_seq); | 3528 | l2cap_retransmit_one_frame(chan, tx_seq); |
3395 | if (pi->conn_state & L2CAP_CONN_WAIT_F) { | 3529 | if (chan->conn_state & L2CAP_CONN_WAIT_F) { |
3396 | pi->srej_save_reqseq = tx_seq; | 3530 | chan->srej_save_reqseq = tx_seq; |
3397 | pi->conn_state |= L2CAP_CONN_SREJ_ACT; | 3531 | chan->conn_state |= L2CAP_CONN_SREJ_ACT; |
3398 | } | 3532 | } |
3399 | } | 3533 | } |
3400 | } | 3534 | } |
3401 | 3535 | ||
3402 | static inline void l2cap_data_channel_rnrframe(struct sock *sk, u16 rx_control) | 3536 | static inline void l2cap_data_channel_rnrframe(struct l2cap_chan *chan, u16 rx_control) |
3403 | { | 3537 | { |
3404 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
3405 | u8 tx_seq = __get_reqseq(rx_control); | 3538 | u8 tx_seq = __get_reqseq(rx_control); |
3406 | 3539 | ||
3407 | BT_DBG("sk %p, req_seq %d ctrl 0x%4.4x", sk, tx_seq, rx_control); | 3540 | BT_DBG("chan %p, req_seq %d ctrl 0x%4.4x", chan, tx_seq, rx_control); |
3408 | 3541 | ||
3409 | pi->conn_state |= L2CAP_CONN_REMOTE_BUSY; | 3542 | chan->conn_state |= L2CAP_CONN_REMOTE_BUSY; |
3410 | pi->expected_ack_seq = tx_seq; | 3543 | chan->expected_ack_seq = tx_seq; |
3411 | l2cap_drop_acked_frames(sk); | 3544 | l2cap_drop_acked_frames(chan); |
3412 | 3545 | ||
3413 | if (rx_control & L2CAP_CTRL_POLL) | 3546 | if (rx_control & L2CAP_CTRL_POLL) |
3414 | pi->conn_state |= L2CAP_CONN_SEND_FBIT; | 3547 | chan->conn_state |= L2CAP_CONN_SEND_FBIT; |
3415 | 3548 | ||
3416 | if (!(pi->conn_state & L2CAP_CONN_SREJ_SENT)) { | 3549 | if (!(chan->conn_state & L2CAP_CONN_SREJ_SENT)) { |
3417 | del_timer(&pi->retrans_timer); | 3550 | del_timer(&chan->retrans_timer); |
3418 | if (rx_control & L2CAP_CTRL_POLL) | 3551 | if (rx_control & L2CAP_CTRL_POLL) |
3419 | l2cap_send_rr_or_rnr(pi, L2CAP_CTRL_FINAL); | 3552 | l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_FINAL); |
3420 | return; | 3553 | return; |
3421 | } | 3554 | } |
3422 | 3555 | ||
3423 | if (rx_control & L2CAP_CTRL_POLL) | 3556 | if (rx_control & L2CAP_CTRL_POLL) |
3424 | l2cap_send_srejtail(sk); | 3557 | l2cap_send_srejtail(chan); |
3425 | else | 3558 | else |
3426 | l2cap_send_sframe(pi, L2CAP_SUPER_RCV_READY); | 3559 | l2cap_send_sframe(chan, L2CAP_SUPER_RCV_READY); |
3427 | } | 3560 | } |
3428 | 3561 | ||
3429 | static inline int l2cap_data_channel_sframe(struct sock *sk, u16 rx_control, struct sk_buff *skb) | 3562 | static inline int l2cap_data_channel_sframe(struct l2cap_chan *chan, u16 rx_control, struct sk_buff *skb) |
3430 | { | 3563 | { |
3431 | BT_DBG("sk %p rx_control 0x%4.4x len %d", sk, rx_control, skb->len); | 3564 | BT_DBG("chan %p rx_control 0x%4.4x len %d", chan, rx_control, skb->len); |
3432 | 3565 | ||
3433 | if (L2CAP_CTRL_FINAL & rx_control && | 3566 | if (L2CAP_CTRL_FINAL & rx_control && |
3434 | l2cap_pi(sk)->conn_state & L2CAP_CONN_WAIT_F) { | 3567 | chan->conn_state & L2CAP_CONN_WAIT_F) { |
3435 | del_timer(&l2cap_pi(sk)->monitor_timer); | 3568 | del_timer(&chan->monitor_timer); |
3436 | if (l2cap_pi(sk)->unacked_frames > 0) | 3569 | if (chan->unacked_frames > 0) |
3437 | __mod_retrans_timer(); | 3570 | __mod_retrans_timer(); |
3438 | l2cap_pi(sk)->conn_state &= ~L2CAP_CONN_WAIT_F; | 3571 | chan->conn_state &= ~L2CAP_CONN_WAIT_F; |
3439 | } | 3572 | } |
3440 | 3573 | ||
3441 | switch (rx_control & L2CAP_CTRL_SUPERVISE) { | 3574 | switch (rx_control & L2CAP_CTRL_SUPERVISE) { |
3442 | case L2CAP_SUPER_RCV_READY: | 3575 | case L2CAP_SUPER_RCV_READY: |
3443 | l2cap_data_channel_rrframe(sk, rx_control); | 3576 | l2cap_data_channel_rrframe(chan, rx_control); |
3444 | break; | 3577 | break; |
3445 | 3578 | ||
3446 | case L2CAP_SUPER_REJECT: | 3579 | case L2CAP_SUPER_REJECT: |
3447 | l2cap_data_channel_rejframe(sk, rx_control); | 3580 | l2cap_data_channel_rejframe(chan, rx_control); |
3448 | break; | 3581 | break; |
3449 | 3582 | ||
3450 | case L2CAP_SUPER_SELECT_REJECT: | 3583 | case L2CAP_SUPER_SELECT_REJECT: |
3451 | l2cap_data_channel_srejframe(sk, rx_control); | 3584 | l2cap_data_channel_srejframe(chan, rx_control); |
3452 | break; | 3585 | break; |
3453 | 3586 | ||
3454 | case L2CAP_SUPER_RCV_NOT_READY: | 3587 | case L2CAP_SUPER_RCV_NOT_READY: |
3455 | l2cap_data_channel_rnrframe(sk, rx_control); | 3588 | l2cap_data_channel_rnrframe(chan, rx_control); |
3456 | break; | 3589 | break; |
3457 | } | 3590 | } |
3458 | 3591 | ||
@@ -3462,7 +3595,7 @@ static inline int l2cap_data_channel_sframe(struct sock *sk, u16 rx_control, str | |||
3462 | 3595 | ||
3463 | static int l2cap_ertm_data_rcv(struct sock *sk, struct sk_buff *skb) | 3596 | static int l2cap_ertm_data_rcv(struct sock *sk, struct sk_buff *skb) |
3464 | { | 3597 | { |
3465 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 3598 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; |
3466 | u16 control; | 3599 | u16 control; |
3467 | u8 req_seq; | 3600 | u8 req_seq; |
3468 | int len, next_tx_seq_offset, req_seq_offset; | 3601 | int len, next_tx_seq_offset, req_seq_offset; |
@@ -3476,51 +3609,51 @@ static int l2cap_ertm_data_rcv(struct sock *sk, struct sk_buff *skb) | |||
3476 | * Receiver will miss it and start proper recovery | 3609 | * Receiver will miss it and start proper recovery |
3477 | * procedures and ask retransmission. | 3610 | * procedures and ask retransmission. |
3478 | */ | 3611 | */ |
3479 | if (l2cap_check_fcs(pi, skb)) | 3612 | if (l2cap_check_fcs(chan, skb)) |
3480 | goto drop; | 3613 | goto drop; |
3481 | 3614 | ||
3482 | if (__is_sar_start(control) && __is_iframe(control)) | 3615 | if (__is_sar_start(control) && __is_iframe(control)) |
3483 | len -= 2; | 3616 | len -= 2; |
3484 | 3617 | ||
3485 | if (pi->fcs == L2CAP_FCS_CRC16) | 3618 | if (chan->fcs == L2CAP_FCS_CRC16) |
3486 | len -= 2; | 3619 | len -= 2; |
3487 | 3620 | ||
3488 | if (len > pi->mps) { | 3621 | if (len > chan->mps) { |
3489 | l2cap_send_disconn_req(pi->conn, sk, ECONNRESET); | 3622 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); |
3490 | goto drop; | 3623 | goto drop; |
3491 | } | 3624 | } |
3492 | 3625 | ||
3493 | req_seq = __get_reqseq(control); | 3626 | req_seq = __get_reqseq(control); |
3494 | req_seq_offset = (req_seq - pi->expected_ack_seq) % 64; | 3627 | req_seq_offset = (req_seq - chan->expected_ack_seq) % 64; |
3495 | if (req_seq_offset < 0) | 3628 | if (req_seq_offset < 0) |
3496 | req_seq_offset += 64; | 3629 | req_seq_offset += 64; |
3497 | 3630 | ||
3498 | next_tx_seq_offset = | 3631 | next_tx_seq_offset = |
3499 | (pi->next_tx_seq - pi->expected_ack_seq) % 64; | 3632 | (chan->next_tx_seq - chan->expected_ack_seq) % 64; |
3500 | if (next_tx_seq_offset < 0) | 3633 | if (next_tx_seq_offset < 0) |
3501 | next_tx_seq_offset += 64; | 3634 | next_tx_seq_offset += 64; |
3502 | 3635 | ||
3503 | /* check for invalid req-seq */ | 3636 | /* check for invalid req-seq */ |
3504 | if (req_seq_offset > next_tx_seq_offset) { | 3637 | if (req_seq_offset > next_tx_seq_offset) { |
3505 | l2cap_send_disconn_req(pi->conn, sk, ECONNRESET); | 3638 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); |
3506 | goto drop; | 3639 | goto drop; |
3507 | } | 3640 | } |
3508 | 3641 | ||
3509 | if (__is_iframe(control)) { | 3642 | if (__is_iframe(control)) { |
3510 | if (len < 0) { | 3643 | if (len < 0) { |
3511 | l2cap_send_disconn_req(pi->conn, sk, ECONNRESET); | 3644 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); |
3512 | goto drop; | 3645 | goto drop; |
3513 | } | 3646 | } |
3514 | 3647 | ||
3515 | l2cap_data_channel_iframe(sk, control, skb); | 3648 | l2cap_data_channel_iframe(chan, control, skb); |
3516 | } else { | 3649 | } else { |
3517 | if (len != 0) { | 3650 | if (len != 0) { |
3518 | BT_ERR("%d", len); | 3651 | BT_ERR("%d", len); |
3519 | l2cap_send_disconn_req(pi->conn, sk, ECONNRESET); | 3652 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); |
3520 | goto drop; | 3653 | goto drop; |
3521 | } | 3654 | } |
3522 | 3655 | ||
3523 | l2cap_data_channel_sframe(sk, control, skb); | 3656 | l2cap_data_channel_sframe(chan, control, skb); |
3524 | } | 3657 | } |
3525 | 3658 | ||
3526 | return 0; | 3659 | return 0; |
@@ -3532,33 +3665,35 @@ drop: | |||
3532 | 3665 | ||
3533 | static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk_buff *skb) | 3666 | static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk_buff *skb) |
3534 | { | 3667 | { |
3535 | struct sock *sk; | 3668 | struct l2cap_chan *chan; |
3669 | struct sock *sk = NULL; | ||
3536 | struct l2cap_pinfo *pi; | 3670 | struct l2cap_pinfo *pi; |
3537 | u16 control; | 3671 | u16 control; |
3538 | u8 tx_seq; | 3672 | u8 tx_seq; |
3539 | int len; | 3673 | int len; |
3540 | 3674 | ||
3541 | sk = l2cap_get_chan_by_scid(&conn->chan_list, cid); | 3675 | chan = l2cap_get_chan_by_scid(conn, cid); |
3542 | if (!sk) { | 3676 | if (!chan) { |
3543 | BT_DBG("unknown cid 0x%4.4x", cid); | 3677 | BT_DBG("unknown cid 0x%4.4x", cid); |
3544 | goto drop; | 3678 | goto drop; |
3545 | } | 3679 | } |
3546 | 3680 | ||
3681 | sk = chan->sk; | ||
3547 | pi = l2cap_pi(sk); | 3682 | pi = l2cap_pi(sk); |
3548 | 3683 | ||
3549 | BT_DBG("sk %p, len %d", sk, skb->len); | 3684 | BT_DBG("chan %p, len %d", chan, skb->len); |
3550 | 3685 | ||
3551 | if (sk->sk_state != BT_CONNECTED) | 3686 | if (sk->sk_state != BT_CONNECTED) |
3552 | goto drop; | 3687 | goto drop; |
3553 | 3688 | ||
3554 | switch (pi->mode) { | 3689 | switch (chan->mode) { |
3555 | case L2CAP_MODE_BASIC: | 3690 | case L2CAP_MODE_BASIC: |
3556 | /* If socket recv buffers overflows we drop data here | 3691 | /* If socket recv buffers overflows we drop data here |
3557 | * which is *bad* because L2CAP has to be reliable. | 3692 | * which is *bad* because L2CAP has to be reliable. |
3558 | * But we don't have any other choice. L2CAP doesn't | 3693 | * But we don't have any other choice. L2CAP doesn't |
3559 | * provide flow control mechanism. */ | 3694 | * provide flow control mechanism. */ |
3560 | 3695 | ||
3561 | if (pi->imtu < skb->len) | 3696 | if (chan->imtu < skb->len) |
3562 | goto drop; | 3697 | goto drop; |
3563 | 3698 | ||
3564 | if (!sock_queue_rcv_skb(sk, skb)) | 3699 | if (!sock_queue_rcv_skb(sk, skb)) |
@@ -3580,31 +3715,31 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk | |||
3580 | skb_pull(skb, 2); | 3715 | skb_pull(skb, 2); |
3581 | len = skb->len; | 3716 | len = skb->len; |
3582 | 3717 | ||
3583 | if (l2cap_check_fcs(pi, skb)) | 3718 | if (l2cap_check_fcs(chan, skb)) |
3584 | goto drop; | 3719 | goto drop; |
3585 | 3720 | ||
3586 | if (__is_sar_start(control)) | 3721 | if (__is_sar_start(control)) |
3587 | len -= 2; | 3722 | len -= 2; |
3588 | 3723 | ||
3589 | if (pi->fcs == L2CAP_FCS_CRC16) | 3724 | if (chan->fcs == L2CAP_FCS_CRC16) |
3590 | len -= 2; | 3725 | len -= 2; |
3591 | 3726 | ||
3592 | if (len > pi->mps || len < 0 || __is_sframe(control)) | 3727 | if (len > chan->mps || len < 0 || __is_sframe(control)) |
3593 | goto drop; | 3728 | goto drop; |
3594 | 3729 | ||
3595 | tx_seq = __get_txseq(control); | 3730 | tx_seq = __get_txseq(control); |
3596 | 3731 | ||
3597 | if (pi->expected_tx_seq == tx_seq) | 3732 | if (chan->expected_tx_seq == tx_seq) |
3598 | pi->expected_tx_seq = (pi->expected_tx_seq + 1) % 64; | 3733 | chan->expected_tx_seq = (chan->expected_tx_seq + 1) % 64; |
3599 | else | 3734 | else |
3600 | pi->expected_tx_seq = (tx_seq + 1) % 64; | 3735 | chan->expected_tx_seq = (tx_seq + 1) % 64; |
3601 | 3736 | ||
3602 | l2cap_streaming_reassembly_sdu(sk, skb, control); | 3737 | l2cap_streaming_reassembly_sdu(chan, skb, control); |
3603 | 3738 | ||
3604 | goto done; | 3739 | goto done; |
3605 | 3740 | ||
3606 | default: | 3741 | default: |
3607 | BT_DBG("sk %p: bad mode 0x%2.2x", sk, pi->mode); | 3742 | BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode); |
3608 | break; | 3743 | break; |
3609 | } | 3744 | } |
3610 | 3745 | ||
@@ -3620,12 +3755,48 @@ done: | |||
3620 | 3755 | ||
3621 | static inline int l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm, struct sk_buff *skb) | 3756 | static inline int l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm, struct sk_buff *skb) |
3622 | { | 3757 | { |
3623 | struct sock *sk; | 3758 | struct sock *sk = NULL; |
3759 | struct l2cap_chan *chan; | ||
3624 | 3760 | ||
3625 | sk = l2cap_get_sock_by_psm(0, psm, conn->src); | 3761 | chan = l2cap_global_chan_by_psm(0, psm, conn->src); |
3626 | if (!sk) | 3762 | if (!chan) |
3763 | goto drop; | ||
3764 | |||
3765 | sk = chan->sk; | ||
3766 | |||
3767 | bh_lock_sock(sk); | ||
3768 | |||
3769 | BT_DBG("sk %p, len %d", sk, skb->len); | ||
3770 | |||
3771 | if (sk->sk_state != BT_BOUND && sk->sk_state != BT_CONNECTED) | ||
3772 | goto drop; | ||
3773 | |||
3774 | if (l2cap_pi(sk)->chan->imtu < skb->len) | ||
3775 | goto drop; | ||
3776 | |||
3777 | if (!sock_queue_rcv_skb(sk, skb)) | ||
3778 | goto done; | ||
3779 | |||
3780 | drop: | ||
3781 | kfree_skb(skb); | ||
3782 | |||
3783 | done: | ||
3784 | if (sk) | ||
3785 | bh_unlock_sock(sk); | ||
3786 | return 0; | ||
3787 | } | ||
3788 | |||
3789 | static inline int l2cap_att_channel(struct l2cap_conn *conn, __le16 cid, struct sk_buff *skb) | ||
3790 | { | ||
3791 | struct sock *sk = NULL; | ||
3792 | struct l2cap_chan *chan; | ||
3793 | |||
3794 | chan = l2cap_global_chan_by_scid(0, cid, conn->src); | ||
3795 | if (!chan) | ||
3627 | goto drop; | 3796 | goto drop; |
3628 | 3797 | ||
3798 | sk = chan->sk; | ||
3799 | |||
3629 | bh_lock_sock(sk); | 3800 | bh_lock_sock(sk); |
3630 | 3801 | ||
3631 | BT_DBG("sk %p, len %d", sk, skb->len); | 3802 | BT_DBG("sk %p, len %d", sk, skb->len); |
@@ -3633,7 +3804,7 @@ static inline int l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm, str | |||
3633 | if (sk->sk_state != BT_BOUND && sk->sk_state != BT_CONNECTED) | 3804 | if (sk->sk_state != BT_BOUND && sk->sk_state != BT_CONNECTED) |
3634 | goto drop; | 3805 | goto drop; |
3635 | 3806 | ||
3636 | if (l2cap_pi(sk)->imtu < skb->len) | 3807 | if (l2cap_pi(sk)->chan->imtu < skb->len) |
3637 | goto drop; | 3808 | goto drop; |
3638 | 3809 | ||
3639 | if (!sock_queue_rcv_skb(sk, skb)) | 3810 | if (!sock_queue_rcv_skb(sk, skb)) |
@@ -3677,6 +3848,10 @@ static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb) | |||
3677 | l2cap_conless_channel(conn, psm, skb); | 3848 | l2cap_conless_channel(conn, psm, skb); |
3678 | break; | 3849 | break; |
3679 | 3850 | ||
3851 | case L2CAP_CID_LE_DATA: | ||
3852 | l2cap_att_channel(conn, cid, skb); | ||
3853 | break; | ||
3854 | |||
3680 | default: | 3855 | default: |
3681 | l2cap_data_channel(conn, cid, skb); | 3856 | l2cap_data_channel(conn, cid, skb); |
3682 | break; | 3857 | break; |
@@ -3688,8 +3863,7 @@ static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb) | |||
3688 | static int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type) | 3863 | static int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type) |
3689 | { | 3864 | { |
3690 | int exact = 0, lm1 = 0, lm2 = 0; | 3865 | int exact = 0, lm1 = 0, lm2 = 0; |
3691 | register struct sock *sk; | 3866 | struct l2cap_chan *c; |
3692 | struct hlist_node *node; | ||
3693 | 3867 | ||
3694 | if (type != ACL_LINK) | 3868 | if (type != ACL_LINK) |
3695 | return -EINVAL; | 3869 | return -EINVAL; |
@@ -3697,23 +3871,25 @@ static int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type) | |||
3697 | BT_DBG("hdev %s, bdaddr %s", hdev->name, batostr(bdaddr)); | 3871 | BT_DBG("hdev %s, bdaddr %s", hdev->name, batostr(bdaddr)); |
3698 | 3872 | ||
3699 | /* Find listening sockets and check their link_mode */ | 3873 | /* Find listening sockets and check their link_mode */ |
3700 | read_lock(&l2cap_sk_list.lock); | 3874 | read_lock(&chan_list_lock); |
3701 | sk_for_each(sk, node, &l2cap_sk_list.head) { | 3875 | list_for_each_entry(c, &chan_list, global_l) { |
3876 | struct sock *sk = c->sk; | ||
3877 | |||
3702 | if (sk->sk_state != BT_LISTEN) | 3878 | if (sk->sk_state != BT_LISTEN) |
3703 | continue; | 3879 | continue; |
3704 | 3880 | ||
3705 | if (!bacmp(&bt_sk(sk)->src, &hdev->bdaddr)) { | 3881 | if (!bacmp(&bt_sk(sk)->src, &hdev->bdaddr)) { |
3706 | lm1 |= HCI_LM_ACCEPT; | 3882 | lm1 |= HCI_LM_ACCEPT; |
3707 | if (l2cap_pi(sk)->role_switch) | 3883 | if (c->role_switch) |
3708 | lm1 |= HCI_LM_MASTER; | 3884 | lm1 |= HCI_LM_MASTER; |
3709 | exact++; | 3885 | exact++; |
3710 | } else if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY)) { | 3886 | } else if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY)) { |
3711 | lm2 |= HCI_LM_ACCEPT; | 3887 | lm2 |= HCI_LM_ACCEPT; |
3712 | if (l2cap_pi(sk)->role_switch) | 3888 | if (c->role_switch) |
3713 | lm2 |= HCI_LM_MASTER; | 3889 | lm2 |= HCI_LM_MASTER; |
3714 | } | 3890 | } |
3715 | } | 3891 | } |
3716 | read_unlock(&l2cap_sk_list.lock); | 3892 | read_unlock(&chan_list_lock); |
3717 | 3893 | ||
3718 | return exact ? lm1 : lm2; | 3894 | return exact ? lm1 : lm2; |
3719 | } | 3895 | } |
@@ -3761,49 +3937,50 @@ static int l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason) | |||
3761 | return 0; | 3937 | return 0; |
3762 | } | 3938 | } |
3763 | 3939 | ||
3764 | static inline void l2cap_check_encryption(struct sock *sk, u8 encrypt) | 3940 | static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt) |
3765 | { | 3941 | { |
3942 | struct sock *sk = chan->sk; | ||
3943 | |||
3766 | if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) | 3944 | if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) |
3767 | return; | 3945 | return; |
3768 | 3946 | ||
3769 | if (encrypt == 0x00) { | 3947 | if (encrypt == 0x00) { |
3770 | if (l2cap_pi(sk)->sec_level == BT_SECURITY_MEDIUM) { | 3948 | if (chan->sec_level == BT_SECURITY_MEDIUM) { |
3771 | l2cap_sock_clear_timer(sk); | 3949 | l2cap_sock_clear_timer(sk); |
3772 | l2cap_sock_set_timer(sk, HZ * 5); | 3950 | l2cap_sock_set_timer(sk, HZ * 5); |
3773 | } else if (l2cap_pi(sk)->sec_level == BT_SECURITY_HIGH) | 3951 | } else if (chan->sec_level == BT_SECURITY_HIGH) |
3774 | __l2cap_sock_close(sk, ECONNREFUSED); | 3952 | __l2cap_sock_close(sk, ECONNREFUSED); |
3775 | } else { | 3953 | } else { |
3776 | if (l2cap_pi(sk)->sec_level == BT_SECURITY_MEDIUM) | 3954 | if (chan->sec_level == BT_SECURITY_MEDIUM) |
3777 | l2cap_sock_clear_timer(sk); | 3955 | l2cap_sock_clear_timer(sk); |
3778 | } | 3956 | } |
3779 | } | 3957 | } |
3780 | 3958 | ||
3781 | static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | 3959 | static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) |
3782 | { | 3960 | { |
3783 | struct l2cap_chan_list *l; | ||
3784 | struct l2cap_conn *conn = hcon->l2cap_data; | 3961 | struct l2cap_conn *conn = hcon->l2cap_data; |
3785 | struct sock *sk; | 3962 | struct l2cap_chan *chan; |
3786 | 3963 | ||
3787 | if (!conn) | 3964 | if (!conn) |
3788 | return 0; | 3965 | return 0; |
3789 | 3966 | ||
3790 | l = &conn->chan_list; | ||
3791 | |||
3792 | BT_DBG("conn %p", conn); | 3967 | BT_DBG("conn %p", conn); |
3793 | 3968 | ||
3794 | read_lock(&l->lock); | 3969 | read_lock(&conn->chan_lock); |
3970 | |||
3971 | list_for_each_entry(chan, &conn->chan_l, list) { | ||
3972 | struct sock *sk = chan->sk; | ||
3795 | 3973 | ||
3796 | for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) { | ||
3797 | bh_lock_sock(sk); | 3974 | bh_lock_sock(sk); |
3798 | 3975 | ||
3799 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_CONNECT_PEND) { | 3976 | if (chan->conf_state & L2CAP_CONF_CONNECT_PEND) { |
3800 | bh_unlock_sock(sk); | 3977 | bh_unlock_sock(sk); |
3801 | continue; | 3978 | continue; |
3802 | } | 3979 | } |
3803 | 3980 | ||
3804 | if (!status && (sk->sk_state == BT_CONNECTED || | 3981 | if (!status && (sk->sk_state == BT_CONNECTED || |
3805 | sk->sk_state == BT_CONFIG)) { | 3982 | sk->sk_state == BT_CONFIG)) { |
3806 | l2cap_check_encryption(sk, encrypt); | 3983 | l2cap_check_encryption(chan, encrypt); |
3807 | bh_unlock_sock(sk); | 3984 | bh_unlock_sock(sk); |
3808 | continue; | 3985 | continue; |
3809 | } | 3986 | } |
@@ -3811,13 +3988,13 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | |||
3811 | if (sk->sk_state == BT_CONNECT) { | 3988 | if (sk->sk_state == BT_CONNECT) { |
3812 | if (!status) { | 3989 | if (!status) { |
3813 | struct l2cap_conn_req req; | 3990 | struct l2cap_conn_req req; |
3814 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | 3991 | req.scid = cpu_to_le16(chan->scid); |
3815 | req.psm = l2cap_pi(sk)->psm; | 3992 | req.psm = chan->psm; |
3816 | 3993 | ||
3817 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); | 3994 | chan->ident = l2cap_get_ident(conn); |
3818 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND; | 3995 | chan->conf_state |= L2CAP_CONF_CONNECT_PEND; |
3819 | 3996 | ||
3820 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, | 3997 | l2cap_send_cmd(conn, chan->ident, |
3821 | L2CAP_CONN_REQ, sizeof(req), &req); | 3998 | L2CAP_CONN_REQ, sizeof(req), &req); |
3822 | } else { | 3999 | } else { |
3823 | l2cap_sock_clear_timer(sk); | 4000 | l2cap_sock_clear_timer(sk); |
@@ -3836,18 +4013,18 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | |||
3836 | result = L2CAP_CR_SEC_BLOCK; | 4013 | result = L2CAP_CR_SEC_BLOCK; |
3837 | } | 4014 | } |
3838 | 4015 | ||
3839 | rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid); | 4016 | rsp.scid = cpu_to_le16(chan->dcid); |
3840 | rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid); | 4017 | rsp.dcid = cpu_to_le16(chan->scid); |
3841 | rsp.result = cpu_to_le16(result); | 4018 | rsp.result = cpu_to_le16(result); |
3842 | rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); | 4019 | rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); |
3843 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, | 4020 | l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, |
3844 | L2CAP_CONN_RSP, sizeof(rsp), &rsp); | 4021 | sizeof(rsp), &rsp); |
3845 | } | 4022 | } |
3846 | 4023 | ||
3847 | bh_unlock_sock(sk); | 4024 | bh_unlock_sock(sk); |
3848 | } | 4025 | } |
3849 | 4026 | ||
3850 | read_unlock(&l->lock); | 4027 | read_unlock(&conn->chan_lock); |
3851 | 4028 | ||
3852 | return 0; | 4029 | return 0; |
3853 | } | 4030 | } |
@@ -3866,7 +4043,7 @@ static int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 fl | |||
3866 | 4043 | ||
3867 | if (!(flags & ACL_CONT)) { | 4044 | if (!(flags & ACL_CONT)) { |
3868 | struct l2cap_hdr *hdr; | 4045 | struct l2cap_hdr *hdr; |
3869 | struct sock *sk; | 4046 | struct l2cap_chan *chan; |
3870 | u16 cid; | 4047 | u16 cid; |
3871 | int len; | 4048 | int len; |
3872 | 4049 | ||
@@ -3904,18 +4081,21 @@ static int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 fl | |||
3904 | goto drop; | 4081 | goto drop; |
3905 | } | 4082 | } |
3906 | 4083 | ||
3907 | sk = l2cap_get_chan_by_scid(&conn->chan_list, cid); | 4084 | chan = l2cap_get_chan_by_scid(conn, cid); |
3908 | 4085 | ||
3909 | if (sk && l2cap_pi(sk)->imtu < len - L2CAP_HDR_SIZE) { | 4086 | if (chan && chan->sk) { |
3910 | BT_ERR("Frame exceeding recv MTU (len %d, MTU %d)", | 4087 | struct sock *sk = chan->sk; |
3911 | len, l2cap_pi(sk)->imtu); | ||
3912 | bh_unlock_sock(sk); | ||
3913 | l2cap_conn_unreliable(conn, ECOMM); | ||
3914 | goto drop; | ||
3915 | } | ||
3916 | 4088 | ||
3917 | if (sk) | 4089 | if (chan->imtu < len - L2CAP_HDR_SIZE) { |
4090 | BT_ERR("Frame exceeding recv MTU (len %d, " | ||
4091 | "MTU %d)", len, | ||
4092 | chan->imtu); | ||
4093 | bh_unlock_sock(sk); | ||
4094 | l2cap_conn_unreliable(conn, ECOMM); | ||
4095 | goto drop; | ||
4096 | } | ||
3918 | bh_unlock_sock(sk); | 4097 | bh_unlock_sock(sk); |
4098 | } | ||
3919 | 4099 | ||
3920 | /* Allocate skb for the complete frame (with header) */ | 4100 | /* Allocate skb for the complete frame (with header) */ |
3921 | conn->rx_skb = bt_skb_alloc(len, GFP_ATOMIC); | 4101 | conn->rx_skb = bt_skb_alloc(len, GFP_ATOMIC); |
@@ -3962,24 +4142,22 @@ drop: | |||
3962 | 4142 | ||
3963 | static int l2cap_debugfs_show(struct seq_file *f, void *p) | 4143 | static int l2cap_debugfs_show(struct seq_file *f, void *p) |
3964 | { | 4144 | { |
3965 | struct sock *sk; | 4145 | struct l2cap_chan *c; |
3966 | struct hlist_node *node; | ||
3967 | 4146 | ||
3968 | read_lock_bh(&l2cap_sk_list.lock); | 4147 | read_lock_bh(&chan_list_lock); |
3969 | 4148 | ||
3970 | sk_for_each(sk, node, &l2cap_sk_list.head) { | 4149 | list_for_each_entry(c, &chan_list, global_l) { |
3971 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 4150 | struct sock *sk = c->sk; |
3972 | 4151 | ||
3973 | seq_printf(f, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n", | 4152 | seq_printf(f, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n", |
3974 | batostr(&bt_sk(sk)->src), | 4153 | batostr(&bt_sk(sk)->src), |
3975 | batostr(&bt_sk(sk)->dst), | 4154 | batostr(&bt_sk(sk)->dst), |
3976 | sk->sk_state, __le16_to_cpu(pi->psm), | 4155 | sk->sk_state, __le16_to_cpu(c->psm), |
3977 | pi->scid, pi->dcid, | 4156 | c->scid, c->dcid, c->imtu, c->omtu, |
3978 | pi->imtu, pi->omtu, pi->sec_level, | 4157 | c->sec_level, c->mode); |
3979 | pi->mode); | ||
3980 | } | 4158 | } |
3981 | 4159 | ||
3982 | read_unlock_bh(&l2cap_sk_list.lock); | 4160 | read_unlock_bh(&chan_list_lock); |
3983 | 4161 | ||
3984 | return 0; | 4162 | return 0; |
3985 | } | 4163 | } |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 299fe56a9668..18dc9888d8c2 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
@@ -30,6 +30,8 @@ | |||
30 | #include <net/bluetooth/hci_core.h> | 30 | #include <net/bluetooth/hci_core.h> |
31 | #include <net/bluetooth/l2cap.h> | 31 | #include <net/bluetooth/l2cap.h> |
32 | 32 | ||
33 | static const struct proto_ops l2cap_sock_ops; | ||
34 | |||
33 | /* ---- L2CAP timers ---- */ | 35 | /* ---- L2CAP timers ---- */ |
34 | static void l2cap_sock_timeout(unsigned long arg) | 36 | static void l2cap_sock_timeout(unsigned long arg) |
35 | { | 37 | { |
@@ -51,7 +53,7 @@ static void l2cap_sock_timeout(unsigned long arg) | |||
51 | if (sk->sk_state == BT_CONNECTED || sk->sk_state == BT_CONFIG) | 53 | if (sk->sk_state == BT_CONNECTED || sk->sk_state == BT_CONFIG) |
52 | reason = ECONNREFUSED; | 54 | reason = ECONNREFUSED; |
53 | else if (sk->sk_state == BT_CONNECT && | 55 | else if (sk->sk_state == BT_CONNECT && |
54 | l2cap_pi(sk)->sec_level != BT_SECURITY_SDP) | 56 | l2cap_pi(sk)->chan->sec_level != BT_SECURITY_SDP) |
55 | reason = ECONNREFUSED; | 57 | reason = ECONNREFUSED; |
56 | else | 58 | else |
57 | reason = ETIMEDOUT; | 59 | reason = ETIMEDOUT; |
@@ -76,21 +78,10 @@ void l2cap_sock_clear_timer(struct sock *sk) | |||
76 | sk_stop_timer(sk, &sk->sk_timer); | 78 | sk_stop_timer(sk, &sk->sk_timer); |
77 | } | 79 | } |
78 | 80 | ||
79 | static struct sock *__l2cap_get_sock_by_addr(__le16 psm, bdaddr_t *src) | ||
80 | { | ||
81 | struct sock *sk; | ||
82 | struct hlist_node *node; | ||
83 | sk_for_each(sk, node, &l2cap_sk_list.head) | ||
84 | if (l2cap_pi(sk)->sport == psm && !bacmp(&bt_sk(sk)->src, src)) | ||
85 | goto found; | ||
86 | sk = NULL; | ||
87 | found: | ||
88 | return sk; | ||
89 | } | ||
90 | |||
91 | static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) | 81 | static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) |
92 | { | 82 | { |
93 | struct sock *sk = sock->sk; | 83 | struct sock *sk = sock->sk; |
84 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | ||
94 | struct sockaddr_l2 la; | 85 | struct sockaddr_l2 la; |
95 | int len, err = 0; | 86 | int len, err = 0; |
96 | 87 | ||
@@ -129,26 +120,20 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) | |||
129 | } | 120 | } |
130 | } | 121 | } |
131 | 122 | ||
132 | write_lock_bh(&l2cap_sk_list.lock); | 123 | if (la.l2_cid) |
124 | err = l2cap_add_scid(chan, la.l2_cid); | ||
125 | else | ||
126 | err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm); | ||
133 | 127 | ||
134 | if (la.l2_psm && __l2cap_get_sock_by_addr(la.l2_psm, &la.l2_bdaddr)) { | 128 | if (err < 0) |
135 | err = -EADDRINUSE; | 129 | goto done; |
136 | } else { | ||
137 | /* Save source address */ | ||
138 | bacpy(&bt_sk(sk)->src, &la.l2_bdaddr); | ||
139 | l2cap_pi(sk)->psm = la.l2_psm; | ||
140 | l2cap_pi(sk)->sport = la.l2_psm; | ||
141 | sk->sk_state = BT_BOUND; | ||
142 | |||
143 | if (__le16_to_cpu(la.l2_psm) == 0x0001 || | ||
144 | __le16_to_cpu(la.l2_psm) == 0x0003) | ||
145 | l2cap_pi(sk)->sec_level = BT_SECURITY_SDP; | ||
146 | } | ||
147 | 130 | ||
148 | if (la.l2_cid) | 131 | if (__le16_to_cpu(la.l2_psm) == 0x0001 || |
149 | l2cap_pi(sk)->scid = la.l2_cid; | 132 | __le16_to_cpu(la.l2_psm) == 0x0003) |
133 | chan->sec_level = BT_SECURITY_SDP; | ||
150 | 134 | ||
151 | write_unlock_bh(&l2cap_sk_list.lock); | 135 | bacpy(&bt_sk(sk)->src, &la.l2_bdaddr); |
136 | sk->sk_state = BT_BOUND; | ||
152 | 137 | ||
153 | done: | 138 | done: |
154 | release_sock(sk); | 139 | release_sock(sk); |
@@ -158,6 +143,7 @@ done: | |||
158 | static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags) | 143 | static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags) |
159 | { | 144 | { |
160 | struct sock *sk = sock->sk; | 145 | struct sock *sk = sock->sk; |
146 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | ||
161 | struct sockaddr_l2 la; | 147 | struct sockaddr_l2 la; |
162 | int len, err = 0; | 148 | int len, err = 0; |
163 | 149 | ||
@@ -182,7 +168,7 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al | |||
182 | goto done; | 168 | goto done; |
183 | } | 169 | } |
184 | 170 | ||
185 | switch (l2cap_pi(sk)->mode) { | 171 | switch (chan->mode) { |
186 | case L2CAP_MODE_BASIC: | 172 | case L2CAP_MODE_BASIC: |
187 | break; | 173 | break; |
188 | case L2CAP_MODE_ERTM: | 174 | case L2CAP_MODE_ERTM: |
@@ -226,10 +212,10 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al | |||
226 | 212 | ||
227 | /* Set destination address and psm */ | 213 | /* Set destination address and psm */ |
228 | bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr); | 214 | bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr); |
229 | l2cap_pi(sk)->psm = la.l2_psm; | 215 | chan->psm = la.l2_psm; |
230 | l2cap_pi(sk)->dcid = la.l2_cid; | 216 | chan->dcid = la.l2_cid; |
231 | 217 | ||
232 | err = l2cap_do_connect(sk); | 218 | err = l2cap_chan_connect(l2cap_pi(sk)->chan); |
233 | if (err) | 219 | if (err) |
234 | goto done; | 220 | goto done; |
235 | 221 | ||
@@ -244,6 +230,7 @@ done: | |||
244 | static int l2cap_sock_listen(struct socket *sock, int backlog) | 230 | static int l2cap_sock_listen(struct socket *sock, int backlog) |
245 | { | 231 | { |
246 | struct sock *sk = sock->sk; | 232 | struct sock *sk = sock->sk; |
233 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | ||
247 | int err = 0; | 234 | int err = 0; |
248 | 235 | ||
249 | BT_DBG("sk %p backlog %d", sk, backlog); | 236 | BT_DBG("sk %p backlog %d", sk, backlog); |
@@ -256,7 +243,7 @@ static int l2cap_sock_listen(struct socket *sock, int backlog) | |||
256 | goto done; | 243 | goto done; |
257 | } | 244 | } |
258 | 245 | ||
259 | switch (l2cap_pi(sk)->mode) { | 246 | switch (chan->mode) { |
260 | case L2CAP_MODE_BASIC: | 247 | case L2CAP_MODE_BASIC: |
261 | break; | 248 | break; |
262 | case L2CAP_MODE_ERTM: | 249 | case L2CAP_MODE_ERTM: |
@@ -269,28 +256,6 @@ static int l2cap_sock_listen(struct socket *sock, int backlog) | |||
269 | goto done; | 256 | goto done; |
270 | } | 257 | } |
271 | 258 | ||
272 | if (!l2cap_pi(sk)->psm && !l2cap_pi(sk)->dcid) { | ||
273 | bdaddr_t *src = &bt_sk(sk)->src; | ||
274 | u16 psm; | ||
275 | |||
276 | err = -EINVAL; | ||
277 | |||
278 | write_lock_bh(&l2cap_sk_list.lock); | ||
279 | |||
280 | for (psm = 0x1001; psm < 0x1100; psm += 2) | ||
281 | if (!__l2cap_get_sock_by_addr(cpu_to_le16(psm), src)) { | ||
282 | l2cap_pi(sk)->psm = cpu_to_le16(psm); | ||
283 | l2cap_pi(sk)->sport = cpu_to_le16(psm); | ||
284 | err = 0; | ||
285 | break; | ||
286 | } | ||
287 | |||
288 | write_unlock_bh(&l2cap_sk_list.lock); | ||
289 | |||
290 | if (err < 0) | ||
291 | goto done; | ||
292 | } | ||
293 | |||
294 | sk->sk_max_ack_backlog = backlog; | 259 | sk->sk_max_ack_backlog = backlog; |
295 | sk->sk_ack_backlog = 0; | 260 | sk->sk_ack_backlog = 0; |
296 | sk->sk_state = BT_LISTEN; | 261 | sk->sk_state = BT_LISTEN; |
@@ -360,6 +325,7 @@ static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *l | |||
360 | { | 325 | { |
361 | struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr; | 326 | struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr; |
362 | struct sock *sk = sock->sk; | 327 | struct sock *sk = sock->sk; |
328 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | ||
363 | 329 | ||
364 | BT_DBG("sock %p, sk %p", sock, sk); | 330 | BT_DBG("sock %p, sk %p", sock, sk); |
365 | 331 | ||
@@ -367,13 +333,13 @@ static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *l | |||
367 | *len = sizeof(struct sockaddr_l2); | 333 | *len = sizeof(struct sockaddr_l2); |
368 | 334 | ||
369 | if (peer) { | 335 | if (peer) { |
370 | la->l2_psm = l2cap_pi(sk)->psm; | 336 | la->l2_psm = chan->psm; |
371 | bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst); | 337 | bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst); |
372 | la->l2_cid = cpu_to_le16(l2cap_pi(sk)->dcid); | 338 | la->l2_cid = cpu_to_le16(chan->dcid); |
373 | } else { | 339 | } else { |
374 | la->l2_psm = l2cap_pi(sk)->sport; | 340 | la->l2_psm = chan->sport; |
375 | bacpy(&la->l2_bdaddr, &bt_sk(sk)->src); | 341 | bacpy(&la->l2_bdaddr, &bt_sk(sk)->src); |
376 | la->l2_cid = cpu_to_le16(l2cap_pi(sk)->scid); | 342 | la->l2_cid = cpu_to_le16(chan->scid); |
377 | } | 343 | } |
378 | 344 | ||
379 | return 0; | 345 | return 0; |
@@ -382,6 +348,7 @@ static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *l | |||
382 | static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen) | 348 | static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen) |
383 | { | 349 | { |
384 | struct sock *sk = sock->sk; | 350 | struct sock *sk = sock->sk; |
351 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | ||
385 | struct l2cap_options opts; | 352 | struct l2cap_options opts; |
386 | struct l2cap_conninfo cinfo; | 353 | struct l2cap_conninfo cinfo; |
387 | int len, err = 0; | 354 | int len, err = 0; |
@@ -397,13 +364,13 @@ static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __us | |||
397 | switch (optname) { | 364 | switch (optname) { |
398 | case L2CAP_OPTIONS: | 365 | case L2CAP_OPTIONS: |
399 | memset(&opts, 0, sizeof(opts)); | 366 | memset(&opts, 0, sizeof(opts)); |
400 | opts.imtu = l2cap_pi(sk)->imtu; | 367 | opts.imtu = chan->imtu; |
401 | opts.omtu = l2cap_pi(sk)->omtu; | 368 | opts.omtu = chan->omtu; |
402 | opts.flush_to = l2cap_pi(sk)->flush_to; | 369 | opts.flush_to = chan->flush_to; |
403 | opts.mode = l2cap_pi(sk)->mode; | 370 | opts.mode = chan->mode; |
404 | opts.fcs = l2cap_pi(sk)->fcs; | 371 | opts.fcs = chan->fcs; |
405 | opts.max_tx = l2cap_pi(sk)->max_tx; | 372 | opts.max_tx = chan->max_tx; |
406 | opts.txwin_size = (__u16)l2cap_pi(sk)->tx_win; | 373 | opts.txwin_size = (__u16)chan->tx_win; |
407 | 374 | ||
408 | len = min_t(unsigned int, len, sizeof(opts)); | 375 | len = min_t(unsigned int, len, sizeof(opts)); |
409 | if (copy_to_user(optval, (char *) &opts, len)) | 376 | if (copy_to_user(optval, (char *) &opts, len)) |
@@ -412,7 +379,7 @@ static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __us | |||
412 | break; | 379 | break; |
413 | 380 | ||
414 | case L2CAP_LM: | 381 | case L2CAP_LM: |
415 | switch (l2cap_pi(sk)->sec_level) { | 382 | switch (chan->sec_level) { |
416 | case BT_SECURITY_LOW: | 383 | case BT_SECURITY_LOW: |
417 | opt = L2CAP_LM_AUTH; | 384 | opt = L2CAP_LM_AUTH; |
418 | break; | 385 | break; |
@@ -428,10 +395,10 @@ static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __us | |||
428 | break; | 395 | break; |
429 | } | 396 | } |
430 | 397 | ||
431 | if (l2cap_pi(sk)->role_switch) | 398 | if (chan->role_switch) |
432 | opt |= L2CAP_LM_MASTER; | 399 | opt |= L2CAP_LM_MASTER; |
433 | 400 | ||
434 | if (l2cap_pi(sk)->force_reliable) | 401 | if (chan->force_reliable) |
435 | opt |= L2CAP_LM_RELIABLE; | 402 | opt |= L2CAP_LM_RELIABLE; |
436 | 403 | ||
437 | if (put_user(opt, (u32 __user *) optval)) | 404 | if (put_user(opt, (u32 __user *) optval)) |
@@ -446,8 +413,8 @@ static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __us | |||
446 | break; | 413 | break; |
447 | } | 414 | } |
448 | 415 | ||
449 | cinfo.hci_handle = l2cap_pi(sk)->conn->hcon->handle; | 416 | cinfo.hci_handle = chan->conn->hcon->handle; |
450 | memcpy(cinfo.dev_class, l2cap_pi(sk)->conn->hcon->dev_class, 3); | 417 | memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3); |
451 | 418 | ||
452 | len = min_t(unsigned int, len, sizeof(cinfo)); | 419 | len = min_t(unsigned int, len, sizeof(cinfo)); |
453 | if (copy_to_user(optval, (char *) &cinfo, len)) | 420 | if (copy_to_user(optval, (char *) &cinfo, len)) |
@@ -467,6 +434,7 @@ static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __us | |||
467 | static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen) | 434 | static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen) |
468 | { | 435 | { |
469 | struct sock *sk = sock->sk; | 436 | struct sock *sk = sock->sk; |
437 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | ||
470 | struct bt_security sec; | 438 | struct bt_security sec; |
471 | int len, err = 0; | 439 | int len, err = 0; |
472 | 440 | ||
@@ -491,7 +459,7 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch | |||
491 | break; | 459 | break; |
492 | } | 460 | } |
493 | 461 | ||
494 | sec.level = l2cap_pi(sk)->sec_level; | 462 | sec.level = chan->sec_level; |
495 | 463 | ||
496 | len = min_t(unsigned int, len, sizeof(sec)); | 464 | len = min_t(unsigned int, len, sizeof(sec)); |
497 | if (copy_to_user(optval, (char *) &sec, len)) | 465 | if (copy_to_user(optval, (char *) &sec, len)) |
@@ -511,7 +479,7 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch | |||
511 | break; | 479 | break; |
512 | 480 | ||
513 | case BT_FLUSHABLE: | 481 | case BT_FLUSHABLE: |
514 | if (put_user(l2cap_pi(sk)->flushable, (u32 __user *) optval)) | 482 | if (put_user(chan->flushable, (u32 __user *) optval)) |
515 | err = -EFAULT; | 483 | err = -EFAULT; |
516 | 484 | ||
517 | break; | 485 | break; |
@@ -528,6 +496,7 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch | |||
528 | static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen) | 496 | static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen) |
529 | { | 497 | { |
530 | struct sock *sk = sock->sk; | 498 | struct sock *sk = sock->sk; |
499 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | ||
531 | struct l2cap_options opts; | 500 | struct l2cap_options opts; |
532 | int len, err = 0; | 501 | int len, err = 0; |
533 | u32 opt; | 502 | u32 opt; |
@@ -543,13 +512,13 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __us | |||
543 | break; | 512 | break; |
544 | } | 513 | } |
545 | 514 | ||
546 | opts.imtu = l2cap_pi(sk)->imtu; | 515 | opts.imtu = chan->imtu; |
547 | opts.omtu = l2cap_pi(sk)->omtu; | 516 | opts.omtu = chan->omtu; |
548 | opts.flush_to = l2cap_pi(sk)->flush_to; | 517 | opts.flush_to = chan->flush_to; |
549 | opts.mode = l2cap_pi(sk)->mode; | 518 | opts.mode = chan->mode; |
550 | opts.fcs = l2cap_pi(sk)->fcs; | 519 | opts.fcs = chan->fcs; |
551 | opts.max_tx = l2cap_pi(sk)->max_tx; | 520 | opts.max_tx = chan->max_tx; |
552 | opts.txwin_size = (__u16)l2cap_pi(sk)->tx_win; | 521 | opts.txwin_size = (__u16)chan->tx_win; |
553 | 522 | ||
554 | len = min_t(unsigned int, sizeof(opts), optlen); | 523 | len = min_t(unsigned int, sizeof(opts), optlen); |
555 | if (copy_from_user((char *) &opts, optval, len)) { | 524 | if (copy_from_user((char *) &opts, optval, len)) { |
@@ -562,10 +531,10 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __us | |||
562 | break; | 531 | break; |
563 | } | 532 | } |
564 | 533 | ||
565 | l2cap_pi(sk)->mode = opts.mode; | 534 | chan->mode = opts.mode; |
566 | switch (l2cap_pi(sk)->mode) { | 535 | switch (chan->mode) { |
567 | case L2CAP_MODE_BASIC: | 536 | case L2CAP_MODE_BASIC: |
568 | l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_STATE2_DEVICE; | 537 | chan->conf_state &= ~L2CAP_CONF_STATE2_DEVICE; |
569 | break; | 538 | break; |
570 | case L2CAP_MODE_ERTM: | 539 | case L2CAP_MODE_ERTM: |
571 | case L2CAP_MODE_STREAMING: | 540 | case L2CAP_MODE_STREAMING: |
@@ -577,11 +546,11 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __us | |||
577 | break; | 546 | break; |
578 | } | 547 | } |
579 | 548 | ||
580 | l2cap_pi(sk)->imtu = opts.imtu; | 549 | chan->imtu = opts.imtu; |
581 | l2cap_pi(sk)->omtu = opts.omtu; | 550 | chan->omtu = opts.omtu; |
582 | l2cap_pi(sk)->fcs = opts.fcs; | 551 | chan->fcs = opts.fcs; |
583 | l2cap_pi(sk)->max_tx = opts.max_tx; | 552 | chan->max_tx = opts.max_tx; |
584 | l2cap_pi(sk)->tx_win = (__u8)opts.txwin_size; | 553 | chan->tx_win = (__u8)opts.txwin_size; |
585 | break; | 554 | break; |
586 | 555 | ||
587 | case L2CAP_LM: | 556 | case L2CAP_LM: |
@@ -591,14 +560,14 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __us | |||
591 | } | 560 | } |
592 | 561 | ||
593 | if (opt & L2CAP_LM_AUTH) | 562 | if (opt & L2CAP_LM_AUTH) |
594 | l2cap_pi(sk)->sec_level = BT_SECURITY_LOW; | 563 | chan->sec_level = BT_SECURITY_LOW; |
595 | if (opt & L2CAP_LM_ENCRYPT) | 564 | if (opt & L2CAP_LM_ENCRYPT) |
596 | l2cap_pi(sk)->sec_level = BT_SECURITY_MEDIUM; | 565 | chan->sec_level = BT_SECURITY_MEDIUM; |
597 | if (opt & L2CAP_LM_SECURE) | 566 | if (opt & L2CAP_LM_SECURE) |
598 | l2cap_pi(sk)->sec_level = BT_SECURITY_HIGH; | 567 | chan->sec_level = BT_SECURITY_HIGH; |
599 | 568 | ||
600 | l2cap_pi(sk)->role_switch = (opt & L2CAP_LM_MASTER); | 569 | chan->role_switch = (opt & L2CAP_LM_MASTER); |
601 | l2cap_pi(sk)->force_reliable = (opt & L2CAP_LM_RELIABLE); | 570 | chan->force_reliable = (opt & L2CAP_LM_RELIABLE); |
602 | break; | 571 | break; |
603 | 572 | ||
604 | default: | 573 | default: |
@@ -613,6 +582,7 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __us | |||
613 | static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen) | 582 | static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen) |
614 | { | 583 | { |
615 | struct sock *sk = sock->sk; | 584 | struct sock *sk = sock->sk; |
585 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | ||
616 | struct bt_security sec; | 586 | struct bt_security sec; |
617 | int len, err = 0; | 587 | int len, err = 0; |
618 | u32 opt; | 588 | u32 opt; |
@@ -649,7 +619,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch | |||
649 | break; | 619 | break; |
650 | } | 620 | } |
651 | 621 | ||
652 | l2cap_pi(sk)->sec_level = sec.level; | 622 | chan->sec_level = sec.level; |
653 | break; | 623 | break; |
654 | 624 | ||
655 | case BT_DEFER_SETUP: | 625 | case BT_DEFER_SETUP: |
@@ -678,7 +648,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch | |||
678 | } | 648 | } |
679 | 649 | ||
680 | if (opt == BT_FLUSHABLE_OFF) { | 650 | if (opt == BT_FLUSHABLE_OFF) { |
681 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; | 651 | struct l2cap_conn *conn = chan->conn; |
682 | /* proceed further only when we have l2cap_conn and | 652 | /* proceed further only when we have l2cap_conn and |
683 | No Flush support in the LM */ | 653 | No Flush support in the LM */ |
684 | if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) { | 654 | if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) { |
@@ -687,7 +657,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch | |||
687 | } | 657 | } |
688 | } | 658 | } |
689 | 659 | ||
690 | l2cap_pi(sk)->flushable = opt; | 660 | chan->flushable = opt; |
691 | break; | 661 | break; |
692 | 662 | ||
693 | default: | 663 | default: |
@@ -702,7 +672,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch | |||
702 | static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len) | 672 | static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len) |
703 | { | 673 | { |
704 | struct sock *sk = sock->sk; | 674 | struct sock *sk = sock->sk; |
705 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 675 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; |
706 | struct sk_buff *skb; | 676 | struct sk_buff *skb; |
707 | u16 control; | 677 | u16 control; |
708 | int err; | 678 | int err; |
@@ -725,74 +695,77 @@ static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct ms | |||
725 | 695 | ||
726 | /* Connectionless channel */ | 696 | /* Connectionless channel */ |
727 | if (sk->sk_type == SOCK_DGRAM) { | 697 | if (sk->sk_type == SOCK_DGRAM) { |
728 | skb = l2cap_create_connless_pdu(sk, msg, len); | 698 | skb = l2cap_create_connless_pdu(chan, msg, len); |
729 | if (IS_ERR(skb)) { | 699 | if (IS_ERR(skb)) { |
730 | err = PTR_ERR(skb); | 700 | err = PTR_ERR(skb); |
731 | } else { | 701 | } else { |
732 | l2cap_do_send(sk, skb); | 702 | l2cap_do_send(chan, skb); |
733 | err = len; | 703 | err = len; |
734 | } | 704 | } |
735 | goto done; | 705 | goto done; |
736 | } | 706 | } |
737 | 707 | ||
738 | switch (pi->mode) { | 708 | switch (chan->mode) { |
739 | case L2CAP_MODE_BASIC: | 709 | case L2CAP_MODE_BASIC: |
740 | /* Check outgoing MTU */ | 710 | /* Check outgoing MTU */ |
741 | if (len > pi->omtu) { | 711 | if (len > chan->omtu) { |
742 | err = -EMSGSIZE; | 712 | err = -EMSGSIZE; |
743 | goto done; | 713 | goto done; |
744 | } | 714 | } |
745 | 715 | ||
746 | /* Create a basic PDU */ | 716 | /* Create a basic PDU */ |
747 | skb = l2cap_create_basic_pdu(sk, msg, len); | 717 | skb = l2cap_create_basic_pdu(chan, msg, len); |
748 | if (IS_ERR(skb)) { | 718 | if (IS_ERR(skb)) { |
749 | err = PTR_ERR(skb); | 719 | err = PTR_ERR(skb); |
750 | goto done; | 720 | goto done; |
751 | } | 721 | } |
752 | 722 | ||
753 | l2cap_do_send(sk, skb); | 723 | l2cap_do_send(chan, skb); |
754 | err = len; | 724 | err = len; |
755 | break; | 725 | break; |
756 | 726 | ||
757 | case L2CAP_MODE_ERTM: | 727 | case L2CAP_MODE_ERTM: |
758 | case L2CAP_MODE_STREAMING: | 728 | case L2CAP_MODE_STREAMING: |
759 | /* Entire SDU fits into one PDU */ | 729 | /* Entire SDU fits into one PDU */ |
760 | if (len <= pi->remote_mps) { | 730 | if (len <= chan->remote_mps) { |
761 | control = L2CAP_SDU_UNSEGMENTED; | 731 | control = L2CAP_SDU_UNSEGMENTED; |
762 | skb = l2cap_create_iframe_pdu(sk, msg, len, control, 0); | 732 | skb = l2cap_create_iframe_pdu(chan, msg, len, control, |
733 | 0); | ||
763 | if (IS_ERR(skb)) { | 734 | if (IS_ERR(skb)) { |
764 | err = PTR_ERR(skb); | 735 | err = PTR_ERR(skb); |
765 | goto done; | 736 | goto done; |
766 | } | 737 | } |
767 | __skb_queue_tail(TX_QUEUE(sk), skb); | 738 | __skb_queue_tail(&chan->tx_q, skb); |
768 | 739 | ||
769 | if (sk->sk_send_head == NULL) | 740 | if (chan->tx_send_head == NULL) |
770 | sk->sk_send_head = skb; | 741 | chan->tx_send_head = skb; |
771 | 742 | ||
772 | } else { | 743 | } else { |
773 | /* Segment SDU into multiples PDUs */ | 744 | /* Segment SDU into multiples PDUs */ |
774 | err = l2cap_sar_segment_sdu(sk, msg, len); | 745 | err = l2cap_sar_segment_sdu(chan, msg, len); |
775 | if (err < 0) | 746 | if (err < 0) |
776 | goto done; | 747 | goto done; |
777 | } | 748 | } |
778 | 749 | ||
779 | if (pi->mode == L2CAP_MODE_STREAMING) { | 750 | if (chan->mode == L2CAP_MODE_STREAMING) { |
780 | l2cap_streaming_send(sk); | 751 | l2cap_streaming_send(chan); |
781 | } else { | 752 | err = len; |
782 | if ((pi->conn_state & L2CAP_CONN_REMOTE_BUSY) && | 753 | break; |
783 | (pi->conn_state & L2CAP_CONN_WAIT_F)) { | 754 | } |
784 | err = len; | 755 | |
785 | break; | 756 | if ((chan->conn_state & L2CAP_CONN_REMOTE_BUSY) && |
786 | } | 757 | (chan->conn_state & L2CAP_CONN_WAIT_F)) { |
787 | err = l2cap_ertm_send(sk); | 758 | err = len; |
759 | break; | ||
788 | } | 760 | } |
761 | err = l2cap_ertm_send(chan); | ||
789 | 762 | ||
790 | if (err >= 0) | 763 | if (err >= 0) |
791 | err = len; | 764 | err = len; |
792 | break; | 765 | break; |
793 | 766 | ||
794 | default: | 767 | default: |
795 | BT_DBG("bad state %1.1x", pi->mode); | 768 | BT_DBG("bad state %1.1x", chan->mode); |
796 | err = -EBADFD; | 769 | err = -EBADFD; |
797 | } | 770 | } |
798 | 771 | ||
@@ -808,29 +781,9 @@ static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct ms | |||
808 | lock_sock(sk); | 781 | lock_sock(sk); |
809 | 782 | ||
810 | if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) { | 783 | if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) { |
811 | struct l2cap_conn_rsp rsp; | ||
812 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; | ||
813 | u8 buf[128]; | ||
814 | |||
815 | sk->sk_state = BT_CONFIG; | 784 | sk->sk_state = BT_CONFIG; |
816 | 785 | ||
817 | rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid); | 786 | __l2cap_connect_rsp_defer(l2cap_pi(sk)->chan); |
818 | rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid); | ||
819 | rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS); | ||
820 | rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); | ||
821 | l2cap_send_cmd(l2cap_pi(sk)->conn, l2cap_pi(sk)->ident, | ||
822 | L2CAP_CONN_RSP, sizeof(rsp), &rsp); | ||
823 | |||
824 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT) { | ||
825 | release_sock(sk); | ||
826 | return 0; | ||
827 | } | ||
828 | |||
829 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; | ||
830 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, | ||
831 | l2cap_build_conf_req(sk, buf), buf); | ||
832 | l2cap_pi(sk)->num_conf_req++; | ||
833 | |||
834 | release_sock(sk); | 787 | release_sock(sk); |
835 | return 0; | 788 | return 0; |
836 | } | 789 | } |
@@ -854,7 +807,8 @@ void l2cap_sock_kill(struct sock *sk) | |||
854 | BT_DBG("sk %p state %d", sk, sk->sk_state); | 807 | BT_DBG("sk %p state %d", sk, sk->sk_state); |
855 | 808 | ||
856 | /* Kill poor orphan */ | 809 | /* Kill poor orphan */ |
857 | bt_sock_unlink(&l2cap_sk_list, sk); | 810 | |
811 | l2cap_chan_destroy(l2cap_pi(sk)->chan); | ||
858 | sock_set_flag(sk, SOCK_DEAD); | 812 | sock_set_flag(sk, SOCK_DEAD); |
859 | sock_put(sk); | 813 | sock_put(sk); |
860 | } | 814 | } |
@@ -885,7 +839,8 @@ static void l2cap_sock_cleanup_listen(struct sock *parent) | |||
885 | 839 | ||
886 | void __l2cap_sock_close(struct sock *sk, int reason) | 840 | void __l2cap_sock_close(struct sock *sk, int reason) |
887 | { | 841 | { |
888 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; | 842 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; |
843 | struct l2cap_conn *conn = chan->conn; | ||
889 | 844 | ||
890 | BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket); | 845 | BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket); |
891 | 846 | ||
@@ -900,9 +855,9 @@ void __l2cap_sock_close(struct sock *sk, int reason) | |||
900 | sk->sk_type == SOCK_STREAM) && | 855 | sk->sk_type == SOCK_STREAM) && |
901 | conn->hcon->type == ACL_LINK) { | 856 | conn->hcon->type == ACL_LINK) { |
902 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); | 857 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); |
903 | l2cap_send_disconn_req(conn, sk, reason); | 858 | l2cap_send_disconn_req(conn, chan, reason); |
904 | } else | 859 | } else |
905 | l2cap_chan_del(sk, reason); | 860 | l2cap_chan_del(chan, reason); |
906 | break; | 861 | break; |
907 | 862 | ||
908 | case BT_CONNECT2: | 863 | case BT_CONNECT2: |
@@ -917,20 +872,20 @@ void __l2cap_sock_close(struct sock *sk, int reason) | |||
917 | else | 872 | else |
918 | result = L2CAP_CR_BAD_PSM; | 873 | result = L2CAP_CR_BAD_PSM; |
919 | 874 | ||
920 | rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid); | 875 | rsp.scid = cpu_to_le16(chan->dcid); |
921 | rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid); | 876 | rsp.dcid = cpu_to_le16(chan->scid); |
922 | rsp.result = cpu_to_le16(result); | 877 | rsp.result = cpu_to_le16(result); |
923 | rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); | 878 | rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); |
924 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, | 879 | l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, |
925 | L2CAP_CONN_RSP, sizeof(rsp), &rsp); | 880 | sizeof(rsp), &rsp); |
926 | } | 881 | } |
927 | 882 | ||
928 | l2cap_chan_del(sk, reason); | 883 | l2cap_chan_del(chan, reason); |
929 | break; | 884 | break; |
930 | 885 | ||
931 | case BT_CONNECT: | 886 | case BT_CONNECT: |
932 | case BT_DISCONN: | 887 | case BT_DISCONN: |
933 | l2cap_chan_del(sk, reason); | 888 | l2cap_chan_del(chan, reason); |
934 | break; | 889 | break; |
935 | 890 | ||
936 | default: | 891 | default: |
@@ -942,6 +897,7 @@ void __l2cap_sock_close(struct sock *sk, int reason) | |||
942 | static int l2cap_sock_shutdown(struct socket *sock, int how) | 897 | static int l2cap_sock_shutdown(struct socket *sock, int how) |
943 | { | 898 | { |
944 | struct sock *sk = sock->sk; | 899 | struct sock *sk = sock->sk; |
900 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | ||
945 | int err = 0; | 901 | int err = 0; |
946 | 902 | ||
947 | BT_DBG("sock %p, sk %p", sock, sk); | 903 | BT_DBG("sock %p, sk %p", sock, sk); |
@@ -951,7 +907,7 @@ static int l2cap_sock_shutdown(struct socket *sock, int how) | |||
951 | 907 | ||
952 | lock_sock(sk); | 908 | lock_sock(sk); |
953 | if (!sk->sk_shutdown) { | 909 | if (!sk->sk_shutdown) { |
954 | if (l2cap_pi(sk)->mode == L2CAP_MODE_ERTM) | 910 | if (chan->mode == L2CAP_MODE_ERTM) |
955 | err = __l2cap_wait_ack(sk); | 911 | err = __l2cap_wait_ack(sk); |
956 | 912 | ||
957 | sk->sk_shutdown = SHUTDOWN_MASK; | 913 | sk->sk_shutdown = SHUTDOWN_MASK; |
@@ -998,49 +954,47 @@ static void l2cap_sock_destruct(struct sock *sk) | |||
998 | void l2cap_sock_init(struct sock *sk, struct sock *parent) | 954 | void l2cap_sock_init(struct sock *sk, struct sock *parent) |
999 | { | 955 | { |
1000 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 956 | struct l2cap_pinfo *pi = l2cap_pi(sk); |
957 | struct l2cap_chan *chan = pi->chan; | ||
1001 | 958 | ||
1002 | BT_DBG("sk %p", sk); | 959 | BT_DBG("sk %p", sk); |
1003 | 960 | ||
1004 | if (parent) { | 961 | if (parent) { |
962 | struct l2cap_chan *pchan = l2cap_pi(parent)->chan; | ||
963 | |||
1005 | sk->sk_type = parent->sk_type; | 964 | sk->sk_type = parent->sk_type; |
1006 | bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup; | 965 | bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup; |
1007 | 966 | ||
1008 | pi->imtu = l2cap_pi(parent)->imtu; | 967 | chan->imtu = pchan->imtu; |
1009 | pi->omtu = l2cap_pi(parent)->omtu; | 968 | chan->omtu = pchan->omtu; |
1010 | pi->conf_state = l2cap_pi(parent)->conf_state; | 969 | chan->conf_state = pchan->conf_state; |
1011 | pi->mode = l2cap_pi(parent)->mode; | 970 | chan->mode = pchan->mode; |
1012 | pi->fcs = l2cap_pi(parent)->fcs; | 971 | chan->fcs = pchan->fcs; |
1013 | pi->max_tx = l2cap_pi(parent)->max_tx; | 972 | chan->max_tx = pchan->max_tx; |
1014 | pi->tx_win = l2cap_pi(parent)->tx_win; | 973 | chan->tx_win = pchan->tx_win; |
1015 | pi->sec_level = l2cap_pi(parent)->sec_level; | 974 | chan->sec_level = pchan->sec_level; |
1016 | pi->role_switch = l2cap_pi(parent)->role_switch; | 975 | chan->role_switch = pchan->role_switch; |
1017 | pi->force_reliable = l2cap_pi(parent)->force_reliable; | 976 | chan->force_reliable = pchan->force_reliable; |
1018 | pi->flushable = l2cap_pi(parent)->flushable; | 977 | chan->flushable = pchan->flushable; |
1019 | } else { | 978 | } else { |
1020 | pi->imtu = L2CAP_DEFAULT_MTU; | 979 | chan->imtu = L2CAP_DEFAULT_MTU; |
1021 | pi->omtu = 0; | 980 | chan->omtu = 0; |
1022 | if (!disable_ertm && sk->sk_type == SOCK_STREAM) { | 981 | if (!disable_ertm && sk->sk_type == SOCK_STREAM) { |
1023 | pi->mode = L2CAP_MODE_ERTM; | 982 | chan->mode = L2CAP_MODE_ERTM; |
1024 | pi->conf_state |= L2CAP_CONF_STATE2_DEVICE; | 983 | chan->conf_state |= L2CAP_CONF_STATE2_DEVICE; |
1025 | } else { | 984 | } else { |
1026 | pi->mode = L2CAP_MODE_BASIC; | 985 | chan->mode = L2CAP_MODE_BASIC; |
1027 | } | 986 | } |
1028 | pi->max_tx = L2CAP_DEFAULT_MAX_TX; | 987 | chan->max_tx = L2CAP_DEFAULT_MAX_TX; |
1029 | pi->fcs = L2CAP_FCS_CRC16; | 988 | chan->fcs = L2CAP_FCS_CRC16; |
1030 | pi->tx_win = L2CAP_DEFAULT_TX_WINDOW; | 989 | chan->tx_win = L2CAP_DEFAULT_TX_WINDOW; |
1031 | pi->sec_level = BT_SECURITY_LOW; | 990 | chan->sec_level = BT_SECURITY_LOW; |
1032 | pi->role_switch = 0; | 991 | chan->role_switch = 0; |
1033 | pi->force_reliable = 0; | 992 | chan->force_reliable = 0; |
1034 | pi->flushable = BT_FLUSHABLE_OFF; | 993 | chan->flushable = BT_FLUSHABLE_OFF; |
1035 | } | 994 | } |
1036 | 995 | ||
1037 | /* Default config options */ | 996 | /* Default config options */ |
1038 | pi->conf_len = 0; | 997 | chan->flush_to = L2CAP_DEFAULT_FLUSH_TO; |
1039 | pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; | ||
1040 | skb_queue_head_init(TX_QUEUE(sk)); | ||
1041 | skb_queue_head_init(SREJ_QUEUE(sk)); | ||
1042 | skb_queue_head_init(BUSY_QUEUE(sk)); | ||
1043 | INIT_LIST_HEAD(SREJ_LIST(sk)); | ||
1044 | } | 998 | } |
1045 | 999 | ||
1046 | static struct proto l2cap_proto = { | 1000 | static struct proto l2cap_proto = { |
@@ -1070,7 +1024,6 @@ struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, g | |||
1070 | 1024 | ||
1071 | setup_timer(&sk->sk_timer, l2cap_sock_timeout, (unsigned long) sk); | 1025 | setup_timer(&sk->sk_timer, l2cap_sock_timeout, (unsigned long) sk); |
1072 | 1026 | ||
1073 | bt_sock_link(&l2cap_sk_list, sk); | ||
1074 | return sk; | 1027 | return sk; |
1075 | } | 1028 | } |
1076 | 1029 | ||
@@ -1078,6 +1031,7 @@ static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol, | |||
1078 | int kern) | 1031 | int kern) |
1079 | { | 1032 | { |
1080 | struct sock *sk; | 1033 | struct sock *sk; |
1034 | struct l2cap_chan *chan; | ||
1081 | 1035 | ||
1082 | BT_DBG("sock %p", sock); | 1036 | BT_DBG("sock %p", sock); |
1083 | 1037 | ||
@@ -1096,11 +1050,19 @@ static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol, | |||
1096 | if (!sk) | 1050 | if (!sk) |
1097 | return -ENOMEM; | 1051 | return -ENOMEM; |
1098 | 1052 | ||
1053 | chan = l2cap_chan_create(sk); | ||
1054 | if (!chan) { | ||
1055 | l2cap_sock_kill(sk); | ||
1056 | return -ENOMEM; | ||
1057 | } | ||
1058 | |||
1059 | l2cap_pi(sk)->chan = chan; | ||
1060 | |||
1099 | l2cap_sock_init(sk, NULL); | 1061 | l2cap_sock_init(sk, NULL); |
1100 | return 0; | 1062 | return 0; |
1101 | } | 1063 | } |
1102 | 1064 | ||
1103 | const struct proto_ops l2cap_sock_ops = { | 1065 | static const struct proto_ops l2cap_sock_ops = { |
1104 | .family = PF_BLUETOOTH, | 1066 | .family = PF_BLUETOOTH, |
1105 | .owner = THIS_MODULE, | 1067 | .owner = THIS_MODULE, |
1106 | .release = l2cap_sock_release, | 1068 | .release = l2cap_sock_release, |
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index 4476d8e3c0f2..dae382ce7020 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c | |||
@@ -36,7 +36,7 @@ struct pending_cmd { | |||
36 | struct list_head list; | 36 | struct list_head list; |
37 | __u16 opcode; | 37 | __u16 opcode; |
38 | int index; | 38 | int index; |
39 | void *cmd; | 39 | void *param; |
40 | struct sock *sk; | 40 | struct sock *sk; |
41 | void *user_data; | 41 | void *user_data; |
42 | }; | 42 | }; |
@@ -179,10 +179,12 @@ static int read_controller_info(struct sock *sk, u16 index) | |||
179 | 179 | ||
180 | hci_del_off_timer(hdev); | 180 | hci_del_off_timer(hdev); |
181 | 181 | ||
182 | hci_dev_lock_bh(hdev); | 182 | hci_dev_lock(hdev); |
183 | 183 | ||
184 | set_bit(HCI_MGMT, &hdev->flags); | 184 | set_bit(HCI_MGMT, &hdev->flags); |
185 | 185 | ||
186 | memset(&rp, 0, sizeof(rp)); | ||
187 | |||
186 | rp.type = hdev->dev_type; | 188 | rp.type = hdev->dev_type; |
187 | 189 | ||
188 | rp.powered = test_bit(HCI_UP, &hdev->flags); | 190 | rp.powered = test_bit(HCI_UP, &hdev->flags); |
@@ -204,7 +206,9 @@ static int read_controller_info(struct sock *sk, u16 index) | |||
204 | rp.hci_ver = hdev->hci_ver; | 206 | rp.hci_ver = hdev->hci_ver; |
205 | put_unaligned_le16(hdev->hci_rev, &rp.hci_rev); | 207 | put_unaligned_le16(hdev->hci_rev, &rp.hci_rev); |
206 | 208 | ||
207 | hci_dev_unlock_bh(hdev); | 209 | memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name)); |
210 | |||
211 | hci_dev_unlock(hdev); | ||
208 | hci_dev_put(hdev); | 212 | hci_dev_put(hdev); |
209 | 213 | ||
210 | return cmd_complete(sk, index, MGMT_OP_READ_INFO, &rp, sizeof(rp)); | 214 | return cmd_complete(sk, index, MGMT_OP_READ_INFO, &rp, sizeof(rp)); |
@@ -213,7 +217,7 @@ static int read_controller_info(struct sock *sk, u16 index) | |||
213 | static void mgmt_pending_free(struct pending_cmd *cmd) | 217 | static void mgmt_pending_free(struct pending_cmd *cmd) |
214 | { | 218 | { |
215 | sock_put(cmd->sk); | 219 | sock_put(cmd->sk); |
216 | kfree(cmd->cmd); | 220 | kfree(cmd->param); |
217 | kfree(cmd); | 221 | kfree(cmd); |
218 | } | 222 | } |
219 | 223 | ||
@@ -229,13 +233,14 @@ static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode, | |||
229 | cmd->opcode = opcode; | 233 | cmd->opcode = opcode; |
230 | cmd->index = index; | 234 | cmd->index = index; |
231 | 235 | ||
232 | cmd->cmd = kmalloc(len, GFP_ATOMIC); | 236 | cmd->param = kmalloc(len, GFP_ATOMIC); |
233 | if (!cmd->cmd) { | 237 | if (!cmd->param) { |
234 | kfree(cmd); | 238 | kfree(cmd); |
235 | return NULL; | 239 | return NULL; |
236 | } | 240 | } |
237 | 241 | ||
238 | memcpy(cmd->cmd, data, len); | 242 | if (data) |
243 | memcpy(cmd->param, data, len); | ||
239 | 244 | ||
240 | cmd->sk = sk; | 245 | cmd->sk = sk; |
241 | sock_hold(sk); | 246 | sock_hold(sk); |
@@ -311,7 +316,7 @@ static int set_powered(struct sock *sk, u16 index, unsigned char *data, u16 len) | |||
311 | if (!hdev) | 316 | if (!hdev) |
312 | return cmd_status(sk, index, MGMT_OP_SET_POWERED, ENODEV); | 317 | return cmd_status(sk, index, MGMT_OP_SET_POWERED, ENODEV); |
313 | 318 | ||
314 | hci_dev_lock_bh(hdev); | 319 | hci_dev_lock(hdev); |
315 | 320 | ||
316 | up = test_bit(HCI_UP, &hdev->flags); | 321 | up = test_bit(HCI_UP, &hdev->flags); |
317 | if ((cp->val && up) || (!cp->val && !up)) { | 322 | if ((cp->val && up) || (!cp->val && !up)) { |
@@ -338,7 +343,7 @@ static int set_powered(struct sock *sk, u16 index, unsigned char *data, u16 len) | |||
338 | err = 0; | 343 | err = 0; |
339 | 344 | ||
340 | failed: | 345 | failed: |
341 | hci_dev_unlock_bh(hdev); | 346 | hci_dev_unlock(hdev); |
342 | hci_dev_put(hdev); | 347 | hci_dev_put(hdev); |
343 | return err; | 348 | return err; |
344 | } | 349 | } |
@@ -363,7 +368,7 @@ static int set_discoverable(struct sock *sk, u16 index, unsigned char *data, | |||
363 | if (!hdev) | 368 | if (!hdev) |
364 | return cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE, ENODEV); | 369 | return cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE, ENODEV); |
365 | 370 | ||
366 | hci_dev_lock_bh(hdev); | 371 | hci_dev_lock(hdev); |
367 | 372 | ||
368 | if (!test_bit(HCI_UP, &hdev->flags)) { | 373 | if (!test_bit(HCI_UP, &hdev->flags)) { |
369 | err = cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE, ENETDOWN); | 374 | err = cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE, ENETDOWN); |
@@ -398,7 +403,7 @@ static int set_discoverable(struct sock *sk, u16 index, unsigned char *data, | |||
398 | mgmt_pending_remove(cmd); | 403 | mgmt_pending_remove(cmd); |
399 | 404 | ||
400 | failed: | 405 | failed: |
401 | hci_dev_unlock_bh(hdev); | 406 | hci_dev_unlock(hdev); |
402 | hci_dev_put(hdev); | 407 | hci_dev_put(hdev); |
403 | 408 | ||
404 | return err; | 409 | return err; |
@@ -424,7 +429,7 @@ static int set_connectable(struct sock *sk, u16 index, unsigned char *data, | |||
424 | if (!hdev) | 429 | if (!hdev) |
425 | return cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE, ENODEV); | 430 | return cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE, ENODEV); |
426 | 431 | ||
427 | hci_dev_lock_bh(hdev); | 432 | hci_dev_lock(hdev); |
428 | 433 | ||
429 | if (!test_bit(HCI_UP, &hdev->flags)) { | 434 | if (!test_bit(HCI_UP, &hdev->flags)) { |
430 | err = cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE, ENETDOWN); | 435 | err = cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE, ENETDOWN); |
@@ -458,7 +463,7 @@ static int set_connectable(struct sock *sk, u16 index, unsigned char *data, | |||
458 | mgmt_pending_remove(cmd); | 463 | mgmt_pending_remove(cmd); |
459 | 464 | ||
460 | failed: | 465 | failed: |
461 | hci_dev_unlock_bh(hdev); | 466 | hci_dev_unlock(hdev); |
462 | hci_dev_put(hdev); | 467 | hci_dev_put(hdev); |
463 | 468 | ||
464 | return err; | 469 | return err; |
@@ -517,7 +522,7 @@ static int set_pairable(struct sock *sk, u16 index, unsigned char *data, | |||
517 | if (!hdev) | 522 | if (!hdev) |
518 | return cmd_status(sk, index, MGMT_OP_SET_PAIRABLE, ENODEV); | 523 | return cmd_status(sk, index, MGMT_OP_SET_PAIRABLE, ENODEV); |
519 | 524 | ||
520 | hci_dev_lock_bh(hdev); | 525 | hci_dev_lock(hdev); |
521 | 526 | ||
522 | if (cp->val) | 527 | if (cp->val) |
523 | set_bit(HCI_PAIRABLE, &hdev->flags); | 528 | set_bit(HCI_PAIRABLE, &hdev->flags); |
@@ -533,12 +538,156 @@ static int set_pairable(struct sock *sk, u16 index, unsigned char *data, | |||
533 | err = mgmt_event(MGMT_EV_PAIRABLE, index, &ev, sizeof(ev), sk); | 538 | err = mgmt_event(MGMT_EV_PAIRABLE, index, &ev, sizeof(ev), sk); |
534 | 539 | ||
535 | failed: | 540 | failed: |
536 | hci_dev_unlock_bh(hdev); | 541 | hci_dev_unlock(hdev); |
537 | hci_dev_put(hdev); | 542 | hci_dev_put(hdev); |
538 | 543 | ||
539 | return err; | 544 | return err; |
540 | } | 545 | } |
541 | 546 | ||
547 | #define EIR_FLAGS 0x01 /* flags */ | ||
548 | #define EIR_UUID16_SOME 0x02 /* 16-bit UUID, more available */ | ||
549 | #define EIR_UUID16_ALL 0x03 /* 16-bit UUID, all listed */ | ||
550 | #define EIR_UUID32_SOME 0x04 /* 32-bit UUID, more available */ | ||
551 | #define EIR_UUID32_ALL 0x05 /* 32-bit UUID, all listed */ | ||
552 | #define EIR_UUID128_SOME 0x06 /* 128-bit UUID, more available */ | ||
553 | #define EIR_UUID128_ALL 0x07 /* 128-bit UUID, all listed */ | ||
554 | #define EIR_NAME_SHORT 0x08 /* shortened local name */ | ||
555 | #define EIR_NAME_COMPLETE 0x09 /* complete local name */ | ||
556 | #define EIR_TX_POWER 0x0A /* transmit power level */ | ||
557 | #define EIR_DEVICE_ID 0x10 /* device ID */ | ||
558 | |||
559 | #define PNP_INFO_SVCLASS_ID 0x1200 | ||
560 | |||
561 | static u8 bluetooth_base_uuid[] = { | ||
562 | 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, | ||
563 | 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
564 | }; | ||
565 | |||
566 | static u16 get_uuid16(u8 *uuid128) | ||
567 | { | ||
568 | u32 val; | ||
569 | int i; | ||
570 | |||
571 | for (i = 0; i < 12; i++) { | ||
572 | if (bluetooth_base_uuid[i] != uuid128[i]) | ||
573 | return 0; | ||
574 | } | ||
575 | |||
576 | memcpy(&val, &uuid128[12], 4); | ||
577 | |||
578 | val = le32_to_cpu(val); | ||
579 | if (val > 0xffff) | ||
580 | return 0; | ||
581 | |||
582 | return (u16) val; | ||
583 | } | ||
584 | |||
585 | static void create_eir(struct hci_dev *hdev, u8 *data) | ||
586 | { | ||
587 | u8 *ptr = data; | ||
588 | u16 eir_len = 0; | ||
589 | u16 uuid16_list[HCI_MAX_EIR_LENGTH / sizeof(u16)]; | ||
590 | int i, truncated = 0; | ||
591 | struct list_head *p; | ||
592 | size_t name_len; | ||
593 | |||
594 | name_len = strlen(hdev->dev_name); | ||
595 | |||
596 | if (name_len > 0) { | ||
597 | /* EIR Data type */ | ||
598 | if (name_len > 48) { | ||
599 | name_len = 48; | ||
600 | ptr[1] = EIR_NAME_SHORT; | ||
601 | } else | ||
602 | ptr[1] = EIR_NAME_COMPLETE; | ||
603 | |||
604 | /* EIR Data length */ | ||
605 | ptr[0] = name_len + 1; | ||
606 | |||
607 | memcpy(ptr + 2, hdev->dev_name, name_len); | ||
608 | |||
609 | eir_len += (name_len + 2); | ||
610 | ptr += (name_len + 2); | ||
611 | } | ||
612 | |||
613 | memset(uuid16_list, 0, sizeof(uuid16_list)); | ||
614 | |||
615 | /* Group all UUID16 types */ | ||
616 | list_for_each(p, &hdev->uuids) { | ||
617 | struct bt_uuid *uuid = list_entry(p, struct bt_uuid, list); | ||
618 | u16 uuid16; | ||
619 | |||
620 | uuid16 = get_uuid16(uuid->uuid); | ||
621 | if (uuid16 == 0) | ||
622 | return; | ||
623 | |||
624 | if (uuid16 < 0x1100) | ||
625 | continue; | ||
626 | |||
627 | if (uuid16 == PNP_INFO_SVCLASS_ID) | ||
628 | continue; | ||
629 | |||
630 | /* Stop if not enough space to put next UUID */ | ||
631 | if (eir_len + 2 + sizeof(u16) > HCI_MAX_EIR_LENGTH) { | ||
632 | truncated = 1; | ||
633 | break; | ||
634 | } | ||
635 | |||
636 | /* Check for duplicates */ | ||
637 | for (i = 0; uuid16_list[i] != 0; i++) | ||
638 | if (uuid16_list[i] == uuid16) | ||
639 | break; | ||
640 | |||
641 | if (uuid16_list[i] == 0) { | ||
642 | uuid16_list[i] = uuid16; | ||
643 | eir_len += sizeof(u16); | ||
644 | } | ||
645 | } | ||
646 | |||
647 | if (uuid16_list[0] != 0) { | ||
648 | u8 *length = ptr; | ||
649 | |||
650 | /* EIR Data type */ | ||
651 | ptr[1] = truncated ? EIR_UUID16_SOME : EIR_UUID16_ALL; | ||
652 | |||
653 | ptr += 2; | ||
654 | eir_len += 2; | ||
655 | |||
656 | for (i = 0; uuid16_list[i] != 0; i++) { | ||
657 | *ptr++ = (uuid16_list[i] & 0x00ff); | ||
658 | *ptr++ = (uuid16_list[i] & 0xff00) >> 8; | ||
659 | } | ||
660 | |||
661 | /* EIR Data length */ | ||
662 | *length = (i * sizeof(u16)) + 1; | ||
663 | } | ||
664 | } | ||
665 | |||
666 | static int update_eir(struct hci_dev *hdev) | ||
667 | { | ||
668 | struct hci_cp_write_eir cp; | ||
669 | |||
670 | if (!(hdev->features[6] & LMP_EXT_INQ)) | ||
671 | return 0; | ||
672 | |||
673 | if (hdev->ssp_mode == 0) | ||
674 | return 0; | ||
675 | |||
676 | if (test_bit(HCI_SERVICE_CACHE, &hdev->flags)) | ||
677 | return 0; | ||
678 | |||
679 | memset(&cp, 0, sizeof(cp)); | ||
680 | |||
681 | create_eir(hdev, cp.data); | ||
682 | |||
683 | if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0) | ||
684 | return 0; | ||
685 | |||
686 | memcpy(hdev->eir, cp.data, sizeof(cp.data)); | ||
687 | |||
688 | return hci_send_cmd(hdev, HCI_OP_WRITE_EIR, sizeof(cp), &cp); | ||
689 | } | ||
690 | |||
542 | static u8 get_service_classes(struct hci_dev *hdev) | 691 | static u8 get_service_classes(struct hci_dev *hdev) |
543 | { | 692 | { |
544 | struct list_head *p; | 693 | struct list_head *p; |
@@ -590,7 +739,7 @@ static int add_uuid(struct sock *sk, u16 index, unsigned char *data, u16 len) | |||
590 | if (!hdev) | 739 | if (!hdev) |
591 | return cmd_status(sk, index, MGMT_OP_ADD_UUID, ENODEV); | 740 | return cmd_status(sk, index, MGMT_OP_ADD_UUID, ENODEV); |
592 | 741 | ||
593 | hci_dev_lock_bh(hdev); | 742 | hci_dev_lock(hdev); |
594 | 743 | ||
595 | uuid = kmalloc(sizeof(*uuid), GFP_ATOMIC); | 744 | uuid = kmalloc(sizeof(*uuid), GFP_ATOMIC); |
596 | if (!uuid) { | 745 | if (!uuid) { |
@@ -607,10 +756,14 @@ static int add_uuid(struct sock *sk, u16 index, unsigned char *data, u16 len) | |||
607 | if (err < 0) | 756 | if (err < 0) |
608 | goto failed; | 757 | goto failed; |
609 | 758 | ||
759 | err = update_eir(hdev); | ||
760 | if (err < 0) | ||
761 | goto failed; | ||
762 | |||
610 | err = cmd_complete(sk, index, MGMT_OP_ADD_UUID, NULL, 0); | 763 | err = cmd_complete(sk, index, MGMT_OP_ADD_UUID, NULL, 0); |
611 | 764 | ||
612 | failed: | 765 | failed: |
613 | hci_dev_unlock_bh(hdev); | 766 | hci_dev_unlock(hdev); |
614 | hci_dev_put(hdev); | 767 | hci_dev_put(hdev); |
615 | 768 | ||
616 | return err; | 769 | return err; |
@@ -635,7 +788,7 @@ static int remove_uuid(struct sock *sk, u16 index, unsigned char *data, u16 len) | |||
635 | if (!hdev) | 788 | if (!hdev) |
636 | return cmd_status(sk, index, MGMT_OP_REMOVE_UUID, ENODEV); | 789 | return cmd_status(sk, index, MGMT_OP_REMOVE_UUID, ENODEV); |
637 | 790 | ||
638 | hci_dev_lock_bh(hdev); | 791 | hci_dev_lock(hdev); |
639 | 792 | ||
640 | if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) { | 793 | if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) { |
641 | err = hci_uuids_clear(hdev); | 794 | err = hci_uuids_clear(hdev); |
@@ -663,10 +816,14 @@ static int remove_uuid(struct sock *sk, u16 index, unsigned char *data, u16 len) | |||
663 | if (err < 0) | 816 | if (err < 0) |
664 | goto unlock; | 817 | goto unlock; |
665 | 818 | ||
819 | err = update_eir(hdev); | ||
820 | if (err < 0) | ||
821 | goto unlock; | ||
822 | |||
666 | err = cmd_complete(sk, index, MGMT_OP_REMOVE_UUID, NULL, 0); | 823 | err = cmd_complete(sk, index, MGMT_OP_REMOVE_UUID, NULL, 0); |
667 | 824 | ||
668 | unlock: | 825 | unlock: |
669 | hci_dev_unlock_bh(hdev); | 826 | hci_dev_unlock(hdev); |
670 | hci_dev_put(hdev); | 827 | hci_dev_put(hdev); |
671 | 828 | ||
672 | return err; | 829 | return err; |
@@ -690,7 +847,7 @@ static int set_dev_class(struct sock *sk, u16 index, unsigned char *data, | |||
690 | if (!hdev) | 847 | if (!hdev) |
691 | return cmd_status(sk, index, MGMT_OP_SET_DEV_CLASS, ENODEV); | 848 | return cmd_status(sk, index, MGMT_OP_SET_DEV_CLASS, ENODEV); |
692 | 849 | ||
693 | hci_dev_lock_bh(hdev); | 850 | hci_dev_lock(hdev); |
694 | 851 | ||
695 | hdev->major_class = cp->major; | 852 | hdev->major_class = cp->major; |
696 | hdev->minor_class = cp->minor; | 853 | hdev->minor_class = cp->minor; |
@@ -700,7 +857,7 @@ static int set_dev_class(struct sock *sk, u16 index, unsigned char *data, | |||
700 | if (err == 0) | 857 | if (err == 0) |
701 | err = cmd_complete(sk, index, MGMT_OP_SET_DEV_CLASS, NULL, 0); | 858 | err = cmd_complete(sk, index, MGMT_OP_SET_DEV_CLASS, NULL, 0); |
702 | 859 | ||
703 | hci_dev_unlock_bh(hdev); | 860 | hci_dev_unlock(hdev); |
704 | hci_dev_put(hdev); | 861 | hci_dev_put(hdev); |
705 | 862 | ||
706 | return err; | 863 | return err; |
@@ -722,7 +879,7 @@ static int set_service_cache(struct sock *sk, u16 index, unsigned char *data, | |||
722 | if (!hdev) | 879 | if (!hdev) |
723 | return cmd_status(sk, index, MGMT_OP_SET_SERVICE_CACHE, ENODEV); | 880 | return cmd_status(sk, index, MGMT_OP_SET_SERVICE_CACHE, ENODEV); |
724 | 881 | ||
725 | hci_dev_lock_bh(hdev); | 882 | hci_dev_lock(hdev); |
726 | 883 | ||
727 | BT_DBG("hci%u enable %d", index, cp->enable); | 884 | BT_DBG("hci%u enable %d", index, cp->enable); |
728 | 885 | ||
@@ -732,13 +889,15 @@ static int set_service_cache(struct sock *sk, u16 index, unsigned char *data, | |||
732 | } else { | 889 | } else { |
733 | clear_bit(HCI_SERVICE_CACHE, &hdev->flags); | 890 | clear_bit(HCI_SERVICE_CACHE, &hdev->flags); |
734 | err = update_class(hdev); | 891 | err = update_class(hdev); |
892 | if (err == 0) | ||
893 | err = update_eir(hdev); | ||
735 | } | 894 | } |
736 | 895 | ||
737 | if (err == 0) | 896 | if (err == 0) |
738 | err = cmd_complete(sk, index, MGMT_OP_SET_SERVICE_CACHE, NULL, | 897 | err = cmd_complete(sk, index, MGMT_OP_SET_SERVICE_CACHE, NULL, |
739 | 0); | 898 | 0); |
740 | 899 | ||
741 | hci_dev_unlock_bh(hdev); | 900 | hci_dev_unlock(hdev); |
742 | hci_dev_put(hdev); | 901 | hci_dev_put(hdev); |
743 | 902 | ||
744 | return err; | 903 | return err; |
@@ -772,7 +931,7 @@ static int load_keys(struct sock *sk, u16 index, unsigned char *data, u16 len) | |||
772 | BT_DBG("hci%u debug_keys %u key_count %u", index, cp->debug_keys, | 931 | BT_DBG("hci%u debug_keys %u key_count %u", index, cp->debug_keys, |
773 | key_count); | 932 | key_count); |
774 | 933 | ||
775 | hci_dev_lock_bh(hdev); | 934 | hci_dev_lock(hdev); |
776 | 935 | ||
777 | hci_link_keys_clear(hdev); | 936 | hci_link_keys_clear(hdev); |
778 | 937 | ||
@@ -786,11 +945,11 @@ static int load_keys(struct sock *sk, u16 index, unsigned char *data, u16 len) | |||
786 | for (i = 0; i < key_count; i++) { | 945 | for (i = 0; i < key_count; i++) { |
787 | struct mgmt_key_info *key = &cp->keys[i]; | 946 | struct mgmt_key_info *key = &cp->keys[i]; |
788 | 947 | ||
789 | hci_add_link_key(hdev, 0, &key->bdaddr, key->val, key->type, | 948 | hci_add_link_key(hdev, NULL, 0, &key->bdaddr, key->val, key->type, |
790 | key->pin_len); | 949 | key->pin_len); |
791 | } | 950 | } |
792 | 951 | ||
793 | hci_dev_unlock_bh(hdev); | 952 | hci_dev_unlock(hdev); |
794 | hci_dev_put(hdev); | 953 | hci_dev_put(hdev); |
795 | 954 | ||
796 | return 0; | 955 | return 0; |
@@ -812,7 +971,7 @@ static int remove_key(struct sock *sk, u16 index, unsigned char *data, u16 len) | |||
812 | if (!hdev) | 971 | if (!hdev) |
813 | return cmd_status(sk, index, MGMT_OP_REMOVE_KEY, ENODEV); | 972 | return cmd_status(sk, index, MGMT_OP_REMOVE_KEY, ENODEV); |
814 | 973 | ||
815 | hci_dev_lock_bh(hdev); | 974 | hci_dev_lock(hdev); |
816 | 975 | ||
817 | err = hci_remove_link_key(hdev, &cp->bdaddr); | 976 | err = hci_remove_link_key(hdev, &cp->bdaddr); |
818 | if (err < 0) { | 977 | if (err < 0) { |
@@ -835,7 +994,7 @@ static int remove_key(struct sock *sk, u16 index, unsigned char *data, u16 len) | |||
835 | } | 994 | } |
836 | 995 | ||
837 | unlock: | 996 | unlock: |
838 | hci_dev_unlock_bh(hdev); | 997 | hci_dev_unlock(hdev); |
839 | hci_dev_put(hdev); | 998 | hci_dev_put(hdev); |
840 | 999 | ||
841 | return err; | 1000 | return err; |
@@ -861,7 +1020,7 @@ static int disconnect(struct sock *sk, u16 index, unsigned char *data, u16 len) | |||
861 | if (!hdev) | 1020 | if (!hdev) |
862 | return cmd_status(sk, index, MGMT_OP_DISCONNECT, ENODEV); | 1021 | return cmd_status(sk, index, MGMT_OP_DISCONNECT, ENODEV); |
863 | 1022 | ||
864 | hci_dev_lock_bh(hdev); | 1023 | hci_dev_lock(hdev); |
865 | 1024 | ||
866 | if (!test_bit(HCI_UP, &hdev->flags)) { | 1025 | if (!test_bit(HCI_UP, &hdev->flags)) { |
867 | err = cmd_status(sk, index, MGMT_OP_DISCONNECT, ENETDOWN); | 1026 | err = cmd_status(sk, index, MGMT_OP_DISCONNECT, ENETDOWN); |
@@ -874,6 +1033,9 @@ static int disconnect(struct sock *sk, u16 index, unsigned char *data, u16 len) | |||
874 | } | 1033 | } |
875 | 1034 | ||
876 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr); | 1035 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr); |
1036 | if (!conn) | ||
1037 | conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->bdaddr); | ||
1038 | |||
877 | if (!conn) { | 1039 | if (!conn) { |
878 | err = cmd_status(sk, index, MGMT_OP_DISCONNECT, ENOTCONN); | 1040 | err = cmd_status(sk, index, MGMT_OP_DISCONNECT, ENOTCONN); |
879 | goto failed; | 1041 | goto failed; |
@@ -893,7 +1055,7 @@ static int disconnect(struct sock *sk, u16 index, unsigned char *data, u16 len) | |||
893 | mgmt_pending_remove(cmd); | 1055 | mgmt_pending_remove(cmd); |
894 | 1056 | ||
895 | failed: | 1057 | failed: |
896 | hci_dev_unlock_bh(hdev); | 1058 | hci_dev_unlock(hdev); |
897 | hci_dev_put(hdev); | 1059 | hci_dev_put(hdev); |
898 | 1060 | ||
899 | return err; | 1061 | return err; |
@@ -914,7 +1076,7 @@ static int get_connections(struct sock *sk, u16 index) | |||
914 | if (!hdev) | 1076 | if (!hdev) |
915 | return cmd_status(sk, index, MGMT_OP_GET_CONNECTIONS, ENODEV); | 1077 | return cmd_status(sk, index, MGMT_OP_GET_CONNECTIONS, ENODEV); |
916 | 1078 | ||
917 | hci_dev_lock_bh(hdev); | 1079 | hci_dev_lock(hdev); |
918 | 1080 | ||
919 | count = 0; | 1081 | count = 0; |
920 | list_for_each(p, &hdev->conn_hash.list) { | 1082 | list_for_each(p, &hdev->conn_hash.list) { |
@@ -945,7 +1107,7 @@ static int get_connections(struct sock *sk, u16 index) | |||
945 | 1107 | ||
946 | unlock: | 1108 | unlock: |
947 | kfree(rp); | 1109 | kfree(rp); |
948 | hci_dev_unlock_bh(hdev); | 1110 | hci_dev_unlock(hdev); |
949 | hci_dev_put(hdev); | 1111 | hci_dev_put(hdev); |
950 | return err; | 1112 | return err; |
951 | } | 1113 | } |
@@ -970,7 +1132,7 @@ static int pin_code_reply(struct sock *sk, u16 index, unsigned char *data, | |||
970 | if (!hdev) | 1132 | if (!hdev) |
971 | return cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY, ENODEV); | 1133 | return cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY, ENODEV); |
972 | 1134 | ||
973 | hci_dev_lock_bh(hdev); | 1135 | hci_dev_lock(hdev); |
974 | 1136 | ||
975 | if (!test_bit(HCI_UP, &hdev->flags)) { | 1137 | if (!test_bit(HCI_UP, &hdev->flags)) { |
976 | err = cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY, ENETDOWN); | 1138 | err = cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY, ENETDOWN); |
@@ -992,7 +1154,7 @@ static int pin_code_reply(struct sock *sk, u16 index, unsigned char *data, | |||
992 | mgmt_pending_remove(cmd); | 1154 | mgmt_pending_remove(cmd); |
993 | 1155 | ||
994 | failed: | 1156 | failed: |
995 | hci_dev_unlock_bh(hdev); | 1157 | hci_dev_unlock(hdev); |
996 | hci_dev_put(hdev); | 1158 | hci_dev_put(hdev); |
997 | 1159 | ||
998 | return err; | 1160 | return err; |
@@ -1019,7 +1181,7 @@ static int pin_code_neg_reply(struct sock *sk, u16 index, unsigned char *data, | |||
1019 | return cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY, | 1181 | return cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY, |
1020 | ENODEV); | 1182 | ENODEV); |
1021 | 1183 | ||
1022 | hci_dev_lock_bh(hdev); | 1184 | hci_dev_lock(hdev); |
1023 | 1185 | ||
1024 | if (!test_bit(HCI_UP, &hdev->flags)) { | 1186 | if (!test_bit(HCI_UP, &hdev->flags)) { |
1025 | err = cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY, | 1187 | err = cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY, |
@@ -1040,7 +1202,7 @@ static int pin_code_neg_reply(struct sock *sk, u16 index, unsigned char *data, | |||
1040 | mgmt_pending_remove(cmd); | 1202 | mgmt_pending_remove(cmd); |
1041 | 1203 | ||
1042 | failed: | 1204 | failed: |
1043 | hci_dev_unlock_bh(hdev); | 1205 | hci_dev_unlock(hdev); |
1044 | hci_dev_put(hdev); | 1206 | hci_dev_put(hdev); |
1045 | 1207 | ||
1046 | return err; | 1208 | return err; |
@@ -1063,14 +1225,14 @@ static int set_io_capability(struct sock *sk, u16 index, unsigned char *data, | |||
1063 | if (!hdev) | 1225 | if (!hdev) |
1064 | return cmd_status(sk, index, MGMT_OP_SET_IO_CAPABILITY, ENODEV); | 1226 | return cmd_status(sk, index, MGMT_OP_SET_IO_CAPABILITY, ENODEV); |
1065 | 1227 | ||
1066 | hci_dev_lock_bh(hdev); | 1228 | hci_dev_lock(hdev); |
1067 | 1229 | ||
1068 | hdev->io_capability = cp->io_capability; | 1230 | hdev->io_capability = cp->io_capability; |
1069 | 1231 | ||
1070 | BT_DBG("%s IO capability set to 0x%02x", hdev->name, | 1232 | BT_DBG("%s IO capability set to 0x%02x", hdev->name, |
1071 | hdev->io_capability); | 1233 | hdev->io_capability); |
1072 | 1234 | ||
1073 | hci_dev_unlock_bh(hdev); | 1235 | hci_dev_unlock(hdev); |
1074 | hci_dev_put(hdev); | 1236 | hci_dev_put(hdev); |
1075 | 1237 | ||
1076 | return cmd_complete(sk, index, MGMT_OP_SET_IO_CAPABILITY, NULL, 0); | 1238 | return cmd_complete(sk, index, MGMT_OP_SET_IO_CAPABILITY, NULL, 0); |
@@ -1156,7 +1318,7 @@ static int pair_device(struct sock *sk, u16 index, unsigned char *data, u16 len) | |||
1156 | if (!hdev) | 1318 | if (!hdev) |
1157 | return cmd_status(sk, index, MGMT_OP_PAIR_DEVICE, ENODEV); | 1319 | return cmd_status(sk, index, MGMT_OP_PAIR_DEVICE, ENODEV); |
1158 | 1320 | ||
1159 | hci_dev_lock_bh(hdev); | 1321 | hci_dev_lock(hdev); |
1160 | 1322 | ||
1161 | if (cp->io_cap == 0x03) { | 1323 | if (cp->io_cap == 0x03) { |
1162 | sec_level = BT_SECURITY_MEDIUM; | 1324 | sec_level = BT_SECURITY_MEDIUM; |
@@ -1198,7 +1360,7 @@ static int pair_device(struct sock *sk, u16 index, unsigned char *data, u16 len) | |||
1198 | err = 0; | 1360 | err = 0; |
1199 | 1361 | ||
1200 | unlock: | 1362 | unlock: |
1201 | hci_dev_unlock_bh(hdev); | 1363 | hci_dev_unlock(hdev); |
1202 | hci_dev_put(hdev); | 1364 | hci_dev_put(hdev); |
1203 | 1365 | ||
1204 | return err; | 1366 | return err; |
@@ -1230,7 +1392,7 @@ static int user_confirm_reply(struct sock *sk, u16 index, unsigned char *data, | |||
1230 | if (!hdev) | 1392 | if (!hdev) |
1231 | return cmd_status(sk, index, mgmt_op, ENODEV); | 1393 | return cmd_status(sk, index, mgmt_op, ENODEV); |
1232 | 1394 | ||
1233 | hci_dev_lock_bh(hdev); | 1395 | hci_dev_lock(hdev); |
1234 | 1396 | ||
1235 | if (!test_bit(HCI_UP, &hdev->flags)) { | 1397 | if (!test_bit(HCI_UP, &hdev->flags)) { |
1236 | err = cmd_status(sk, index, mgmt_op, ENETDOWN); | 1398 | err = cmd_status(sk, index, mgmt_op, ENETDOWN); |
@@ -1248,6 +1410,231 @@ static int user_confirm_reply(struct sock *sk, u16 index, unsigned char *data, | |||
1248 | mgmt_pending_remove(cmd); | 1410 | mgmt_pending_remove(cmd); |
1249 | 1411 | ||
1250 | failed: | 1412 | failed: |
1413 | hci_dev_unlock(hdev); | ||
1414 | hci_dev_put(hdev); | ||
1415 | |||
1416 | return err; | ||
1417 | } | ||
1418 | |||
1419 | static int set_local_name(struct sock *sk, u16 index, unsigned char *data, | ||
1420 | u16 len) | ||
1421 | { | ||
1422 | struct mgmt_cp_set_local_name *mgmt_cp = (void *) data; | ||
1423 | struct hci_cp_write_local_name hci_cp; | ||
1424 | struct hci_dev *hdev; | ||
1425 | struct pending_cmd *cmd; | ||
1426 | int err; | ||
1427 | |||
1428 | BT_DBG(""); | ||
1429 | |||
1430 | if (len != sizeof(*mgmt_cp)) | ||
1431 | return cmd_status(sk, index, MGMT_OP_SET_LOCAL_NAME, EINVAL); | ||
1432 | |||
1433 | hdev = hci_dev_get(index); | ||
1434 | if (!hdev) | ||
1435 | return cmd_status(sk, index, MGMT_OP_SET_LOCAL_NAME, ENODEV); | ||
1436 | |||
1437 | hci_dev_lock(hdev); | ||
1438 | |||
1439 | cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, index, data, len); | ||
1440 | if (!cmd) { | ||
1441 | err = -ENOMEM; | ||
1442 | goto failed; | ||
1443 | } | ||
1444 | |||
1445 | memcpy(hci_cp.name, mgmt_cp->name, sizeof(hci_cp.name)); | ||
1446 | err = hci_send_cmd(hdev, HCI_OP_WRITE_LOCAL_NAME, sizeof(hci_cp), | ||
1447 | &hci_cp); | ||
1448 | if (err < 0) | ||
1449 | mgmt_pending_remove(cmd); | ||
1450 | |||
1451 | failed: | ||
1452 | hci_dev_unlock(hdev); | ||
1453 | hci_dev_put(hdev); | ||
1454 | |||
1455 | return err; | ||
1456 | } | ||
1457 | |||
1458 | static int read_local_oob_data(struct sock *sk, u16 index) | ||
1459 | { | ||
1460 | struct hci_dev *hdev; | ||
1461 | struct pending_cmd *cmd; | ||
1462 | int err; | ||
1463 | |||
1464 | BT_DBG("hci%u", index); | ||
1465 | |||
1466 | hdev = hci_dev_get(index); | ||
1467 | if (!hdev) | ||
1468 | return cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA, | ||
1469 | ENODEV); | ||
1470 | |||
1471 | hci_dev_lock(hdev); | ||
1472 | |||
1473 | if (!test_bit(HCI_UP, &hdev->flags)) { | ||
1474 | err = cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA, | ||
1475 | ENETDOWN); | ||
1476 | goto unlock; | ||
1477 | } | ||
1478 | |||
1479 | if (!(hdev->features[6] & LMP_SIMPLE_PAIR)) { | ||
1480 | err = cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA, | ||
1481 | EOPNOTSUPP); | ||
1482 | goto unlock; | ||
1483 | } | ||
1484 | |||
1485 | if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, index)) { | ||
1486 | err = cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA, EBUSY); | ||
1487 | goto unlock; | ||
1488 | } | ||
1489 | |||
1490 | cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, index, NULL, 0); | ||
1491 | if (!cmd) { | ||
1492 | err = -ENOMEM; | ||
1493 | goto unlock; | ||
1494 | } | ||
1495 | |||
1496 | err = hci_send_cmd(hdev, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL); | ||
1497 | if (err < 0) | ||
1498 | mgmt_pending_remove(cmd); | ||
1499 | |||
1500 | unlock: | ||
1501 | hci_dev_unlock(hdev); | ||
1502 | hci_dev_put(hdev); | ||
1503 | |||
1504 | return err; | ||
1505 | } | ||
1506 | |||
1507 | static int add_remote_oob_data(struct sock *sk, u16 index, unsigned char *data, | ||
1508 | u16 len) | ||
1509 | { | ||
1510 | struct hci_dev *hdev; | ||
1511 | struct mgmt_cp_add_remote_oob_data *cp = (void *) data; | ||
1512 | int err; | ||
1513 | |||
1514 | BT_DBG("hci%u ", index); | ||
1515 | |||
1516 | if (len != sizeof(*cp)) | ||
1517 | return cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA, | ||
1518 | EINVAL); | ||
1519 | |||
1520 | hdev = hci_dev_get(index); | ||
1521 | if (!hdev) | ||
1522 | return cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA, | ||
1523 | ENODEV); | ||
1524 | |||
1525 | hci_dev_lock(hdev); | ||
1526 | |||
1527 | err = hci_add_remote_oob_data(hdev, &cp->bdaddr, cp->hash, | ||
1528 | cp->randomizer); | ||
1529 | if (err < 0) | ||
1530 | err = cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA, -err); | ||
1531 | else | ||
1532 | err = cmd_complete(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA, NULL, | ||
1533 | 0); | ||
1534 | |||
1535 | hci_dev_unlock(hdev); | ||
1536 | hci_dev_put(hdev); | ||
1537 | |||
1538 | return err; | ||
1539 | } | ||
1540 | |||
1541 | static int remove_remote_oob_data(struct sock *sk, u16 index, | ||
1542 | unsigned char *data, u16 len) | ||
1543 | { | ||
1544 | struct hci_dev *hdev; | ||
1545 | struct mgmt_cp_remove_remote_oob_data *cp = (void *) data; | ||
1546 | int err; | ||
1547 | |||
1548 | BT_DBG("hci%u ", index); | ||
1549 | |||
1550 | if (len != sizeof(*cp)) | ||
1551 | return cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA, | ||
1552 | EINVAL); | ||
1553 | |||
1554 | hdev = hci_dev_get(index); | ||
1555 | if (!hdev) | ||
1556 | return cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA, | ||
1557 | ENODEV); | ||
1558 | |||
1559 | hci_dev_lock(hdev); | ||
1560 | |||
1561 | err = hci_remove_remote_oob_data(hdev, &cp->bdaddr); | ||
1562 | if (err < 0) | ||
1563 | err = cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA, | ||
1564 | -err); | ||
1565 | else | ||
1566 | err = cmd_complete(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA, | ||
1567 | NULL, 0); | ||
1568 | |||
1569 | hci_dev_unlock(hdev); | ||
1570 | hci_dev_put(hdev); | ||
1571 | |||
1572 | return err; | ||
1573 | } | ||
1574 | |||
1575 | static int start_discovery(struct sock *sk, u16 index) | ||
1576 | { | ||
1577 | u8 lap[3] = { 0x33, 0x8b, 0x9e }; | ||
1578 | struct hci_cp_inquiry cp; | ||
1579 | struct pending_cmd *cmd; | ||
1580 | struct hci_dev *hdev; | ||
1581 | int err; | ||
1582 | |||
1583 | BT_DBG("hci%u", index); | ||
1584 | |||
1585 | hdev = hci_dev_get(index); | ||
1586 | if (!hdev) | ||
1587 | return cmd_status(sk, index, MGMT_OP_START_DISCOVERY, ENODEV); | ||
1588 | |||
1589 | hci_dev_lock_bh(hdev); | ||
1590 | |||
1591 | cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, index, NULL, 0); | ||
1592 | if (!cmd) { | ||
1593 | err = -ENOMEM; | ||
1594 | goto failed; | ||
1595 | } | ||
1596 | |||
1597 | memset(&cp, 0, sizeof(cp)); | ||
1598 | memcpy(&cp.lap, lap, 3); | ||
1599 | cp.length = 0x08; | ||
1600 | cp.num_rsp = 0x00; | ||
1601 | |||
1602 | err = hci_send_cmd(hdev, HCI_OP_INQUIRY, sizeof(cp), &cp); | ||
1603 | if (err < 0) | ||
1604 | mgmt_pending_remove(cmd); | ||
1605 | |||
1606 | failed: | ||
1607 | hci_dev_unlock_bh(hdev); | ||
1608 | hci_dev_put(hdev); | ||
1609 | |||
1610 | return err; | ||
1611 | } | ||
1612 | |||
1613 | static int stop_discovery(struct sock *sk, u16 index) | ||
1614 | { | ||
1615 | struct hci_dev *hdev; | ||
1616 | struct pending_cmd *cmd; | ||
1617 | int err; | ||
1618 | |||
1619 | BT_DBG("hci%u", index); | ||
1620 | |||
1621 | hdev = hci_dev_get(index); | ||
1622 | if (!hdev) | ||
1623 | return cmd_status(sk, index, MGMT_OP_STOP_DISCOVERY, ENODEV); | ||
1624 | |||
1625 | hci_dev_lock_bh(hdev); | ||
1626 | |||
1627 | cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, index, NULL, 0); | ||
1628 | if (!cmd) { | ||
1629 | err = -ENOMEM; | ||
1630 | goto failed; | ||
1631 | } | ||
1632 | |||
1633 | err = hci_send_cmd(hdev, HCI_OP_INQUIRY_CANCEL, 0, NULL); | ||
1634 | if (err < 0) | ||
1635 | mgmt_pending_remove(cmd); | ||
1636 | |||
1637 | failed: | ||
1251 | hci_dev_unlock_bh(hdev); | 1638 | hci_dev_unlock_bh(hdev); |
1252 | hci_dev_put(hdev); | 1639 | hci_dev_put(hdev); |
1253 | 1640 | ||
@@ -1266,7 +1653,7 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen) | |||
1266 | if (msglen < sizeof(*hdr)) | 1653 | if (msglen < sizeof(*hdr)) |
1267 | return -EINVAL; | 1654 | return -EINVAL; |
1268 | 1655 | ||
1269 | buf = kmalloc(msglen, GFP_ATOMIC); | 1656 | buf = kmalloc(msglen, GFP_KERNEL); |
1270 | if (!buf) | 1657 | if (!buf) |
1271 | return -ENOMEM; | 1658 | return -ENOMEM; |
1272 | 1659 | ||
@@ -1349,6 +1736,25 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen) | |||
1349 | case MGMT_OP_USER_CONFIRM_NEG_REPLY: | 1736 | case MGMT_OP_USER_CONFIRM_NEG_REPLY: |
1350 | err = user_confirm_reply(sk, index, buf + sizeof(*hdr), len, 0); | 1737 | err = user_confirm_reply(sk, index, buf + sizeof(*hdr), len, 0); |
1351 | break; | 1738 | break; |
1739 | case MGMT_OP_SET_LOCAL_NAME: | ||
1740 | err = set_local_name(sk, index, buf + sizeof(*hdr), len); | ||
1741 | break; | ||
1742 | case MGMT_OP_READ_LOCAL_OOB_DATA: | ||
1743 | err = read_local_oob_data(sk, index); | ||
1744 | break; | ||
1745 | case MGMT_OP_ADD_REMOTE_OOB_DATA: | ||
1746 | err = add_remote_oob_data(sk, index, buf + sizeof(*hdr), len); | ||
1747 | break; | ||
1748 | case MGMT_OP_REMOVE_REMOTE_OOB_DATA: | ||
1749 | err = remove_remote_oob_data(sk, index, buf + sizeof(*hdr), | ||
1750 | len); | ||
1751 | break; | ||
1752 | case MGMT_OP_START_DISCOVERY: | ||
1753 | err = start_discovery(sk, index); | ||
1754 | break; | ||
1755 | case MGMT_OP_STOP_DISCOVERY: | ||
1756 | err = stop_discovery(sk, index); | ||
1757 | break; | ||
1352 | default: | 1758 | default: |
1353 | BT_DBG("Unknown op %u", opcode); | 1759 | BT_DBG("Unknown op %u", opcode); |
1354 | err = cmd_status(sk, index, opcode, 0x01); | 1760 | err = cmd_status(sk, index, opcode, 0x01); |
@@ -1382,7 +1788,7 @@ struct cmd_lookup { | |||
1382 | 1788 | ||
1383 | static void mode_rsp(struct pending_cmd *cmd, void *data) | 1789 | static void mode_rsp(struct pending_cmd *cmd, void *data) |
1384 | { | 1790 | { |
1385 | struct mgmt_mode *cp = cmd->cmd; | 1791 | struct mgmt_mode *cp = cmd->param; |
1386 | struct cmd_lookup *match = data; | 1792 | struct cmd_lookup *match = data; |
1387 | 1793 | ||
1388 | if (cp->val != match->val) | 1794 | if (cp->val != match->val) |
@@ -1455,17 +1861,17 @@ int mgmt_connectable(u16 index, u8 connectable) | |||
1455 | return ret; | 1861 | return ret; |
1456 | } | 1862 | } |
1457 | 1863 | ||
1458 | int mgmt_new_key(u16 index, struct link_key *key, u8 old_key_type) | 1864 | int mgmt_new_key(u16 index, struct link_key *key, u8 persistent) |
1459 | { | 1865 | { |
1460 | struct mgmt_ev_new_key ev; | 1866 | struct mgmt_ev_new_key ev; |
1461 | 1867 | ||
1462 | memset(&ev, 0, sizeof(ev)); | 1868 | memset(&ev, 0, sizeof(ev)); |
1463 | 1869 | ||
1870 | ev.store_hint = persistent; | ||
1464 | bacpy(&ev.key.bdaddr, &key->bdaddr); | 1871 | bacpy(&ev.key.bdaddr, &key->bdaddr); |
1465 | ev.key.type = key->type; | 1872 | ev.key.type = key->type; |
1466 | memcpy(ev.key.val, key->val, 16); | 1873 | memcpy(ev.key.val, key->val, 16); |
1467 | ev.key.pin_len = key->pin_len; | 1874 | ev.key.pin_len = key->pin_len; |
1468 | ev.old_key_type = old_key_type; | ||
1469 | 1875 | ||
1470 | return mgmt_event(MGMT_EV_NEW_KEY, index, &ev, sizeof(ev), NULL); | 1876 | return mgmt_event(MGMT_EV_NEW_KEY, index, &ev, sizeof(ev), NULL); |
1471 | } | 1877 | } |
@@ -1481,7 +1887,7 @@ int mgmt_connected(u16 index, bdaddr_t *bdaddr) | |||
1481 | 1887 | ||
1482 | static void disconnect_rsp(struct pending_cmd *cmd, void *data) | 1888 | static void disconnect_rsp(struct pending_cmd *cmd, void *data) |
1483 | { | 1889 | { |
1484 | struct mgmt_cp_disconnect *cp = cmd->cmd; | 1890 | struct mgmt_cp_disconnect *cp = cmd->param; |
1485 | struct sock **sk = data; | 1891 | struct sock **sk = data; |
1486 | struct mgmt_rp_disconnect rp; | 1892 | struct mgmt_rp_disconnect rp; |
1487 | 1893 | ||
@@ -1539,11 +1945,12 @@ int mgmt_connect_failed(u16 index, bdaddr_t *bdaddr, u8 status) | |||
1539 | return mgmt_event(MGMT_EV_CONNECT_FAILED, index, &ev, sizeof(ev), NULL); | 1945 | return mgmt_event(MGMT_EV_CONNECT_FAILED, index, &ev, sizeof(ev), NULL); |
1540 | } | 1946 | } |
1541 | 1947 | ||
1542 | int mgmt_pin_code_request(u16 index, bdaddr_t *bdaddr) | 1948 | int mgmt_pin_code_request(u16 index, bdaddr_t *bdaddr, u8 secure) |
1543 | { | 1949 | { |
1544 | struct mgmt_ev_pin_code_request ev; | 1950 | struct mgmt_ev_pin_code_request ev; |
1545 | 1951 | ||
1546 | bacpy(&ev.bdaddr, bdaddr); | 1952 | bacpy(&ev.bdaddr, bdaddr); |
1953 | ev.secure = secure; | ||
1547 | 1954 | ||
1548 | return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, index, &ev, sizeof(ev), | 1955 | return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, index, &ev, sizeof(ev), |
1549 | NULL); | 1956 | NULL); |
@@ -1591,13 +1998,15 @@ int mgmt_pin_code_neg_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status) | |||
1591 | return err; | 1998 | return err; |
1592 | } | 1999 | } |
1593 | 2000 | ||
1594 | int mgmt_user_confirm_request(u16 index, bdaddr_t *bdaddr, __le32 value) | 2001 | int mgmt_user_confirm_request(u16 index, bdaddr_t *bdaddr, __le32 value, |
2002 | u8 confirm_hint) | ||
1595 | { | 2003 | { |
1596 | struct mgmt_ev_user_confirm_request ev; | 2004 | struct mgmt_ev_user_confirm_request ev; |
1597 | 2005 | ||
1598 | BT_DBG("hci%u", index); | 2006 | BT_DBG("hci%u", index); |
1599 | 2007 | ||
1600 | bacpy(&ev.bdaddr, bdaddr); | 2008 | bacpy(&ev.bdaddr, bdaddr); |
2009 | ev.confirm_hint = confirm_hint; | ||
1601 | put_unaligned_le32(value, &ev.value); | 2010 | put_unaligned_le32(value, &ev.value); |
1602 | 2011 | ||
1603 | return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, index, &ev, sizeof(ev), | 2012 | return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, index, &ev, sizeof(ev), |
@@ -1645,3 +2054,110 @@ int mgmt_auth_failed(u16 index, bdaddr_t *bdaddr, u8 status) | |||
1645 | 2054 | ||
1646 | return mgmt_event(MGMT_EV_AUTH_FAILED, index, &ev, sizeof(ev), NULL); | 2055 | return mgmt_event(MGMT_EV_AUTH_FAILED, index, &ev, sizeof(ev), NULL); |
1647 | } | 2056 | } |
2057 | |||
2058 | int mgmt_set_local_name_complete(u16 index, u8 *name, u8 status) | ||
2059 | { | ||
2060 | struct pending_cmd *cmd; | ||
2061 | struct hci_dev *hdev; | ||
2062 | struct mgmt_cp_set_local_name ev; | ||
2063 | int err; | ||
2064 | |||
2065 | memset(&ev, 0, sizeof(ev)); | ||
2066 | memcpy(ev.name, name, HCI_MAX_NAME_LENGTH); | ||
2067 | |||
2068 | cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, index); | ||
2069 | if (!cmd) | ||
2070 | goto send_event; | ||
2071 | |||
2072 | if (status) { | ||
2073 | err = cmd_status(cmd->sk, index, MGMT_OP_SET_LOCAL_NAME, EIO); | ||
2074 | goto failed; | ||
2075 | } | ||
2076 | |||
2077 | hdev = hci_dev_get(index); | ||
2078 | if (hdev) { | ||
2079 | hci_dev_lock_bh(hdev); | ||
2080 | update_eir(hdev); | ||
2081 | hci_dev_unlock_bh(hdev); | ||
2082 | hci_dev_put(hdev); | ||
2083 | } | ||
2084 | |||
2085 | err = cmd_complete(cmd->sk, index, MGMT_OP_SET_LOCAL_NAME, &ev, | ||
2086 | sizeof(ev)); | ||
2087 | if (err < 0) | ||
2088 | goto failed; | ||
2089 | |||
2090 | send_event: | ||
2091 | err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, index, &ev, sizeof(ev), | ||
2092 | cmd ? cmd->sk : NULL); | ||
2093 | |||
2094 | failed: | ||
2095 | if (cmd) | ||
2096 | mgmt_pending_remove(cmd); | ||
2097 | return err; | ||
2098 | } | ||
2099 | |||
2100 | int mgmt_read_local_oob_data_reply_complete(u16 index, u8 *hash, u8 *randomizer, | ||
2101 | u8 status) | ||
2102 | { | ||
2103 | struct pending_cmd *cmd; | ||
2104 | int err; | ||
2105 | |||
2106 | BT_DBG("hci%u status %u", index, status); | ||
2107 | |||
2108 | cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, index); | ||
2109 | if (!cmd) | ||
2110 | return -ENOENT; | ||
2111 | |||
2112 | if (status) { | ||
2113 | err = cmd_status(cmd->sk, index, MGMT_OP_READ_LOCAL_OOB_DATA, | ||
2114 | EIO); | ||
2115 | } else { | ||
2116 | struct mgmt_rp_read_local_oob_data rp; | ||
2117 | |||
2118 | memcpy(rp.hash, hash, sizeof(rp.hash)); | ||
2119 | memcpy(rp.randomizer, randomizer, sizeof(rp.randomizer)); | ||
2120 | |||
2121 | err = cmd_complete(cmd->sk, index, MGMT_OP_READ_LOCAL_OOB_DATA, | ||
2122 | &rp, sizeof(rp)); | ||
2123 | } | ||
2124 | |||
2125 | mgmt_pending_remove(cmd); | ||
2126 | |||
2127 | return err; | ||
2128 | } | ||
2129 | |||
2130 | int mgmt_device_found(u16 index, bdaddr_t *bdaddr, u8 *dev_class, s8 rssi, | ||
2131 | u8 *eir) | ||
2132 | { | ||
2133 | struct mgmt_ev_device_found ev; | ||
2134 | |||
2135 | memset(&ev, 0, sizeof(ev)); | ||
2136 | |||
2137 | bacpy(&ev.bdaddr, bdaddr); | ||
2138 | memcpy(ev.dev_class, dev_class, sizeof(ev.dev_class)); | ||
2139 | ev.rssi = rssi; | ||
2140 | |||
2141 | if (eir) | ||
2142 | memcpy(ev.eir, eir, sizeof(ev.eir)); | ||
2143 | |||
2144 | return mgmt_event(MGMT_EV_DEVICE_FOUND, index, &ev, sizeof(ev), NULL); | ||
2145 | } | ||
2146 | |||
2147 | int mgmt_remote_name(u16 index, bdaddr_t *bdaddr, u8 *name) | ||
2148 | { | ||
2149 | struct mgmt_ev_remote_name ev; | ||
2150 | |||
2151 | memset(&ev, 0, sizeof(ev)); | ||
2152 | |||
2153 | bacpy(&ev.bdaddr, bdaddr); | ||
2154 | memcpy(ev.name, name, HCI_MAX_NAME_LENGTH); | ||
2155 | |||
2156 | return mgmt_event(MGMT_EV_REMOTE_NAME, index, &ev, sizeof(ev), NULL); | ||
2157 | } | ||
2158 | |||
2159 | int mgmt_discovering(u16 index, u8 discovering) | ||
2160 | { | ||
2161 | return mgmt_event(MGMT_EV_DISCOVERING, index, &discovering, | ||
2162 | sizeof(discovering), NULL); | ||
2163 | } | ||
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index c9973932456f..5759bb7054f7 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
@@ -232,6 +232,8 @@ static int rfcomm_l2sock_create(struct socket **sock) | |||
232 | static inline int rfcomm_check_security(struct rfcomm_dlc *d) | 232 | static inline int rfcomm_check_security(struct rfcomm_dlc *d) |
233 | { | 233 | { |
234 | struct sock *sk = d->session->sock->sk; | 234 | struct sock *sk = d->session->sock->sk; |
235 | struct l2cap_conn *conn = l2cap_pi(sk)->chan->conn; | ||
236 | |||
235 | __u8 auth_type; | 237 | __u8 auth_type; |
236 | 238 | ||
237 | switch (d->sec_level) { | 239 | switch (d->sec_level) { |
@@ -246,8 +248,7 @@ static inline int rfcomm_check_security(struct rfcomm_dlc *d) | |||
246 | break; | 248 | break; |
247 | } | 249 | } |
248 | 250 | ||
249 | return hci_conn_security(l2cap_pi(sk)->conn->hcon, d->sec_level, | 251 | return hci_conn_security(conn->hcon, d->sec_level, auth_type); |
250 | auth_type); | ||
251 | } | 252 | } |
252 | 253 | ||
253 | static void rfcomm_session_timeout(unsigned long arg) | 254 | static void rfcomm_session_timeout(unsigned long arg) |
@@ -710,10 +711,10 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, | |||
710 | /* Set L2CAP options */ | 711 | /* Set L2CAP options */ |
711 | sk = sock->sk; | 712 | sk = sock->sk; |
712 | lock_sock(sk); | 713 | lock_sock(sk); |
713 | l2cap_pi(sk)->imtu = l2cap_mtu; | 714 | l2cap_pi(sk)->chan->imtu = l2cap_mtu; |
714 | l2cap_pi(sk)->sec_level = sec_level; | 715 | l2cap_pi(sk)->chan->sec_level = sec_level; |
715 | if (l2cap_ertm) | 716 | if (l2cap_ertm) |
716 | l2cap_pi(sk)->mode = L2CAP_MODE_ERTM; | 717 | l2cap_pi(sk)->chan->mode = L2CAP_MODE_ERTM; |
717 | release_sock(sk); | 718 | release_sock(sk); |
718 | 719 | ||
719 | s = rfcomm_session_add(sock, BT_BOUND); | 720 | s = rfcomm_session_add(sock, BT_BOUND); |
@@ -1241,6 +1242,7 @@ static int rfcomm_recv_disc(struct rfcomm_session *s, u8 dlci) | |||
1241 | void rfcomm_dlc_accept(struct rfcomm_dlc *d) | 1242 | void rfcomm_dlc_accept(struct rfcomm_dlc *d) |
1242 | { | 1243 | { |
1243 | struct sock *sk = d->session->sock->sk; | 1244 | struct sock *sk = d->session->sock->sk; |
1245 | struct l2cap_conn *conn = l2cap_pi(sk)->chan->conn; | ||
1244 | 1246 | ||
1245 | BT_DBG("dlc %p", d); | 1247 | BT_DBG("dlc %p", d); |
1246 | 1248 | ||
@@ -1254,7 +1256,7 @@ void rfcomm_dlc_accept(struct rfcomm_dlc *d) | |||
1254 | rfcomm_dlc_unlock(d); | 1256 | rfcomm_dlc_unlock(d); |
1255 | 1257 | ||
1256 | if (d->role_switch) | 1258 | if (d->role_switch) |
1257 | hci_conn_switch_role(l2cap_pi(sk)->conn->hcon, 0x00); | 1259 | hci_conn_switch_role(conn->hcon, 0x00); |
1258 | 1260 | ||
1259 | rfcomm_send_msc(d->session, 1, d->dlci, d->v24_sig); | 1261 | rfcomm_send_msc(d->session, 1, d->dlci, d->v24_sig); |
1260 | } | 1262 | } |
@@ -1890,7 +1892,8 @@ static inline void rfcomm_accept_connection(struct rfcomm_session *s) | |||
1890 | 1892 | ||
1891 | /* We should adjust MTU on incoming sessions. | 1893 | /* We should adjust MTU on incoming sessions. |
1892 | * L2CAP MTU minus UIH header and FCS. */ | 1894 | * L2CAP MTU minus UIH header and FCS. */ |
1893 | s->mtu = min(l2cap_pi(nsock->sk)->omtu, l2cap_pi(nsock->sk)->imtu) - 5; | 1895 | s->mtu = min(l2cap_pi(nsock->sk)->chan->omtu, |
1896 | l2cap_pi(nsock->sk)->chan->imtu) - 5; | ||
1894 | 1897 | ||
1895 | rfcomm_schedule(); | 1898 | rfcomm_schedule(); |
1896 | } else | 1899 | } else |
@@ -1909,7 +1912,7 @@ static inline void rfcomm_check_connection(struct rfcomm_session *s) | |||
1909 | 1912 | ||
1910 | /* We can adjust MTU on outgoing sessions. | 1913 | /* We can adjust MTU on outgoing sessions. |
1911 | * L2CAP MTU minus UIH header and FCS. */ | 1914 | * L2CAP MTU minus UIH header and FCS. */ |
1912 | s->mtu = min(l2cap_pi(sk)->omtu, l2cap_pi(sk)->imtu) - 5; | 1915 | s->mtu = min(l2cap_pi(sk)->chan->omtu, l2cap_pi(sk)->chan->imtu) - 5; |
1913 | 1916 | ||
1914 | rfcomm_send_sabm(s, 0); | 1917 | rfcomm_send_sabm(s, 0); |
1915 | break; | 1918 | break; |
@@ -1992,7 +1995,7 @@ static int rfcomm_add_listener(bdaddr_t *ba) | |||
1992 | /* Set L2CAP options */ | 1995 | /* Set L2CAP options */ |
1993 | sk = sock->sk; | 1996 | sk = sock->sk; |
1994 | lock_sock(sk); | 1997 | lock_sock(sk); |
1995 | l2cap_pi(sk)->imtu = l2cap_mtu; | 1998 | l2cap_pi(sk)->chan->imtu = l2cap_mtu; |
1996 | release_sock(sk); | 1999 | release_sock(sk); |
1997 | 2000 | ||
1998 | /* Start listening on the socket */ | 2001 | /* Start listening on the socket */ |
@@ -2093,7 +2096,7 @@ static void rfcomm_security_cfm(struct hci_conn *conn, u8 status, u8 encrypt) | |||
2093 | if (!test_and_clear_bit(RFCOMM_AUTH_PENDING, &d->flags)) | 2096 | if (!test_and_clear_bit(RFCOMM_AUTH_PENDING, &d->flags)) |
2094 | continue; | 2097 | continue; |
2095 | 2098 | ||
2096 | if (!status) | 2099 | if (!status && hci_conn_check_secure(conn, d->sec_level)) |
2097 | set_bit(RFCOMM_AUTH_ACCEPT, &d->flags); | 2100 | set_bit(RFCOMM_AUTH_ACCEPT, &d->flags); |
2098 | else | 2101 | else |
2099 | set_bit(RFCOMM_AUTH_REJECT, &d->flags); | 2102 | set_bit(RFCOMM_AUTH_REJECT, &d->flags); |
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index 66cc1f0c3df8..386cfaffd4b7 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c | |||
@@ -743,6 +743,7 @@ static int rfcomm_sock_getsockopt_old(struct socket *sock, int optname, char __u | |||
743 | struct sock *sk = sock->sk; | 743 | struct sock *sk = sock->sk; |
744 | struct sock *l2cap_sk; | 744 | struct sock *l2cap_sk; |
745 | struct rfcomm_conninfo cinfo; | 745 | struct rfcomm_conninfo cinfo; |
746 | struct l2cap_conn *conn = l2cap_pi(sk)->chan->conn; | ||
746 | int len, err = 0; | 747 | int len, err = 0; |
747 | u32 opt; | 748 | u32 opt; |
748 | 749 | ||
@@ -787,8 +788,8 @@ static int rfcomm_sock_getsockopt_old(struct socket *sock, int optname, char __u | |||
787 | 788 | ||
788 | l2cap_sk = rfcomm_pi(sk)->dlc->session->sock->sk; | 789 | l2cap_sk = rfcomm_pi(sk)->dlc->session->sock->sk; |
789 | 790 | ||
790 | cinfo.hci_handle = l2cap_pi(l2cap_sk)->conn->hcon->handle; | 791 | cinfo.hci_handle = conn->hcon->handle; |
791 | memcpy(cinfo.dev_class, l2cap_pi(l2cap_sk)->conn->hcon->dev_class, 3); | 792 | memcpy(cinfo.dev_class, conn->hcon->dev_class, 3); |
792 | 793 | ||
793 | len = min_t(unsigned int, len, sizeof(cinfo)); | 794 | len = min_t(unsigned int, len, sizeof(cinfo)); |
794 | if (copy_to_user(optval, (char *) &cinfo, len)) | 795 | if (copy_to_user(optval, (char *) &cinfo, len)) |