Blame view

net/bluetooth/hci_sock.c 45.2 KB
8e87d1425   YOSHIFUJI Hideaki   [NET] BLUETOOTH: ...
1
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
6
7
8
9
10
11
12
13
14
     BlueZ - Bluetooth protocol stack for Linux
     Copyright (C) 2000-2001 Qualcomm Incorporated
  
     Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
  
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License version 2 as
     published by the Free Software Foundation;
  
     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
     IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
8e87d1425   YOSHIFUJI Hideaki   [NET] BLUETOOTH: ...
15
16
17
     CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
     WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
     OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
8e87d1425   YOSHIFUJI Hideaki   [NET] BLUETOOTH: ...
19
20
     ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
     COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
23
24
     SOFTWARE IS DISCLAIMED.
  */
  
  /* Bluetooth HCI sockets. */
7a6038b30   Arnd Bergmann   compat_ioctl: mov...
25
  #include <linux/compat.h>
8c520a599   Gustavo Padovan   Bluetooth: Remove...
26
  #include <linux/export.h>
787b306cf   Johannes Berg   Bluetooth: avoid ...
27
  #include <linux/utsname.h>
70ecce91e   Marcel Holtmann   Bluetooth: Store ...
28
  #include <linux/sched.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
30
31
32
  #include <asm/unaligned.h>
  
  #include <net/bluetooth/bluetooth.h>
  #include <net/bluetooth/hci_core.h>
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
33
  #include <net/bluetooth/hci_mon.h>
fa4335d71   Johan Hedberg   Bluetooth: Move g...
34
35
36
  #include <net/bluetooth/mgmt.h>
  
  #include "mgmt_util.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37

801c1e8da   Johan Hedberg   Bluetooth: Add mg...
38
39
  static LIST_HEAD(mgmt_chan_list);
  static DEFINE_MUTEX(mgmt_chan_list_lock);
70ecce91e   Marcel Holtmann   Bluetooth: Store ...
40
  static DEFINE_IDA(sock_cookie_ida);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
41
  static atomic_t monitor_promisc = ATOMIC_INIT(0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
  /* ----- HCI socket interface ----- */
863def58f   Marcel Holtmann   Bluetooth: Move s...
43
44
45
46
47
48
49
  /* Socket info */
  #define hci_pi(sk) ((struct hci_pinfo *) sk)
  
  struct hci_pinfo {
  	struct bt_sock    bt;
  	struct hci_dev    *hdev;
  	struct hci_filter filter;
32929e1f4   Alain Michaud   Bluetooth: Use on...
50
  	__u8              cmsg_mask;
863def58f   Marcel Holtmann   Bluetooth: Move s...
51
  	unsigned short    channel;
6befc6445   Marcel Holtmann   Bluetooth: Add fl...
52
  	unsigned long     flags;
70ecce91e   Marcel Holtmann   Bluetooth: Store ...
53
54
  	__u32             cookie;
  	char              comm[TASK_COMM_LEN];
863def58f   Marcel Holtmann   Bluetooth: Move s...
55
  };
6befc6445   Marcel Holtmann   Bluetooth: Add fl...
56
57
58
59
60
61
62
63
64
  void hci_sock_set_flag(struct sock *sk, int nr)
  {
  	set_bit(nr, &hci_pi(sk)->flags);
  }
  
  void hci_sock_clear_flag(struct sock *sk, int nr)
  {
  	clear_bit(nr, &hci_pi(sk)->flags);
  }
c85be545e   Marcel Holtmann   Bluetooth: Add hc...
65
66
67
68
  int hci_sock_test_flag(struct sock *sk, int nr)
  {
  	return test_bit(nr, &hci_pi(sk)->flags);
  }
d0f172b14   Johan Hedberg   Bluetooth: Add he...
69
70
71
72
  unsigned short hci_sock_get_channel(struct sock *sk)
  {
  	return hci_pi(sk)->channel;
  }
70ecce91e   Marcel Holtmann   Bluetooth: Store ...
73
74
75
76
  u32 hci_sock_get_cookie(struct sock *sk)
  {
  	return hci_pi(sk)->cookie;
  }
df1cb87af   Marcel Holtmann   Bluetooth: Introd...
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
  static bool hci_sock_gen_cookie(struct sock *sk)
  {
  	int id = hci_pi(sk)->cookie;
  
  	if (!id) {
  		id = ida_simple_get(&sock_cookie_ida, 1, 0, GFP_KERNEL);
  		if (id < 0)
  			id = 0xffffffff;
  
  		hci_pi(sk)->cookie = id;
  		get_task_comm(hci_pi(sk)->comm, current);
  		return true;
  	}
  
  	return false;
  }
  
  static void hci_sock_free_cookie(struct sock *sk)
  {
  	int id = hci_pi(sk)->cookie;
  
  	if (id) {
  		hci_pi(sk)->cookie = 0xffffffff;
  		ida_simple_remove(&sock_cookie_ida, id);
  	}
  }
9391976a4   Jiri Slaby   Bluetooth: make h...
103
  static inline int hci_test_bit(int nr, const void *addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104
  {
9391976a4   Jiri Slaby   Bluetooth: make h...
105
  	return *((const __u32 *) addr + (nr >> 5)) & ((__u32) 1 << (nr & 31));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106
107
108
  }
  
  /* Security filter */
3ad254f7f   Marcel Holtmann   Bluetooth: Move s...
109
110
111
112
113
114
115
  #define HCI_SFLT_MAX_OGF  5
  
  struct hci_sec_filter {
  	__u32 type_mask;
  	__u32 event_mask[2];
  	__u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
  };
7e67c112a   Marcel Holtmann   Bluetooth: Delcar...
116
  static const struct hci_sec_filter hci_sec_filter = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
118
119
  	/* Packet types */
  	0x10,
  	/* Events */
dd7f5527b   Marcel Holtmann   [Bluetooth] Updat...
120
  	{ 0x1000d9fe, 0x0000b00c },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
121
122
123
124
  	/* Commands */
  	{
  		{ 0x0 },
  		/* OGF_LINK_CTL */
7c631a676   Marcel Holtmann   [Bluetooth] Updat...
125
  		{ 0xbe000006, 0x00000001, 0x00000000, 0x00 },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
126
  		/* OGF_LINK_POLICY */
7c631a676   Marcel Holtmann   [Bluetooth] Updat...
127
  		{ 0x00005200, 0x00000000, 0x00000000, 0x00 },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
128
  		/* OGF_HOST_CTL */
7c631a676   Marcel Holtmann   [Bluetooth] Updat...
129
  		{ 0xaab00200, 0x2b402aaa, 0x05220154, 0x00 },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130
  		/* OGF_INFO_PARAM */
7c631a676   Marcel Holtmann   [Bluetooth] Updat...
131
  		{ 0x000002be, 0x00000000, 0x00000000, 0x00 },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132
  		/* OGF_STATUS_PARAM */
7c631a676   Marcel Holtmann   [Bluetooth] Updat...
133
  		{ 0x000000ea, 0x00000000, 0x00000000, 0x00 }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
135
136
137
  	}
  };
  
  static struct bt_sock_list hci_sk_list = {
d5fb2962c   Robert P. J. Day   bluetooth: replac...
138
  	.lock = __RW_LOCK_UNLOCKED(hci_sk_list.lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
139
  };
f81fe64f3   Marcel Holtmann   Bluetooth: Refact...
140
141
142
143
144
145
146
  static bool is_filtered_packet(struct sock *sk, struct sk_buff *skb)
  {
  	struct hci_filter *flt;
  	int flt_type, flt_event;
  
  	/* Apply filter */
  	flt = &hci_pi(sk)->filter;
d79f34e32   Marcel Holtmann   Bluetooth: Use ne...
147
  	flt_type = hci_skb_pkt_type(skb) & HCI_FLT_TYPE_BITS;
f81fe64f3   Marcel Holtmann   Bluetooth: Refact...
148
149
150
151
152
  
  	if (!test_bit(flt_type, &flt->type_mask))
  		return true;
  
  	/* Extra filter for event packets only */
d79f34e32   Marcel Holtmann   Bluetooth: Use ne...
153
  	if (hci_skb_pkt_type(skb) != HCI_EVENT_PKT)
f81fe64f3   Marcel Holtmann   Bluetooth: Refact...
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
  		return false;
  
  	flt_event = (*(__u8 *)skb->data & HCI_FLT_EVENT_BITS);
  
  	if (!hci_test_bit(flt_event, &flt->event_mask))
  		return true;
  
  	/* Check filter only when opcode is set */
  	if (!flt->opcode)
  		return false;
  
  	if (flt_event == HCI_EV_CMD_COMPLETE &&
  	    flt->opcode != get_unaligned((__le16 *)(skb->data + 3)))
  		return true;
  
  	if (flt_event == HCI_EV_CMD_STATUS &&
  	    flt->opcode != get_unaligned((__le16 *)(skb->data + 4)))
  		return true;
  
  	return false;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
175
  /* Send frame to RAW socket */
470fe1b54   Marcel Holtmann   Bluetooth: Split ...
176
  void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177
178
  {
  	struct sock *sk;
e0edf3733   Marcel Holtmann   Bluetooth: Fix is...
179
  	struct sk_buff *skb_copy = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
180
181
182
183
  
  	BT_DBG("hdev %p len %d", hdev, skb->len);
  
  	read_lock(&hci_sk_list.lock);
470fe1b54   Marcel Holtmann   Bluetooth: Split ...
184

b67bfe0d4   Sasha Levin   hlist: drop the n...
185
  	sk_for_each(sk, &hci_sk_list.head) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
187
188
189
190
191
192
193
  		struct sk_buff *nskb;
  
  		if (sk->sk_state != BT_BOUND || hci_pi(sk)->hdev != hdev)
  			continue;
  
  		/* Don't send frame to the socket it came from */
  		if (skb->sk == sk)
  			continue;
23500189d   Marcel Holtmann   Bluetooth: Introd...
194
  		if (hci_pi(sk)->channel == HCI_CHANNEL_RAW) {
d79f34e32   Marcel Holtmann   Bluetooth: Use ne...
195
196
197
  			if (hci_skb_pkt_type(skb) != HCI_COMMAND_PKT &&
  			    hci_skb_pkt_type(skb) != HCI_EVENT_PKT &&
  			    hci_skb_pkt_type(skb) != HCI_ACLDATA_PKT &&
cc9740036   Marcel Holtmann   Bluetooth: Add mi...
198
199
  			    hci_skb_pkt_type(skb) != HCI_SCODATA_PKT &&
  			    hci_skb_pkt_type(skb) != HCI_ISODATA_PKT)
bb77543eb   Marcel Holtmann   Bluetooth: Restri...
200
  				continue;
23500189d   Marcel Holtmann   Bluetooth: Introd...
201
202
203
204
205
  			if (is_filtered_packet(sk, skb))
  				continue;
  		} else if (hci_pi(sk)->channel == HCI_CHANNEL_USER) {
  			if (!bt_cb(skb)->incoming)
  				continue;
d79f34e32   Marcel Holtmann   Bluetooth: Use ne...
206
207
  			if (hci_skb_pkt_type(skb) != HCI_EVENT_PKT &&
  			    hci_skb_pkt_type(skb) != HCI_ACLDATA_PKT &&
cc9740036   Marcel Holtmann   Bluetooth: Add mi...
208
209
  			    hci_skb_pkt_type(skb) != HCI_SCODATA_PKT &&
  			    hci_skb_pkt_type(skb) != HCI_ISODATA_PKT)
23500189d   Marcel Holtmann   Bluetooth: Introd...
210
211
212
  				continue;
  		} else {
  			/* Don't send frame to other channel types */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
213
  			continue;
23500189d   Marcel Holtmann   Bluetooth: Introd...
214
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
215

e0edf3733   Marcel Holtmann   Bluetooth: Fix is...
216
217
  		if (!skb_copy) {
  			/* Create a private copy with headroom */
bad93e9d4   Octavian Purdila   net: add __pskb_c...
218
  			skb_copy = __pskb_copy_fclone(skb, 1, GFP_ATOMIC, true);
e0edf3733   Marcel Holtmann   Bluetooth: Fix is...
219
220
221
222
  			if (!skb_copy)
  				continue;
  
  			/* Put type byte before the data */
d79f34e32   Marcel Holtmann   Bluetooth: Use ne...
223
  			memcpy(skb_push(skb_copy, 1), &hci_skb_pkt_type(skb), 1);
e0edf3733   Marcel Holtmann   Bluetooth: Fix is...
224
225
226
  		}
  
  		nskb = skb_clone(skb_copy, GFP_ATOMIC);
70f23020e   Andrei Emeltchenko   Bluetooth: clean ...
227
  		if (!nskb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
228
  			continue;
470fe1b54   Marcel Holtmann   Bluetooth: Split ...
229
230
231
232
233
  		if (sock_queue_rcv_skb(sk, nskb))
  			kfree_skb(nskb);
  	}
  
  	read_unlock(&hci_sk_list.lock);
e0edf3733   Marcel Holtmann   Bluetooth: Fix is...
234
235
  
  	kfree_skb(skb_copy);
470fe1b54   Marcel Holtmann   Bluetooth: Split ...
236
  }
7129069e8   Johan Hedberg   Bluetooth: Rename...
237
  /* Send frame to sockets with specific channel */
a9ee77af7   Sebastian Andrzej Siewior   Bluetooth: avoid ...
238
239
  static void __hci_send_to_channel(unsigned short channel, struct sk_buff *skb,
  				  int flag, struct sock *skip_sk)
470fe1b54   Marcel Holtmann   Bluetooth: Split ...
240
241
  {
  	struct sock *sk;
470fe1b54   Marcel Holtmann   Bluetooth: Split ...
242

7129069e8   Johan Hedberg   Bluetooth: Rename...
243
  	BT_DBG("channel %u len %d", channel, skb->len);
470fe1b54   Marcel Holtmann   Bluetooth: Split ...
244

b67bfe0d4   Sasha Levin   hlist: drop the n...
245
  	sk_for_each(sk, &hci_sk_list.head) {
470fe1b54   Marcel Holtmann   Bluetooth: Split ...
246
  		struct sk_buff *nskb;
c08b1a1db   Marcel Holtmann   Bluetooth: Consol...
247
  		/* Ignore socket without the flag set */
c85be545e   Marcel Holtmann   Bluetooth: Add hc...
248
  		if (!hci_sock_test_flag(sk, flag))
d7f72f619   Marcel Holtmann   Bluetooth: Create...
249
  			continue;
c08b1a1db   Marcel Holtmann   Bluetooth: Consol...
250
251
  		/* Skip the original socket */
  		if (sk == skip_sk)
17711c629   Marcel Holtmann   Bluetooth: Provid...
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
  			continue;
  
  		if (sk->sk_state != BT_BOUND)
  			continue;
  
  		if (hci_pi(sk)->channel != channel)
  			continue;
  
  		nskb = skb_clone(skb, GFP_ATOMIC);
  		if (!nskb)
  			continue;
  
  		if (sock_queue_rcv_skb(sk, nskb))
  			kfree_skb(nskb);
  	}
a9ee77af7   Sebastian Andrzej Siewior   Bluetooth: avoid ...
267
268
269
270
271
272
273
  }
  
  void hci_send_to_channel(unsigned short channel, struct sk_buff *skb,
  			 int flag, struct sock *skip_sk)
  {
  	read_lock(&hci_sk_list.lock);
  	__hci_send_to_channel(channel, skb, flag, skip_sk);
17711c629   Marcel Holtmann   Bluetooth: Provid...
274
275
  	read_unlock(&hci_sk_list.lock);
  }
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
276
277
278
  /* Send frame to monitor socket */
  void hci_send_to_monitor(struct hci_dev *hdev, struct sk_buff *skb)
  {
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
279
  	struct sk_buff *skb_copy = NULL;
2b531294b   Marcel Holtmann   Bluetooth: Simpli...
280
  	struct hci_mon_hdr *hdr;
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
281
282
283
284
285
286
  	__le16 opcode;
  
  	if (!atomic_read(&monitor_promisc))
  		return;
  
  	BT_DBG("hdev %p len %d", hdev, skb->len);
d79f34e32   Marcel Holtmann   Bluetooth: Use ne...
287
  	switch (hci_skb_pkt_type(skb)) {
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
288
  	case HCI_COMMAND_PKT:
dcf4adbfd   Joe Perches   Bluetooth: Conver...
289
  		opcode = cpu_to_le16(HCI_MON_COMMAND_PKT);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
290
291
  		break;
  	case HCI_EVENT_PKT:
dcf4adbfd   Joe Perches   Bluetooth: Conver...
292
  		opcode = cpu_to_le16(HCI_MON_EVENT_PKT);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
293
294
295
  		break;
  	case HCI_ACLDATA_PKT:
  		if (bt_cb(skb)->incoming)
dcf4adbfd   Joe Perches   Bluetooth: Conver...
296
  			opcode = cpu_to_le16(HCI_MON_ACL_RX_PKT);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
297
  		else
dcf4adbfd   Joe Perches   Bluetooth: Conver...
298
  			opcode = cpu_to_le16(HCI_MON_ACL_TX_PKT);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
299
300
301
  		break;
  	case HCI_SCODATA_PKT:
  		if (bt_cb(skb)->incoming)
dcf4adbfd   Joe Perches   Bluetooth: Conver...
302
  			opcode = cpu_to_le16(HCI_MON_SCO_RX_PKT);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
303
  		else
dcf4adbfd   Joe Perches   Bluetooth: Conver...
304
  			opcode = cpu_to_le16(HCI_MON_SCO_TX_PKT);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
305
  		break;
f9a619db7   Luiz Augusto von Dentz   Bluetooth: monito...
306
307
308
309
310
311
  	case HCI_ISODATA_PKT:
  		if (bt_cb(skb)->incoming)
  			opcode = cpu_to_le16(HCI_MON_ISO_RX_PKT);
  		else
  			opcode = cpu_to_le16(HCI_MON_ISO_TX_PKT);
  		break;
e875ff840   Marcel Holtmann   Bluetooth: Add su...
312
313
314
  	case HCI_DIAG_PKT:
  		opcode = cpu_to_le16(HCI_MON_VENDOR_DIAG);
  		break;
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
315
316
317
  	default:
  		return;
  	}
2b531294b   Marcel Holtmann   Bluetooth: Simpli...
318
319
320
321
322
323
  	/* Create a private copy with headroom */
  	skb_copy = __pskb_copy_fclone(skb, HCI_MON_HDR_SIZE, GFP_ATOMIC, true);
  	if (!skb_copy)
  		return;
  
  	/* Put header before the data */
d58ff3512   Johannes Berg   networking: make ...
324
  	hdr = skb_push(skb_copy, HCI_MON_HDR_SIZE);
2b531294b   Marcel Holtmann   Bluetooth: Simpli...
325
326
327
  	hdr->opcode = opcode;
  	hdr->index = cpu_to_le16(hdev->id);
  	hdr->len = cpu_to_le16(skb->len);
c08b1a1db   Marcel Holtmann   Bluetooth: Consol...
328
329
  	hci_send_to_channel(HCI_CHANNEL_MONITOR, skb_copy,
  			    HCI_SOCK_TRUSTED, NULL);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
330
331
  	kfree_skb(skb_copy);
  }
38ceaa00d   Marcel Holtmann   Bluetooth: Add su...
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
  void hci_send_monitor_ctrl_event(struct hci_dev *hdev, u16 event,
  				 void *data, u16 data_len, ktime_t tstamp,
  				 int flag, struct sock *skip_sk)
  {
  	struct sock *sk;
  	__le16 index;
  
  	if (hdev)
  		index = cpu_to_le16(hdev->id);
  	else
  		index = cpu_to_le16(MGMT_INDEX_NONE);
  
  	read_lock(&hci_sk_list.lock);
  
  	sk_for_each(sk, &hci_sk_list.head) {
  		struct hci_mon_hdr *hdr;
  		struct sk_buff *skb;
  
  		if (hci_pi(sk)->channel != HCI_CHANNEL_CONTROL)
  			continue;
  
  		/* Ignore socket without the flag set */
  		if (!hci_sock_test_flag(sk, flag))
  			continue;
  
  		/* Skip the original socket */
  		if (sk == skip_sk)
  			continue;
  
  		skb = bt_skb_alloc(6 + data_len, GFP_ATOMIC);
  		if (!skb)
  			continue;
  
  		put_unaligned_le32(hci_pi(sk)->cookie, skb_put(skb, 4));
  		put_unaligned_le16(event, skb_put(skb, 2));
  
  		if (data)
59ae1d127   Johannes Berg   networking: intro...
369
  			skb_put_data(skb, data, data_len);
38ceaa00d   Marcel Holtmann   Bluetooth: Add su...
370
371
  
  		skb->tstamp = tstamp;
d58ff3512   Johannes Berg   networking: make ...
372
  		hdr = skb_push(skb, HCI_MON_HDR_SIZE);
38ceaa00d   Marcel Holtmann   Bluetooth: Add su...
373
374
375
  		hdr->opcode = cpu_to_le16(HCI_MON_CTRL_EVENT);
  		hdr->index = index;
  		hdr->len = cpu_to_le16(skb->len - HCI_MON_HDR_SIZE);
a9ee77af7   Sebastian Andrzej Siewior   Bluetooth: avoid ...
376
377
  		__hci_send_to_channel(HCI_CHANNEL_MONITOR, skb,
  				      HCI_SOCK_TRUSTED, NULL);
38ceaa00d   Marcel Holtmann   Bluetooth: Add su...
378
379
380
381
382
  		kfree_skb(skb);
  	}
  
  	read_unlock(&hci_sk_list.lock);
  }
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
383
384
385
386
  static struct sk_buff *create_monitor_event(struct hci_dev *hdev, int event)
  {
  	struct hci_mon_hdr *hdr;
  	struct hci_mon_new_index *ni;
6c566dd5a   Marcel Holtmann   Bluetooth: Send i...
387
  	struct hci_mon_index_info *ii;
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
388
389
390
391
392
393
394
395
  	struct sk_buff *skb;
  	__le16 opcode;
  
  	switch (event) {
  	case HCI_DEV_REG:
  		skb = bt_skb_alloc(HCI_MON_NEW_INDEX_SIZE, GFP_ATOMIC);
  		if (!skb)
  			return NULL;
4df864c1d   Johannes Berg   networking: make ...
396
  		ni = skb_put(skb, HCI_MON_NEW_INDEX_SIZE);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
397
398
399
400
  		ni->type = hdev->dev_type;
  		ni->bus = hdev->bus;
  		bacpy(&ni->bdaddr, &hdev->bdaddr);
  		memcpy(ni->name, hdev->name, 8);
dcf4adbfd   Joe Perches   Bluetooth: Conver...
401
  		opcode = cpu_to_le16(HCI_MON_NEW_INDEX);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
402
403
404
405
406
407
  		break;
  
  	case HCI_DEV_UNREG:
  		skb = bt_skb_alloc(0, GFP_ATOMIC);
  		if (!skb)
  			return NULL;
dcf4adbfd   Joe Perches   Bluetooth: Conver...
408
  		opcode = cpu_to_le16(HCI_MON_DEL_INDEX);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
409
  		break;
e131d74a3   Marcel Holtmann   Bluetooth: Add su...
410
411
412
  	case HCI_DEV_SETUP:
  		if (hdev->manufacturer == 0xffff)
  			return NULL;
19186c7b4   Gustavo A. R. Silva   Bluetooth: core: ...
413
  		fallthrough;
e131d74a3   Marcel Holtmann   Bluetooth: Add su...
414

6c566dd5a   Marcel Holtmann   Bluetooth: Send i...
415
416
417
418
  	case HCI_DEV_UP:
  		skb = bt_skb_alloc(HCI_MON_INDEX_INFO_SIZE, GFP_ATOMIC);
  		if (!skb)
  			return NULL;
4df864c1d   Johannes Berg   networking: make ...
419
  		ii = skb_put(skb, HCI_MON_INDEX_INFO_SIZE);
6c566dd5a   Marcel Holtmann   Bluetooth: Send i...
420
421
422
423
424
  		bacpy(&ii->bdaddr, &hdev->bdaddr);
  		ii->manufacturer = cpu_to_le16(hdev->manufacturer);
  
  		opcode = cpu_to_le16(HCI_MON_INDEX_INFO);
  		break;
22db3cbcf   Marcel Holtmann   Bluetooth: Send t...
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
  	case HCI_DEV_OPEN:
  		skb = bt_skb_alloc(0, GFP_ATOMIC);
  		if (!skb)
  			return NULL;
  
  		opcode = cpu_to_le16(HCI_MON_OPEN_INDEX);
  		break;
  
  	case HCI_DEV_CLOSE:
  		skb = bt_skb_alloc(0, GFP_ATOMIC);
  		if (!skb)
  			return NULL;
  
  		opcode = cpu_to_le16(HCI_MON_CLOSE_INDEX);
  		break;
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
440
441
442
443
444
  	default:
  		return NULL;
  	}
  
  	__net_timestamp(skb);
d58ff3512   Johannes Berg   networking: make ...
445
  	hdr = skb_push(skb, HCI_MON_HDR_SIZE);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
446
447
448
449
450
451
  	hdr->opcode = opcode;
  	hdr->index = cpu_to_le16(hdev->id);
  	hdr->len = cpu_to_le16(skb->len - HCI_MON_HDR_SIZE);
  
  	return skb;
  }
249fa1699   Marcel Holtmann   Bluetooth: Add su...
452
453
454
455
  static struct sk_buff *create_monitor_ctrl_open(struct sock *sk)
  {
  	struct hci_mon_hdr *hdr;
  	struct sk_buff *skb;
d0bef1d26   Marcel Holtmann   Bluetooth: Add ex...
456
  	u16 format;
249fa1699   Marcel Holtmann   Bluetooth: Add su...
457
458
  	u8 ver[3];
  	u32 flags;
0ef2c42f8   Marcel Holtmann   Bluetooth: Send c...
459
460
461
  	/* No message needed when cookie is not present */
  	if (!hci_pi(sk)->cookie)
  		return NULL;
d0bef1d26   Marcel Holtmann   Bluetooth: Add ex...
462
  	switch (hci_pi(sk)->channel) {
f81f5b2db   Marcel Holtmann   Bluetooth: Send c...
463
464
465
466
467
  	case HCI_CHANNEL_RAW:
  		format = 0x0000;
  		ver[0] = BT_SUBSYS_VERSION;
  		put_unaligned_le16(BT_SUBSYS_REVISION, ver + 1);
  		break;
aa1638dde   Marcel Holtmann   Bluetooth: Send c...
468
469
470
471
472
  	case HCI_CHANNEL_USER:
  		format = 0x0001;
  		ver[0] = BT_SUBSYS_VERSION;
  		put_unaligned_le16(BT_SUBSYS_REVISION, ver + 1);
  		break;
d0bef1d26   Marcel Holtmann   Bluetooth: Add ex...
473
474
475
476
477
478
479
480
  	case HCI_CHANNEL_CONTROL:
  		format = 0x0002;
  		mgmt_fill_version_info(ver);
  		break;
  	default:
  		/* No message for unsupported format */
  		return NULL;
  	}
249fa1699   Marcel Holtmann   Bluetooth: Add su...
481
482
483
  	skb = bt_skb_alloc(14 + TASK_COMM_LEN , GFP_ATOMIC);
  	if (!skb)
  		return NULL;
249fa1699   Marcel Holtmann   Bluetooth: Add su...
484
485
486
487
  	flags = hci_sock_test_flag(sk, HCI_SOCK_TRUSTED) ? 0x1 : 0x0;
  
  	put_unaligned_le32(hci_pi(sk)->cookie, skb_put(skb, 4));
  	put_unaligned_le16(format, skb_put(skb, 2));
59ae1d127   Johannes Berg   networking: intro...
488
  	skb_put_data(skb, ver, sizeof(ver));
249fa1699   Marcel Holtmann   Bluetooth: Add su...
489
  	put_unaligned_le32(flags, skb_put(skb, 4));
634fef610   Johannes Berg   networking: add a...
490
  	skb_put_u8(skb, TASK_COMM_LEN);
59ae1d127   Johannes Berg   networking: intro...
491
  	skb_put_data(skb, hci_pi(sk)->comm, TASK_COMM_LEN);
249fa1699   Marcel Holtmann   Bluetooth: Add su...
492
493
  
  	__net_timestamp(skb);
d58ff3512   Johannes Berg   networking: make ...
494
  	hdr = skb_push(skb, HCI_MON_HDR_SIZE);
249fa1699   Marcel Holtmann   Bluetooth: Add su...
495
  	hdr->opcode = cpu_to_le16(HCI_MON_CTRL_OPEN);
0ef2c42f8   Marcel Holtmann   Bluetooth: Send c...
496
497
498
499
  	if (hci_pi(sk)->hdev)
  		hdr->index = cpu_to_le16(hci_pi(sk)->hdev->id);
  	else
  		hdr->index = cpu_to_le16(HCI_DEV_NONE);
249fa1699   Marcel Holtmann   Bluetooth: Add su...
500
501
502
503
504
505
506
507
508
  	hdr->len = cpu_to_le16(skb->len - HCI_MON_HDR_SIZE);
  
  	return skb;
  }
  
  static struct sk_buff *create_monitor_ctrl_close(struct sock *sk)
  {
  	struct hci_mon_hdr *hdr;
  	struct sk_buff *skb;
0ef2c42f8   Marcel Holtmann   Bluetooth: Send c...
509
510
511
  	/* No message needed when cookie is not present */
  	if (!hci_pi(sk)->cookie)
  		return NULL;
d0bef1d26   Marcel Holtmann   Bluetooth: Add ex...
512
  	switch (hci_pi(sk)->channel) {
f81f5b2db   Marcel Holtmann   Bluetooth: Send c...
513
  	case HCI_CHANNEL_RAW:
aa1638dde   Marcel Holtmann   Bluetooth: Send c...
514
  	case HCI_CHANNEL_USER:
d0bef1d26   Marcel Holtmann   Bluetooth: Add ex...
515
516
517
518
519
520
  	case HCI_CHANNEL_CONTROL:
  		break;
  	default:
  		/* No message for unsupported format */
  		return NULL;
  	}
249fa1699   Marcel Holtmann   Bluetooth: Add su...
521
522
523
524
525
526
527
  	skb = bt_skb_alloc(4, GFP_ATOMIC);
  	if (!skb)
  		return NULL;
  
  	put_unaligned_le32(hci_pi(sk)->cookie, skb_put(skb, 4));
  
  	__net_timestamp(skb);
d58ff3512   Johannes Berg   networking: make ...
528
  	hdr = skb_push(skb, HCI_MON_HDR_SIZE);
249fa1699   Marcel Holtmann   Bluetooth: Add su...
529
  	hdr->opcode = cpu_to_le16(HCI_MON_CTRL_CLOSE);
0ef2c42f8   Marcel Holtmann   Bluetooth: Send c...
530
531
532
533
  	if (hci_pi(sk)->hdev)
  		hdr->index = cpu_to_le16(hci_pi(sk)->hdev->id);
  	else
  		hdr->index = cpu_to_le16(HCI_DEV_NONE);
249fa1699   Marcel Holtmann   Bluetooth: Add su...
534
535
536
537
  	hdr->len = cpu_to_le16(skb->len - HCI_MON_HDR_SIZE);
  
  	return skb;
  }
38ceaa00d   Marcel Holtmann   Bluetooth: Add su...
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
  static struct sk_buff *create_monitor_ctrl_command(struct sock *sk, u16 index,
  						   u16 opcode, u16 len,
  						   const void *buf)
  {
  	struct hci_mon_hdr *hdr;
  	struct sk_buff *skb;
  
  	skb = bt_skb_alloc(6 + len, GFP_ATOMIC);
  	if (!skb)
  		return NULL;
  
  	put_unaligned_le32(hci_pi(sk)->cookie, skb_put(skb, 4));
  	put_unaligned_le16(opcode, skb_put(skb, 2));
  
  	if (buf)
59ae1d127   Johannes Berg   networking: intro...
553
  		skb_put_data(skb, buf, len);
38ceaa00d   Marcel Holtmann   Bluetooth: Add su...
554
555
  
  	__net_timestamp(skb);
d58ff3512   Johannes Berg   networking: make ...
556
  	hdr = skb_push(skb, HCI_MON_HDR_SIZE);
38ceaa00d   Marcel Holtmann   Bluetooth: Add su...
557
558
559
560
561
562
  	hdr->opcode = cpu_to_le16(HCI_MON_CTRL_COMMAND);
  	hdr->index = cpu_to_le16(index);
  	hdr->len = cpu_to_le16(skb->len - HCI_MON_HDR_SIZE);
  
  	return skb;
  }
787b306cf   Johannes Berg   Bluetooth: avoid ...
563
564
  static void __printf(2, 3)
  send_monitor_note(struct sock *sk, const char *fmt, ...)
dd31506d4   Marcel Holtmann   Bluetooth: Add su...
565
  {
787b306cf   Johannes Berg   Bluetooth: avoid ...
566
  	size_t len;
dd31506d4   Marcel Holtmann   Bluetooth: Add su...
567
568
  	struct hci_mon_hdr *hdr;
  	struct sk_buff *skb;
787b306cf   Johannes Berg   Bluetooth: avoid ...
569
570
571
572
573
  	va_list args;
  
  	va_start(args, fmt);
  	len = vsnprintf(NULL, 0, fmt, args);
  	va_end(args);
dd31506d4   Marcel Holtmann   Bluetooth: Add su...
574
575
576
577
  
  	skb = bt_skb_alloc(len + 1, GFP_ATOMIC);
  	if (!skb)
  		return;
787b306cf   Johannes Berg   Bluetooth: avoid ...
578
579
  	va_start(args, fmt);
  	vsprintf(skb_put(skb, len), fmt, args);
4df864c1d   Johannes Berg   networking: make ...
580
  	*(u8 *)skb_put(skb, 1) = 0;
787b306cf   Johannes Berg   Bluetooth: avoid ...
581
  	va_end(args);
dd31506d4   Marcel Holtmann   Bluetooth: Add su...
582
583
584
585
586
587
588
589
590
591
592
  
  	__net_timestamp(skb);
  
  	hdr = (void *)skb_push(skb, HCI_MON_HDR_SIZE);
  	hdr->opcode = cpu_to_le16(HCI_MON_SYSTEM_NOTE);
  	hdr->index = cpu_to_le16(HCI_DEV_NONE);
  	hdr->len = cpu_to_le16(skb->len - HCI_MON_HDR_SIZE);
  
  	if (sock_queue_rcv_skb(sk, skb))
  		kfree_skb(skb);
  }
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
  static void send_monitor_replay(struct sock *sk)
  {
  	struct hci_dev *hdev;
  
  	read_lock(&hci_dev_list_lock);
  
  	list_for_each_entry(hdev, &hci_dev_list, list) {
  		struct sk_buff *skb;
  
  		skb = create_monitor_event(hdev, HCI_DEV_REG);
  		if (!skb)
  			continue;
  
  		if (sock_queue_rcv_skb(sk, skb))
  			kfree_skb(skb);
22db3cbcf   Marcel Holtmann   Bluetooth: Send t...
608
609
610
611
612
613
614
615
616
617
  
  		if (!test_bit(HCI_RUNNING, &hdev->flags))
  			continue;
  
  		skb = create_monitor_event(hdev, HCI_DEV_OPEN);
  		if (!skb)
  			continue;
  
  		if (sock_queue_rcv_skb(sk, skb))
  			kfree_skb(skb);
6c566dd5a   Marcel Holtmann   Bluetooth: Send i...
618

e131d74a3   Marcel Holtmann   Bluetooth: Add su...
619
620
621
622
623
624
  		if (test_bit(HCI_UP, &hdev->flags))
  			skb = create_monitor_event(hdev, HCI_DEV_UP);
  		else if (hci_dev_test_flag(hdev, HCI_SETUP))
  			skb = create_monitor_event(hdev, HCI_DEV_SETUP);
  		else
  			skb = NULL;
6c566dd5a   Marcel Holtmann   Bluetooth: Send i...
625

e131d74a3   Marcel Holtmann   Bluetooth: Add su...
626
627
628
629
  		if (skb) {
  			if (sock_queue_rcv_skb(sk, skb))
  				kfree_skb(skb);
  		}
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
630
631
632
633
  	}
  
  	read_unlock(&hci_dev_list_lock);
  }
249fa1699   Marcel Holtmann   Bluetooth: Add su...
634
635
636
637
638
639
640
641
  static void send_monitor_control_replay(struct sock *mon_sk)
  {
  	struct sock *sk;
  
  	read_lock(&hci_sk_list.lock);
  
  	sk_for_each(sk, &hci_sk_list.head) {
  		struct sk_buff *skb;
249fa1699   Marcel Holtmann   Bluetooth: Add su...
642
643
644
645
646
647
648
649
650
651
  		skb = create_monitor_ctrl_open(sk);
  		if (!skb)
  			continue;
  
  		if (sock_queue_rcv_skb(mon_sk, skb))
  			kfree_skb(skb);
  	}
  
  	read_unlock(&hci_sk_list.lock);
  }
040030ef7   Marcel Holtmann   Bluetooth: Remove...
652
653
654
655
656
657
658
659
660
661
  /* Generate internal stack event */
  static void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data)
  {
  	struct hci_event_hdr *hdr;
  	struct hci_ev_stack_internal *ev;
  	struct sk_buff *skb;
  
  	skb = bt_skb_alloc(HCI_EVENT_HDR_SIZE + sizeof(*ev) + dlen, GFP_ATOMIC);
  	if (!skb)
  		return;
4df864c1d   Johannes Berg   networking: make ...
662
  	hdr = skb_put(skb, HCI_EVENT_HDR_SIZE);
040030ef7   Marcel Holtmann   Bluetooth: Remove...
663
664
  	hdr->evt  = HCI_EV_STACK_INTERNAL;
  	hdr->plen = sizeof(*ev) + dlen;
4df864c1d   Johannes Berg   networking: make ...
665
  	ev = skb_put(skb, sizeof(*ev) + dlen);
040030ef7   Marcel Holtmann   Bluetooth: Remove...
666
667
668
669
670
  	ev->type = type;
  	memcpy(ev->data, data, dlen);
  
  	bt_cb(skb)->incoming = 1;
  	__net_timestamp(skb);
d79f34e32   Marcel Holtmann   Bluetooth: Use ne...
671
  	hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
040030ef7   Marcel Holtmann   Bluetooth: Remove...
672
673
674
675
676
677
  	hci_send_to_sock(hdev, skb);
  	kfree_skb(skb);
  }
  
  void hci_sock_dev_event(struct hci_dev *hdev, int event)
  {
040030ef7   Marcel Holtmann   Bluetooth: Remove...
678
  	BT_DBG("hdev %s event %d", hdev->name, event);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
679
680
  	if (atomic_read(&monitor_promisc)) {
  		struct sk_buff *skb;
ed1b28a48   Marcel Holtmann   Bluetooth: Limit ...
681
  		/* Send event to monitor */
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
682
683
  		skb = create_monitor_event(hdev, event);
  		if (skb) {
c08b1a1db   Marcel Holtmann   Bluetooth: Consol...
684
685
  			hci_send_to_channel(HCI_CHANNEL_MONITOR, skb,
  					    HCI_SOCK_TRUSTED, NULL);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
686
687
688
  			kfree_skb(skb);
  		}
  	}
ed1b28a48   Marcel Holtmann   Bluetooth: Limit ...
689
690
691
692
693
694
695
696
  	if (event <= HCI_DEV_DOWN) {
  		struct hci_ev_si_device ev;
  
  		/* Send event to sockets */
  		ev.event  = event;
  		ev.dev_id = hdev->id;
  		hci_si_event(NULL, HCI_EV_SI_DEVICE, sizeof(ev), &ev);
  	}
040030ef7   Marcel Holtmann   Bluetooth: Remove...
697
698
699
  
  	if (event == HCI_DEV_UNREG) {
  		struct sock *sk;
040030ef7   Marcel Holtmann   Bluetooth: Remove...
700
701
702
  
  		/* Detach sockets from device */
  		read_lock(&hci_sk_list.lock);
b67bfe0d4   Sasha Levin   hlist: drop the n...
703
  		sk_for_each(sk, &hci_sk_list.head) {
040030ef7   Marcel Holtmann   Bluetooth: Remove...
704
705
706
707
708
709
710
711
712
713
714
715
716
717
  			bh_lock_sock_nested(sk);
  			if (hci_pi(sk)->hdev == hdev) {
  				hci_pi(sk)->hdev = NULL;
  				sk->sk_err = EPIPE;
  				sk->sk_state = BT_OPEN;
  				sk->sk_state_change(sk);
  
  				hci_dev_put(hdev);
  			}
  			bh_unlock_sock(sk);
  		}
  		read_unlock(&hci_sk_list.lock);
  	}
  }
801c1e8da   Johan Hedberg   Bluetooth: Add mg...
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
  static struct hci_mgmt_chan *__hci_mgmt_chan_find(unsigned short channel)
  {
  	struct hci_mgmt_chan *c;
  
  	list_for_each_entry(c, &mgmt_chan_list, list) {
  		if (c->channel == channel)
  			return c;
  	}
  
  	return NULL;
  }
  
  static struct hci_mgmt_chan *hci_mgmt_chan_find(unsigned short channel)
  {
  	struct hci_mgmt_chan *c;
  
  	mutex_lock(&mgmt_chan_list_lock);
  	c = __hci_mgmt_chan_find(channel);
  	mutex_unlock(&mgmt_chan_list_lock);
  
  	return c;
  }
  
  int hci_mgmt_chan_register(struct hci_mgmt_chan *c)
  {
  	if (c->channel < HCI_CHANNEL_CONTROL)
  		return -EINVAL;
  
  	mutex_lock(&mgmt_chan_list_lock);
  	if (__hci_mgmt_chan_find(c->channel)) {
  		mutex_unlock(&mgmt_chan_list_lock);
  		return -EALREADY;
  	}
  
  	list_add_tail(&c->list, &mgmt_chan_list);
  
  	mutex_unlock(&mgmt_chan_list_lock);
  
  	return 0;
  }
  EXPORT_SYMBOL(hci_mgmt_chan_register);
  
  void hci_mgmt_chan_unregister(struct hci_mgmt_chan *c)
  {
  	mutex_lock(&mgmt_chan_list_lock);
  	list_del(&c->list);
  	mutex_unlock(&mgmt_chan_list_lock);
  }
  EXPORT_SYMBOL(hci_mgmt_chan_unregister);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
767
768
769
  static int hci_sock_release(struct socket *sock)
  {
  	struct sock *sk = sock->sk;
7b005bd34   Marcel Holtmann   [Bluetooth] Fix N...
770
  	struct hci_dev *hdev;
249fa1699   Marcel Holtmann   Bluetooth: Add su...
771
  	struct sk_buff *skb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
772
773
774
775
776
  
  	BT_DBG("sock %p sk %p", sock, sk);
  
  	if (!sk)
  		return 0;
11eb85ec4   Dan Carpenter   Bluetooth: Fix ra...
777
  	lock_sock(sk);
70ecce91e   Marcel Holtmann   Bluetooth: Store ...
778
779
  	switch (hci_pi(sk)->channel) {
  	case HCI_CHANNEL_MONITOR:
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
780
  		atomic_dec(&monitor_promisc);
70ecce91e   Marcel Holtmann   Bluetooth: Store ...
781
  		break;
f81f5b2db   Marcel Holtmann   Bluetooth: Send c...
782
  	case HCI_CHANNEL_RAW:
aa1638dde   Marcel Holtmann   Bluetooth: Send c...
783
  	case HCI_CHANNEL_USER:
70ecce91e   Marcel Holtmann   Bluetooth: Store ...
784
  	case HCI_CHANNEL_CONTROL:
249fa1699   Marcel Holtmann   Bluetooth: Add su...
785
786
787
788
789
790
791
  		/* Send event to monitor */
  		skb = create_monitor_ctrl_close(sk);
  		if (skb) {
  			hci_send_to_channel(HCI_CHANNEL_MONITOR, skb,
  					    HCI_SOCK_TRUSTED, NULL);
  			kfree_skb(skb);
  		}
df1cb87af   Marcel Holtmann   Bluetooth: Introd...
792
  		hci_sock_free_cookie(sk);
70ecce91e   Marcel Holtmann   Bluetooth: Store ...
793
794
  		break;
  	}
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
795

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
796
  	bt_sock_unlink(&hci_sk_list, sk);
e20a2e9c4   Myungho Jung   Bluetooth: Fix de...
797
  	hdev = hci_pi(sk)->hdev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
798
  	if (hdev) {
23500189d   Marcel Holtmann   Bluetooth: Introd...
799
  		if (hci_pi(sk)->channel == HCI_CHANNEL_USER) {
9332ef9db   Masahiro Yamada   scripts/spelling....
800
  			/* When releasing a user channel exclusive access,
6b3cc1db6   Simon Fels   Bluetooth: close ...
801
802
803
804
805
806
807
808
809
  			 * call hci_dev_do_close directly instead of calling
  			 * hci_dev_close to ensure the exclusive access will
  			 * be released and the controller brought back down.
  			 *
  			 * The checking of HCI_AUTO_OFF is not needed in this
  			 * case since it will have been cleared already when
  			 * opening the user channel.
  			 */
  			hci_dev_do_close(hdev);
9380f9eac   Loic Poulain   Bluetooth: Reorde...
810
811
  			hci_dev_clear_flag(hdev, HCI_USER_CHANNEL);
  			mgmt_index_added(hdev);
23500189d   Marcel Holtmann   Bluetooth: Introd...
812
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
813
814
815
816
817
818
819
820
  		atomic_dec(&hdev->promisc);
  		hci_dev_put(hdev);
  	}
  
  	sock_orphan(sk);
  
  	skb_queue_purge(&sk->sk_receive_queue);
  	skb_queue_purge(&sk->sk_write_queue);
11eb85ec4   Dan Carpenter   Bluetooth: Fix ra...
821
  	release_sock(sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
822
823
824
  	sock_put(sk);
  	return 0;
  }
b2a66aad8   Antti Julku   Bluetooth: Move b...
825
  static int hci_sock_blacklist_add(struct hci_dev *hdev, void __user *arg)
f03585689   Johan Hedberg   Bluetooth: Add bl...
826
827
  {
  	bdaddr_t bdaddr;
5e762444b   Antti Julku   Bluetooth: Add mg...
828
  	int err;
f03585689   Johan Hedberg   Bluetooth: Add bl...
829
830
831
  
  	if (copy_from_user(&bdaddr, arg, sizeof(bdaddr)))
  		return -EFAULT;
09fd0de5b   Gustavo F. Padovan   Bluetooth: Replac...
832
  	hci_dev_lock(hdev);
5e762444b   Antti Julku   Bluetooth: Add mg...
833

dcc36c16c   Johan Hedberg   Bluetooth: Unify ...
834
  	err = hci_bdaddr_list_add(&hdev->blacklist, &bdaddr, BDADDR_BREDR);
5e762444b   Antti Julku   Bluetooth: Add mg...
835

09fd0de5b   Gustavo F. Padovan   Bluetooth: Replac...
836
  	hci_dev_unlock(hdev);
5e762444b   Antti Julku   Bluetooth: Add mg...
837
838
  
  	return err;
f03585689   Johan Hedberg   Bluetooth: Add bl...
839
  }
b2a66aad8   Antti Julku   Bluetooth: Move b...
840
  static int hci_sock_blacklist_del(struct hci_dev *hdev, void __user *arg)
f03585689   Johan Hedberg   Bluetooth: Add bl...
841
842
  {
  	bdaddr_t bdaddr;
5e762444b   Antti Julku   Bluetooth: Add mg...
843
  	int err;
f03585689   Johan Hedberg   Bluetooth: Add bl...
844
845
846
  
  	if (copy_from_user(&bdaddr, arg, sizeof(bdaddr)))
  		return -EFAULT;
09fd0de5b   Gustavo F. Padovan   Bluetooth: Replac...
847
  	hci_dev_lock(hdev);
5e762444b   Antti Julku   Bluetooth: Add mg...
848

dcc36c16c   Johan Hedberg   Bluetooth: Unify ...
849
  	err = hci_bdaddr_list_del(&hdev->blacklist, &bdaddr, BDADDR_BREDR);
5e762444b   Antti Julku   Bluetooth: Add mg...
850

09fd0de5b   Gustavo F. Padovan   Bluetooth: Replac...
851
  	hci_dev_unlock(hdev);
5e762444b   Antti Julku   Bluetooth: Add mg...
852
853
  
  	return err;
f03585689   Johan Hedberg   Bluetooth: Add bl...
854
  }
8e87d1425   YOSHIFUJI Hideaki   [NET] BLUETOOTH: ...
855
  /* Ioctls that require bound socket */
6039aa73a   Gustavo Padovan   Bluetooth: Remove...
856
857
  static int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd,
  				unsigned long arg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
858
859
860
861
862
  {
  	struct hci_dev *hdev = hci_pi(sk)->hdev;
  
  	if (!hdev)
  		return -EBADFD;
d7a5a11d7   Marcel Holtmann   Bluetooth: Introd...
863
  	if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL))
0736cfa8e   Marcel Holtmann   Bluetooth: Introd...
864
  		return -EBUSY;
d7a5a11d7   Marcel Holtmann   Bluetooth: Introd...
865
  	if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED))
fee746b0b   Marcel Holtmann   Bluetooth: Restri...
866
  		return -EOPNOTSUPP;
ca8bee5dd   Marcel Holtmann   Bluetooth: Rename...
867
  	if (hdev->dev_type != HCI_PRIMARY)
5b69bef54   Marcel Holtmann   Bluetooth: AMP co...
868
  		return -EOPNOTSUPP;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
869
870
871
  	switch (cmd) {
  	case HCISETRAW:
  		if (!capable(CAP_NET_ADMIN))
bf5b30b8a   Zhao Hongjiang   net: change retur...
872
  			return -EPERM;
db5966816   Marcel Holtmann   Bluetooth: Return...
873
  		return -EOPNOTSUPP;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
874

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
875
  	case HCIGETCONNINFO:
8528d3f73   Marcel Holtmann   Bluetooth: Fix ca...
876
  		return hci_get_conn_info(hdev, (void __user *)arg);
40be492fe   Marcel Holtmann   [Bluetooth] Expor...
877
878
  
  	case HCIGETAUTHINFO:
8528d3f73   Marcel Holtmann   Bluetooth: Fix ca...
879
  		return hci_get_auth_info(hdev, (void __user *)arg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
880

f03585689   Johan Hedberg   Bluetooth: Add bl...
881
882
  	case HCIBLOCKADDR:
  		if (!capable(CAP_NET_ADMIN))
bf5b30b8a   Zhao Hongjiang   net: change retur...
883
  			return -EPERM;
8528d3f73   Marcel Holtmann   Bluetooth: Fix ca...
884
  		return hci_sock_blacklist_add(hdev, (void __user *)arg);
f03585689   Johan Hedberg   Bluetooth: Add bl...
885
886
887
  
  	case HCIUNBLOCKADDR:
  		if (!capable(CAP_NET_ADMIN))
bf5b30b8a   Zhao Hongjiang   net: change retur...
888
  			return -EPERM;
8528d3f73   Marcel Holtmann   Bluetooth: Fix ca...
889
  		return hci_sock_blacklist_del(hdev, (void __user *)arg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
890
  	}
0736cfa8e   Marcel Holtmann   Bluetooth: Introd...
891

324d36ed2   Marcel Holtmann   Bluetooth: Remove...
892
  	return -ENOIOCTLCMD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
893
  }
8fc9ced39   Gustavo Padovan   Bluetooth: Fix co...
894
895
  static int hci_sock_ioctl(struct socket *sock, unsigned int cmd,
  			  unsigned long arg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
896
  {
8528d3f73   Marcel Holtmann   Bluetooth: Fix ca...
897
  	void __user *argp = (void __user *)arg;
0736cfa8e   Marcel Holtmann   Bluetooth: Introd...
898
  	struct sock *sk = sock->sk;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
899
900
901
  	int err;
  
  	BT_DBG("cmd %x arg %lx", cmd, arg);
c1c4f9567   Marcel Holtmann   Bluetooth: Restri...
902
903
904
905
906
907
  	lock_sock(sk);
  
  	if (hci_pi(sk)->channel != HCI_CHANNEL_RAW) {
  		err = -EBADFD;
  		goto done;
  	}
f81f5b2db   Marcel Holtmann   Bluetooth: Send c...
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
  	/* When calling an ioctl on an unbound raw socket, then ensure
  	 * that the monitor gets informed. Ensure that the resulting event
  	 * is only send once by checking if the cookie exists or not. The
  	 * socket cookie will be only ever generated once for the lifetime
  	 * of a given socket.
  	 */
  	if (hci_sock_gen_cookie(sk)) {
  		struct sk_buff *skb;
  
  		if (capable(CAP_NET_ADMIN))
  			hci_sock_set_flag(sk, HCI_SOCK_TRUSTED);
  
  		/* Send event to monitor */
  		skb = create_monitor_ctrl_open(sk);
  		if (skb) {
  			hci_send_to_channel(HCI_CHANNEL_MONITOR, skb,
  					    HCI_SOCK_TRUSTED, NULL);
  			kfree_skb(skb);
  		}
  	}
c1c4f9567   Marcel Holtmann   Bluetooth: Restri...
928
  	release_sock(sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
929
930
931
932
933
934
935
936
937
938
939
940
  	switch (cmd) {
  	case HCIGETDEVLIST:
  		return hci_get_dev_list(argp);
  
  	case HCIGETDEVINFO:
  		return hci_get_dev_info(argp);
  
  	case HCIGETCONNLIST:
  		return hci_get_conn_list(argp);
  
  	case HCIDEVUP:
  		if (!capable(CAP_NET_ADMIN))
bf5b30b8a   Zhao Hongjiang   net: change retur...
941
  			return -EPERM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
942
943
944
945
  		return hci_dev_open(arg);
  
  	case HCIDEVDOWN:
  		if (!capable(CAP_NET_ADMIN))
bf5b30b8a   Zhao Hongjiang   net: change retur...
946
  			return -EPERM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
947
948
949
950
  		return hci_dev_close(arg);
  
  	case HCIDEVRESET:
  		if (!capable(CAP_NET_ADMIN))
bf5b30b8a   Zhao Hongjiang   net: change retur...
951
  			return -EPERM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
952
953
954
955
  		return hci_dev_reset(arg);
  
  	case HCIDEVRESTAT:
  		if (!capable(CAP_NET_ADMIN))
bf5b30b8a   Zhao Hongjiang   net: change retur...
956
  			return -EPERM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
957
958
959
960
961
962
963
964
965
966
967
  		return hci_dev_reset_stat(arg);
  
  	case HCISETSCAN:
  	case HCISETAUTH:
  	case HCISETENCRYPT:
  	case HCISETPTYPE:
  	case HCISETLINKPOL:
  	case HCISETLINKMODE:
  	case HCISETACLMTU:
  	case HCISETSCOMTU:
  		if (!capable(CAP_NET_ADMIN))
bf5b30b8a   Zhao Hongjiang   net: change retur...
968
  			return -EPERM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
969
970
971
972
  		return hci_dev_cmd(cmd, argp);
  
  	case HCIINQUIRY:
  		return hci_inquiry(argp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
973
  	}
c1c4f9567   Marcel Holtmann   Bluetooth: Restri...
974
975
976
977
978
979
980
981
  
  	lock_sock(sk);
  
  	err = hci_sock_bound_ioctl(sk, cmd, arg);
  
  done:
  	release_sock(sk);
  	return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
982
  }
7a6038b30   Arnd Bergmann   compat_ioctl: mov...
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
  #ifdef CONFIG_COMPAT
  static int hci_sock_compat_ioctl(struct socket *sock, unsigned int cmd,
  				 unsigned long arg)
  {
  	switch (cmd) {
  	case HCIDEVUP:
  	case HCIDEVDOWN:
  	case HCIDEVRESET:
  	case HCIDEVRESTAT:
  		return hci_sock_ioctl(sock, cmd, arg);
  	}
  
  	return hci_sock_ioctl(sock, cmd, (unsigned long)compat_ptr(arg));
  }
  #endif
8fc9ced39   Gustavo Padovan   Bluetooth: Fix co...
998
999
  static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
  			 int addr_len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1000
  {
0381101fd   Johan Hedberg   Bluetooth: Add in...
1001
  	struct sockaddr_hci haddr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1002
1003
  	struct sock *sk = sock->sk;
  	struct hci_dev *hdev = NULL;
f4cdbb3f2   Marcel Holtmann   Bluetooth: Handle...
1004
  	struct sk_buff *skb;
0381101fd   Johan Hedberg   Bluetooth: Add in...
1005
  	int len, err = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1006
1007
  
  	BT_DBG("sock %p sk %p", sock, sk);
0381101fd   Johan Hedberg   Bluetooth: Add in...
1008
1009
1010
1011
1012
1013
1014
1015
1016
  	if (!addr)
  		return -EINVAL;
  
  	memset(&haddr, 0, sizeof(haddr));
  	len = min_t(unsigned int, sizeof(haddr), addr_len);
  	memcpy(&haddr, addr, len);
  
  	if (haddr.hci_family != AF_BLUETOOTH)
  		return -EINVAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1017
  	lock_sock(sk);
7cc2ade2c   Marcel Holtmann   Bluetooth: Simpli...
1018
  	if (sk->sk_state == BT_BOUND) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1019
1020
1021
  		err = -EALREADY;
  		goto done;
  	}
7cc2ade2c   Marcel Holtmann   Bluetooth: Simpli...
1022
1023
1024
1025
  	switch (haddr.hci_channel) {
  	case HCI_CHANNEL_RAW:
  		if (hci_pi(sk)->hdev) {
  			err = -EALREADY;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1026
1027
  			goto done;
  		}
7cc2ade2c   Marcel Holtmann   Bluetooth: Simpli...
1028
1029
1030
1031
1032
1033
1034
1035
1036
  		if (haddr.hci_dev != HCI_DEV_NONE) {
  			hdev = hci_dev_get(haddr.hci_dev);
  			if (!hdev) {
  				err = -ENODEV;
  				goto done;
  			}
  
  			atomic_inc(&hdev->promisc);
  		}
5a6d2cf5f   Marcel Holtmann   Bluetooth: Assign...
1037
  		hci_pi(sk)->channel = haddr.hci_channel;
f81f5b2db   Marcel Holtmann   Bluetooth: Send c...
1038

f4cdbb3f2   Marcel Holtmann   Bluetooth: Handle...
1039
1040
1041
1042
1043
1044
1045
1046
  		if (!hci_sock_gen_cookie(sk)) {
  			/* In the case when a cookie has already been assigned,
  			 * then there has been already an ioctl issued against
  			 * an unbound socket and with that triggerd an open
  			 * notification. Send a close notification first to
  			 * allow the state transition to bounded.
  			 */
  			skb = create_monitor_ctrl_close(sk);
f81f5b2db   Marcel Holtmann   Bluetooth: Send c...
1047
1048
1049
1050
1051
1052
  			if (skb) {
  				hci_send_to_channel(HCI_CHANNEL_MONITOR, skb,
  						    HCI_SOCK_TRUSTED, NULL);
  				kfree_skb(skb);
  			}
  		}
f4cdbb3f2   Marcel Holtmann   Bluetooth: Handle...
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
  
  		if (capable(CAP_NET_ADMIN))
  			hci_sock_set_flag(sk, HCI_SOCK_TRUSTED);
  
  		hci_pi(sk)->hdev = hdev;
  
  		/* Send event to monitor */
  		skb = create_monitor_ctrl_open(sk);
  		if (skb) {
  			hci_send_to_channel(HCI_CHANNEL_MONITOR, skb,
  					    HCI_SOCK_TRUSTED, NULL);
  			kfree_skb(skb);
  		}
7cc2ade2c   Marcel Holtmann   Bluetooth: Simpli...
1066
  		break;
23500189d   Marcel Holtmann   Bluetooth: Introd...
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
  	case HCI_CHANNEL_USER:
  		if (hci_pi(sk)->hdev) {
  			err = -EALREADY;
  			goto done;
  		}
  
  		if (haddr.hci_dev == HCI_DEV_NONE) {
  			err = -EINVAL;
  			goto done;
  		}
10a8b86f5   Marcel Holtmann   Bluetooth: Requir...
1077
  		if (!capable(CAP_NET_ADMIN)) {
23500189d   Marcel Holtmann   Bluetooth: Introd...
1078
1079
1080
1081
1082
1083
1084
1085
1086
  			err = -EPERM;
  			goto done;
  		}
  
  		hdev = hci_dev_get(haddr.hci_dev);
  		if (!hdev) {
  			err = -ENODEV;
  			goto done;
  		}
781f899f2   Marcel Holtmann   Bluetooth: Fix ra...
1087
  		if (test_bit(HCI_INIT, &hdev->flags) ||
d7a5a11d7   Marcel Holtmann   Bluetooth: Introd...
1088
  		    hci_dev_test_flag(hdev, HCI_SETUP) ||
781f899f2   Marcel Holtmann   Bluetooth: Fix ra...
1089
1090
1091
  		    hci_dev_test_flag(hdev, HCI_CONFIG) ||
  		    (!hci_dev_test_flag(hdev, HCI_AUTO_OFF) &&
  		     test_bit(HCI_UP, &hdev->flags))) {
23500189d   Marcel Holtmann   Bluetooth: Introd...
1092
1093
1094
1095
  			err = -EBUSY;
  			hci_dev_put(hdev);
  			goto done;
  		}
238be788f   Marcel Holtmann   Bluetooth: Introd...
1096
  		if (hci_dev_test_and_set_flag(hdev, HCI_USER_CHANNEL)) {
23500189d   Marcel Holtmann   Bluetooth: Introd...
1097
1098
1099
1100
  			err = -EUSERS;
  			hci_dev_put(hdev);
  			goto done;
  		}
0602a8adc   Marcel Holtmann   Bluetooth: Add su...
1101
  		mgmt_index_removed(hdev);
23500189d   Marcel Holtmann   Bluetooth: Introd...
1102
1103
1104
  
  		err = hci_dev_open(hdev->id);
  		if (err) {
781f899f2   Marcel Holtmann   Bluetooth: Fix ra...
1105
1106
1107
1108
  			if (err == -EALREADY) {
  				/* In case the transport is already up and
  				 * running, clear the error here.
  				 *
9332ef9db   Masahiro Yamada   scripts/spelling....
1109
  				 * This can happen when opening a user
781f899f2   Marcel Holtmann   Bluetooth: Fix ra...
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
  				 * channel and HCI_AUTO_OFF grace period
  				 * is still active.
  				 */
  				err = 0;
  			} else {
  				hci_dev_clear_flag(hdev, HCI_USER_CHANNEL);
  				mgmt_index_added(hdev);
  				hci_dev_put(hdev);
  				goto done;
  			}
23500189d   Marcel Holtmann   Bluetooth: Introd...
1120
  		}
5a6d2cf5f   Marcel Holtmann   Bluetooth: Assign...
1121
  		hci_pi(sk)->channel = haddr.hci_channel;
aa1638dde   Marcel Holtmann   Bluetooth: Send c...
1122
1123
1124
1125
  
  		if (!hci_sock_gen_cookie(sk)) {
  			/* In the case when a cookie has already been assigned,
  			 * this socket will transition from a raw socket into
9332ef9db   Masahiro Yamada   scripts/spelling....
1126
  			 * a user channel socket. For a clean transition, send
aa1638dde   Marcel Holtmann   Bluetooth: Send c...
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
  			 * the close notification first.
  			 */
  			skb = create_monitor_ctrl_close(sk);
  			if (skb) {
  				hci_send_to_channel(HCI_CHANNEL_MONITOR, skb,
  						    HCI_SOCK_TRUSTED, NULL);
  				kfree_skb(skb);
  			}
  		}
  
  		/* The user channel is restricted to CAP_NET_ADMIN
  		 * capabilities and with that implicitly trusted.
  		 */
  		hci_sock_set_flag(sk, HCI_SOCK_TRUSTED);
23500189d   Marcel Holtmann   Bluetooth: Introd...
1141
  		hci_pi(sk)->hdev = hdev;
5a6d2cf5f   Marcel Holtmann   Bluetooth: Assign...
1142

aa1638dde   Marcel Holtmann   Bluetooth: Send c...
1143
1144
1145
1146
1147
1148
1149
  		/* Send event to monitor */
  		skb = create_monitor_ctrl_open(sk);
  		if (skb) {
  			hci_send_to_channel(HCI_CHANNEL_MONITOR, skb,
  					    HCI_SOCK_TRUSTED, NULL);
  			kfree_skb(skb);
  		}
5a6d2cf5f   Marcel Holtmann   Bluetooth: Assign...
1150
  		atomic_inc(&hdev->promisc);
23500189d   Marcel Holtmann   Bluetooth: Introd...
1151
  		break;
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
  	case HCI_CHANNEL_MONITOR:
  		if (haddr.hci_dev != HCI_DEV_NONE) {
  			err = -EINVAL;
  			goto done;
  		}
  
  		if (!capable(CAP_NET_RAW)) {
  			err = -EPERM;
  			goto done;
  		}
5a6d2cf5f   Marcel Holtmann   Bluetooth: Assign...
1162
  		hci_pi(sk)->channel = haddr.hci_channel;
50ebc055f   Marcel Holtmann   Bluetooth: Introd...
1163
1164
1165
1166
  		/* The monitor interface is restricted to CAP_NET_RAW
  		 * capabilities and with that implicitly trusted.
  		 */
  		hci_sock_set_flag(sk, HCI_SOCK_TRUSTED);
787b306cf   Johannes Berg   Bluetooth: avoid ...
1167
1168
1169
  		send_monitor_note(sk, "Linux version %s (%s)",
  				  init_utsname()->release,
  				  init_utsname()->machine);
9e8305b39   Marcel Holtmann   Bluetooth: Use nu...
1170
1171
  		send_monitor_note(sk, "Bluetooth subsystem version %u.%u",
  				  BT_SUBSYS_VERSION, BT_SUBSYS_REVISION);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
1172
  		send_monitor_replay(sk);
249fa1699   Marcel Holtmann   Bluetooth: Add su...
1173
  		send_monitor_control_replay(sk);
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
1174
1175
1176
  
  		atomic_inc(&monitor_promisc);
  		break;
ac7149493   Marcel Holtmann   Bluetooth: Add su...
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
  	case HCI_CHANNEL_LOGGING:
  		if (haddr.hci_dev != HCI_DEV_NONE) {
  			err = -EINVAL;
  			goto done;
  		}
  
  		if (!capable(CAP_NET_ADMIN)) {
  			err = -EPERM;
  			goto done;
  		}
5a6d2cf5f   Marcel Holtmann   Bluetooth: Assign...
1187
1188
  
  		hci_pi(sk)->channel = haddr.hci_channel;
ac7149493   Marcel Holtmann   Bluetooth: Add su...
1189
  		break;
7cc2ade2c   Marcel Holtmann   Bluetooth: Simpli...
1190
  	default:
801c1e8da   Johan Hedberg   Bluetooth: Add mg...
1191
1192
1193
1194
1195
1196
1197
1198
1199
  		if (!hci_mgmt_chan_find(haddr.hci_channel)) {
  			err = -EINVAL;
  			goto done;
  		}
  
  		if (haddr.hci_dev != HCI_DEV_NONE) {
  			err = -EINVAL;
  			goto done;
  		}
1195fbb8d   Marcel Holtmann   Bluetooth: Open m...
1200
1201
1202
1203
  		/* Users with CAP_NET_ADMIN capabilities are allowed
  		 * access to all management commands and events. For
  		 * untrusted users the interface is restricted and
  		 * also only untrusted events are sent.
50ebc055f   Marcel Holtmann   Bluetooth: Introd...
1204
  		 */
1195fbb8d   Marcel Holtmann   Bluetooth: Open m...
1205
1206
  		if (capable(CAP_NET_ADMIN))
  			hci_sock_set_flag(sk, HCI_SOCK_TRUSTED);
50ebc055f   Marcel Holtmann   Bluetooth: Introd...
1207

5a6d2cf5f   Marcel Holtmann   Bluetooth: Assign...
1208
  		hci_pi(sk)->channel = haddr.hci_channel;
f92073388   Marcel Holtmann   Bluetooth: Use sp...
1209
1210
1211
1212
1213
  		/* At the moment the index and unconfigured index events
  		 * are enabled unconditionally. Setting them on each
  		 * socket when binding keeps this functionality. They
  		 * however might be cleared later and then sending of these
  		 * events will be disabled, but that is then intentional.
f6b7712eb   Marcel Holtmann   Bluetooth: Send g...
1214
1215
1216
1217
  		 *
  		 * This also enables generic events that are safe to be
  		 * received by untrusted users. Example for such events
  		 * are changes to settings, class of device, name etc.
f92073388   Marcel Holtmann   Bluetooth: Use sp...
1218
  		 */
5a6d2cf5f   Marcel Holtmann   Bluetooth: Assign...
1219
  		if (hci_pi(sk)->channel == HCI_CHANNEL_CONTROL) {
f4cdbb3f2   Marcel Holtmann   Bluetooth: Handle...
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
  			if (!hci_sock_gen_cookie(sk)) {
  				/* In the case when a cookie has already been
  				 * assigned, this socket will transtion from
  				 * a raw socket into a control socket. To
  				 * allow for a clean transtion, send the
  				 * close notification first.
  				 */
  				skb = create_monitor_ctrl_close(sk);
  				if (skb) {
  					hci_send_to_channel(HCI_CHANNEL_MONITOR, skb,
  							    HCI_SOCK_TRUSTED, NULL);
  					kfree_skb(skb);
  				}
  			}
70ecce91e   Marcel Holtmann   Bluetooth: Store ...
1234

249fa1699   Marcel Holtmann   Bluetooth: Add su...
1235
1236
1237
1238
1239
1240
1241
  			/* Send event to monitor */
  			skb = create_monitor_ctrl_open(sk);
  			if (skb) {
  				hci_send_to_channel(HCI_CHANNEL_MONITOR, skb,
  						    HCI_SOCK_TRUSTED, NULL);
  				kfree_skb(skb);
  			}
f92073388   Marcel Holtmann   Bluetooth: Use sp...
1242
1243
  			hci_sock_set_flag(sk, HCI_MGMT_INDEX_EVENTS);
  			hci_sock_set_flag(sk, HCI_MGMT_UNCONF_INDEX_EVENTS);
5504c3a31   Marcel Holtmann   Bluetooth: Use in...
1244
1245
1246
1247
  			hci_sock_set_flag(sk, HCI_MGMT_OPTION_EVENTS);
  			hci_sock_set_flag(sk, HCI_MGMT_SETTING_EVENTS);
  			hci_sock_set_flag(sk, HCI_MGMT_DEV_CLASS_EVENTS);
  			hci_sock_set_flag(sk, HCI_MGMT_LOCAL_NAME_EVENTS);
f92073388   Marcel Holtmann   Bluetooth: Use sp...
1248
  		}
801c1e8da   Johan Hedberg   Bluetooth: Add mg...
1249
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1250
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1251
1252
1253
1254
1255
1256
  	sk->sk_state = BT_BOUND;
  
  done:
  	release_sock(sk);
  	return err;
  }
8fc9ced39   Gustavo Padovan   Bluetooth: Fix co...
1257
  static int hci_sock_getname(struct socket *sock, struct sockaddr *addr,
9b2c45d47   Denys Vlasenko   net: make getname...
1258
  			    int peer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1259
  {
8528d3f73   Marcel Holtmann   Bluetooth: Fix ca...
1260
  	struct sockaddr_hci *haddr = (struct sockaddr_hci *)addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1261
  	struct sock *sk = sock->sk;
9d4b68b23   Marcel Holtmann   Bluetooth: Fix ha...
1262
1263
  	struct hci_dev *hdev;
  	int err = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1264
1265
  
  	BT_DBG("sock %p sk %p", sock, sk);
06f43cbc4   Marcel Holtmann   Bluetooth: Fix ha...
1266
1267
  	if (peer)
  		return -EOPNOTSUPP;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1268
  	lock_sock(sk);
9d4b68b23   Marcel Holtmann   Bluetooth: Fix ha...
1269
1270
1271
1272
1273
  	hdev = hci_pi(sk)->hdev;
  	if (!hdev) {
  		err = -EBADFD;
  		goto done;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1274
  	haddr->hci_family = AF_BLUETOOTH;
7b005bd34   Marcel Holtmann   [Bluetooth] Fix N...
1275
  	haddr->hci_dev    = hdev->id;
9d4b68b23   Marcel Holtmann   Bluetooth: Fix ha...
1276
  	haddr->hci_channel= hci_pi(sk)->channel;
9b2c45d47   Denys Vlasenko   net: make getname...
1277
  	err = sizeof(*haddr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1278

9d4b68b23   Marcel Holtmann   Bluetooth: Fix ha...
1279
  done:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1280
  	release_sock(sk);
9d4b68b23   Marcel Holtmann   Bluetooth: Fix ha...
1281
  	return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1282
  }
6039aa73a   Gustavo Padovan   Bluetooth: Remove...
1283
1284
  static void hci_sock_cmsg(struct sock *sk, struct msghdr *msg,
  			  struct sk_buff *skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1285
  {
32929e1f4   Alain Michaud   Bluetooth: Use on...
1286
  	__u8 mask = hci_pi(sk)->cmsg_mask;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1287

0d48d9394   Marcel Holtmann   [Bluetooth]: Move...
1288
1289
  	if (mask & HCI_CMSG_DIR) {
  		int incoming = bt_cb(skb)->incoming;
8fc9ced39   Gustavo Padovan   Bluetooth: Fix co...
1290
1291
  		put_cmsg(msg, SOL_HCI, HCI_CMSG_DIR, sizeof(incoming),
  			 &incoming);
0d48d9394   Marcel Holtmann   [Bluetooth]: Move...
1292
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1293

a61bbcf28   Patrick McHardy   [NET]: Store skb-...
1294
  	if (mask & HCI_CMSG_TSTAMP) {
f6e623a65   Johann Felix Soden   Bluetooth: Fix ou...
1295
  #ifdef CONFIG_COMPAT
13c6ee2a9   Deepa Dinamani   socket: Use old_t...
1296
  		struct old_timeval32 ctv;
f6e623a65   Johann Felix Soden   Bluetooth: Fix ou...
1297
  #endif
13c6ee2a9   Deepa Dinamani   socket: Use old_t...
1298
  		struct __kernel_old_timeval tv;
767c5eb5d   Marcel Holtmann   [Bluetooth] Add c...
1299
1300
  		void *data;
  		int len;
a61bbcf28   Patrick McHardy   [NET]: Store skb-...
1301
1302
  
  		skb_get_timestamp(skb, &tv);
767c5eb5d   Marcel Holtmann   [Bluetooth] Add c...
1303

1da97f83a   David S. Miller   [BLUETOOTH]: Fix ...
1304
1305
1306
  		data = &tv;
  		len = sizeof(tv);
  #ifdef CONFIG_COMPAT
da88cea12   H. J. Lu   compat: Use COMPA...
1307
1308
  		if (!COMPAT_USE_64BIT_TIME &&
  		    (msg->msg_flags & MSG_CMSG_COMPAT)) {
767c5eb5d   Marcel Holtmann   [Bluetooth] Add c...
1309
1310
1311
1312
  			ctv.tv_sec = tv.tv_sec;
  			ctv.tv_usec = tv.tv_usec;
  			data = &ctv;
  			len = sizeof(ctv);
767c5eb5d   Marcel Holtmann   [Bluetooth] Add c...
1313
  		}
1da97f83a   David S. Miller   [BLUETOOTH]: Fix ...
1314
  #endif
767c5eb5d   Marcel Holtmann   [Bluetooth] Add c...
1315
1316
  
  		put_cmsg(msg, SOL_HCI, HCI_CMSG_TSTAMP, len, data);
a61bbcf28   Patrick McHardy   [NET]: Store skb-...
1317
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1318
  }
8e87d1425   YOSHIFUJI Hideaki   [NET] BLUETOOTH: ...
1319

8528d3f73   Marcel Holtmann   Bluetooth: Fix ca...
1320
1321
  static int hci_sock_recvmsg(struct socket *sock, struct msghdr *msg,
  			    size_t len, int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1322
1323
1324
1325
1326
  {
  	int noblock = flags & MSG_DONTWAIT;
  	struct sock *sk = sock->sk;
  	struct sk_buff *skb;
  	int copied, err;
83871f8cc   Denis Kenzior   Bluetooth: Fix hc...
1327
  	unsigned int skblen;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1328
1329
  
  	BT_DBG("sock %p, sk %p", sock, sk);
d94a61040   Marcel Holtmann   Bluetooth: Remove...
1330
  	if (flags & MSG_OOB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1331
  		return -EOPNOTSUPP;
ac7149493   Marcel Holtmann   Bluetooth: Add su...
1332
1333
  	if (hci_pi(sk)->channel == HCI_CHANNEL_LOGGING)
  		return -EOPNOTSUPP;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1334
1335
  	if (sk->sk_state == BT_CLOSED)
  		return 0;
70f23020e   Andrei Emeltchenko   Bluetooth: clean ...
1336
1337
  	skb = skb_recv_datagram(sk, flags, noblock, &err);
  	if (!skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1338
  		return err;
83871f8cc   Denis Kenzior   Bluetooth: Fix hc...
1339
  	skblen = skb->len;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1340
1341
1342
1343
1344
  	copied = skb->len;
  	if (len < copied) {
  		msg->msg_flags |= MSG_TRUNC;
  		copied = len;
  	}
badff6d01   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1345
  	skb_reset_transport_header(skb);
51f3d02b9   David S. Miller   net: Add and use ...
1346
  	err = skb_copy_datagram_msg(skb, 0, msg, copied);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1347

3a208627f   Marcel Holtmann   Bluetooth: Add HC...
1348
1349
1350
1351
  	switch (hci_pi(sk)->channel) {
  	case HCI_CHANNEL_RAW:
  		hci_sock_cmsg(sk, msg, skb);
  		break;
23500189d   Marcel Holtmann   Bluetooth: Introd...
1352
  	case HCI_CHANNEL_USER:
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
1353
1354
1355
  	case HCI_CHANNEL_MONITOR:
  		sock_recv_timestamp(msg, sk, skb);
  		break;
801c1e8da   Johan Hedberg   Bluetooth: Add mg...
1356
1357
1358
1359
  	default:
  		if (hci_mgmt_chan_find(hci_pi(sk)->channel))
  			sock_recv_timestamp(msg, sk, skb);
  		break;
3a208627f   Marcel Holtmann   Bluetooth: Add HC...
1360
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1361
1362
  
  	skb_free_datagram(sk, skb);
4f34228b6   Luiz Augusto von Dentz   Bluetooth: Fix hc...
1363
  	if (flags & MSG_TRUNC)
83871f8cc   Denis Kenzior   Bluetooth: Fix hc...
1364
  		copied = skblen;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1365
1366
  	return err ? : copied;
  }
fa4335d71   Johan Hedberg   Bluetooth: Move g...
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
  static int hci_mgmt_cmd(struct hci_mgmt_chan *chan, struct sock *sk,
  			struct msghdr *msg, size_t msglen)
  {
  	void *buf;
  	u8 *cp;
  	struct mgmt_hdr *hdr;
  	u16 opcode, index, len;
  	struct hci_dev *hdev = NULL;
  	const struct hci_mgmt_handler *handler;
  	bool var_len, no_hdev;
  	int err;
  
  	BT_DBG("got %zu bytes", msglen);
  
  	if (msglen < sizeof(*hdr))
  		return -EINVAL;
  
  	buf = kmalloc(msglen, GFP_KERNEL);
  	if (!buf)
  		return -ENOMEM;
  
  	if (memcpy_from_msg(buf, msg, msglen)) {
  		err = -EFAULT;
  		goto done;
  	}
  
  	hdr = buf;
  	opcode = __le16_to_cpu(hdr->opcode);
  	index = __le16_to_cpu(hdr->index);
  	len = __le16_to_cpu(hdr->len);
  
  	if (len != msglen - sizeof(*hdr)) {
  		err = -EINVAL;
  		goto done;
  	}
38ceaa00d   Marcel Holtmann   Bluetooth: Add su...
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
  	if (chan->channel == HCI_CHANNEL_CONTROL) {
  		struct sk_buff *skb;
  
  		/* Send event to monitor */
  		skb = create_monitor_ctrl_command(sk, index, opcode, len,
  						  buf + sizeof(*hdr));
  		if (skb) {
  			hci_send_to_channel(HCI_CHANNEL_MONITOR, skb,
  					    HCI_SOCK_TRUSTED, NULL);
  			kfree_skb(skb);
  		}
  	}
fa4335d71   Johan Hedberg   Bluetooth: Move g...
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
  	if (opcode >= chan->handler_count ||
  	    chan->handlers[opcode].func == NULL) {
  		BT_DBG("Unknown op %u", opcode);
  		err = mgmt_cmd_status(sk, index, opcode,
  				      MGMT_STATUS_UNKNOWN_COMMAND);
  		goto done;
  	}
  
  	handler = &chan->handlers[opcode];
  
  	if (!hci_sock_test_flag(sk, HCI_SOCK_TRUSTED) &&
  	    !(handler->flags & HCI_MGMT_UNTRUSTED)) {
  		err = mgmt_cmd_status(sk, index, opcode,
  				      MGMT_STATUS_PERMISSION_DENIED);
  		goto done;
  	}
  
  	if (index != MGMT_INDEX_NONE) {
  		hdev = hci_dev_get(index);
  		if (!hdev) {
  			err = mgmt_cmd_status(sk, index, opcode,
  					      MGMT_STATUS_INVALID_INDEX);
  			goto done;
  		}
  
  		if (hci_dev_test_flag(hdev, HCI_SETUP) ||
  		    hci_dev_test_flag(hdev, HCI_CONFIG) ||
  		    hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) {
  			err = mgmt_cmd_status(sk, index, opcode,
  					      MGMT_STATUS_INVALID_INDEX);
  			goto done;
  		}
  
  		if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED) &&
  		    !(handler->flags & HCI_MGMT_UNCONFIGURED)) {
  			err = mgmt_cmd_status(sk, index, opcode,
  					      MGMT_STATUS_INVALID_INDEX);
  			goto done;
  		}
  	}
d5cc6626b   Marcel Holtmann   Bluetooth: Introd...
1454
1455
1456
1457
1458
1459
1460
  	if (!(handler->flags & HCI_MGMT_HDEV_OPTIONAL)) {
  		no_hdev = (handler->flags & HCI_MGMT_NO_HDEV);
  		if (no_hdev != !hdev) {
  			err = mgmt_cmd_status(sk, index, opcode,
  					      MGMT_STATUS_INVALID_INDEX);
  			goto done;
  		}
fa4335d71   Johan Hedberg   Bluetooth: Move g...
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
  	}
  
  	var_len = (handler->flags & HCI_MGMT_VAR_LEN);
  	if ((var_len && len < handler->data_len) ||
  	    (!var_len && len != handler->data_len)) {
  		err = mgmt_cmd_status(sk, index, opcode,
  				      MGMT_STATUS_INVALID_PARAMS);
  		goto done;
  	}
  
  	if (hdev && chan->hdev_init)
  		chan->hdev_init(sk, hdev);
  
  	cp = buf + sizeof(*hdr);
  
  	err = handler->func(sk, hdev, cp, len);
  	if (err < 0)
  		goto done;
  
  	err = msglen;
  
  done:
  	if (hdev)
  		hci_dev_put(hdev);
  
  	kfree(buf);
  	return err;
  }
ac7149493   Marcel Holtmann   Bluetooth: Add su...
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
  static int hci_logging_frame(struct sock *sk, struct msghdr *msg, int len)
  {
  	struct hci_mon_hdr *hdr;
  	struct sk_buff *skb;
  	struct hci_dev *hdev;
  	u16 index;
  	int err;
  
  	/* The logging frame consists at minimum of the standard header,
  	 * the priority byte, the ident length byte and at least one string
  	 * terminator NUL byte. Anything shorter are invalid packets.
  	 */
  	if (len < sizeof(*hdr) + 3)
  		return -EINVAL;
  
  	skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err);
  	if (!skb)
  		return err;
  
  	if (memcpy_from_msg(skb_put(skb, len), msg, len)) {
  		err = -EFAULT;
  		goto drop;
  	}
  
  	hdr = (void *)skb->data;
  
  	if (__le16_to_cpu(hdr->len) != len - sizeof(*hdr)) {
  		err = -EINVAL;
  		goto drop;
  	}
  
  	if (__le16_to_cpu(hdr->opcode) == 0x0000) {
  		__u8 priority = skb->data[sizeof(*hdr)];
  		__u8 ident_len = skb->data[sizeof(*hdr) + 1];
  
  		/* Only the priorities 0-7 are valid and with that any other
  		 * value results in an invalid packet.
  		 *
  		 * The priority byte is followed by an ident length byte and
  		 * the NUL terminated ident string. Check that the ident
  		 * length is not overflowing the packet and also that the
  		 * ident string itself is NUL terminated. In case the ident
  		 * length is zero, the length value actually doubles as NUL
  		 * terminator identifier.
  		 *
  		 * The message follows the ident string (if present) and
  		 * must be NUL terminated. Otherwise it is not a valid packet.
  		 */
  		if (priority > 7 || skb->data[len - 1] != 0x00 ||
  		    ident_len > len - sizeof(*hdr) - 3 ||
  		    skb->data[sizeof(*hdr) + ident_len + 1] != 0x00) {
  			err = -EINVAL;
  			goto drop;
  		}
  	} else {
  		err = -EINVAL;
  		goto drop;
  	}
  
  	index = __le16_to_cpu(hdr->index);
  
  	if (index != MGMT_INDEX_NONE) {
  		hdev = hci_dev_get(index);
  		if (!hdev) {
  			err = -ENODEV;
  			goto drop;
  		}
  	} else {
  		hdev = NULL;
  	}
  
  	hdr->opcode = cpu_to_le16(HCI_MON_USER_LOGGING);
  
  	hci_send_to_channel(HCI_CHANNEL_MONITOR, skb, HCI_SOCK_TRUSTED, NULL);
  	err = len;
  
  	if (hdev)
  		hci_dev_put(hdev);
  
  drop:
  	kfree_skb(skb);
  	return err;
  }
1b7841404   Ying Xue   net: Remove iocb ...
1572
1573
  static int hci_sock_sendmsg(struct socket *sock, struct msghdr *msg,
  			    size_t len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1574
1575
  {
  	struct sock *sk = sock->sk;
801c1e8da   Johan Hedberg   Bluetooth: Add mg...
1576
  	struct hci_mgmt_chan *chan;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1577
1578
1579
1580
1581
1582
1583
1584
  	struct hci_dev *hdev;
  	struct sk_buff *skb;
  	int err;
  
  	BT_DBG("sock %p sk %p", sock, sk);
  
  	if (msg->msg_flags & MSG_OOB)
  		return -EOPNOTSUPP;
ab89f0bdd   Szymon Janc   Bluetooth: Fix us...
1585
1586
  	if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_NOSIGNAL|MSG_ERRQUEUE|
  			       MSG_CMSG_COMPAT))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1587
1588
1589
1590
1591
1592
  		return -EINVAL;
  
  	if (len < 4 || len > HCI_MAX_FRAME_SIZE)
  		return -EINVAL;
  
  	lock_sock(sk);
0381101fd   Johan Hedberg   Bluetooth: Add in...
1593
1594
  	switch (hci_pi(sk)->channel) {
  	case HCI_CHANNEL_RAW:
23500189d   Marcel Holtmann   Bluetooth: Introd...
1595
  	case HCI_CHANNEL_USER:
0381101fd   Johan Hedberg   Bluetooth: Add in...
1596
  		break;
cd82e61c1   Marcel Holtmann   Bluetooth: Add su...
1597
1598
1599
  	case HCI_CHANNEL_MONITOR:
  		err = -EOPNOTSUPP;
  		goto done;
ac7149493   Marcel Holtmann   Bluetooth: Add su...
1600
1601
1602
  	case HCI_CHANNEL_LOGGING:
  		err = hci_logging_frame(sk, msg, len);
  		goto done;
0381101fd   Johan Hedberg   Bluetooth: Add in...
1603
  	default:
801c1e8da   Johan Hedberg   Bluetooth: Add mg...
1604
1605
1606
  		mutex_lock(&mgmt_chan_list_lock);
  		chan = __hci_mgmt_chan_find(hci_pi(sk)->channel);
  		if (chan)
fa4335d71   Johan Hedberg   Bluetooth: Move g...
1607
  			err = hci_mgmt_cmd(chan, sk, msg, len);
801c1e8da   Johan Hedberg   Bluetooth: Add mg...
1608
1609
1610
1611
  		else
  			err = -EINVAL;
  
  		mutex_unlock(&mgmt_chan_list_lock);
0381101fd   Johan Hedberg   Bluetooth: Add in...
1612
1613
  		goto done;
  	}
70f23020e   Andrei Emeltchenko   Bluetooth: clean ...
1614
1615
  	hdev = hci_pi(sk)->hdev;
  	if (!hdev) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1616
1617
1618
  		err = -EBADFD;
  		goto done;
  	}
7e21addcd   Marcel Holtmann   Bluetooth: Return...
1619
1620
1621
1622
  	if (!test_bit(HCI_UP, &hdev->flags)) {
  		err = -ENETDOWN;
  		goto done;
  	}
70f23020e   Andrei Emeltchenko   Bluetooth: clean ...
1623
1624
  	skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err);
  	if (!skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1625
  		goto done;
6ce8e9ce5   Al Viro   new helper: memcp...
1626
  	if (memcpy_from_msg(skb_put(skb, len), msg, len)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1627
1628
1629
  		err = -EFAULT;
  		goto drop;
  	}
8528d3f73   Marcel Holtmann   Bluetooth: Fix ca...
1630
  	hci_skb_pkt_type(skb) = skb->data[0];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1631
  	skb_pull(skb, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1632

1bc5ad168   Marcel Holtmann   Bluetooth: Fix HC...
1633
1634
1635
1636
1637
1638
  	if (hci_pi(sk)->channel == HCI_CHANNEL_USER) {
  		/* No permission check is needed for user channel
  		 * since that gets enforced when binding the socket.
  		 *
  		 * However check that the packet type is valid.
  		 */
d79f34e32   Marcel Holtmann   Bluetooth: Use ne...
1639
1640
  		if (hci_skb_pkt_type(skb) != HCI_COMMAND_PKT &&
  		    hci_skb_pkt_type(skb) != HCI_ACLDATA_PKT &&
cc9740036   Marcel Holtmann   Bluetooth: Add mi...
1641
1642
  		    hci_skb_pkt_type(skb) != HCI_SCODATA_PKT &&
  		    hci_skb_pkt_type(skb) != HCI_ISODATA_PKT) {
1bc5ad168   Marcel Holtmann   Bluetooth: Fix HC...
1643
1644
1645
1646
1647
1648
  			err = -EINVAL;
  			goto drop;
  		}
  
  		skb_queue_tail(&hdev->raw_q, skb);
  		queue_work(hdev->workqueue, &hdev->tx_work);
d79f34e32   Marcel Holtmann   Bluetooth: Use ne...
1649
  	} else if (hci_skb_pkt_type(skb) == HCI_COMMAND_PKT) {
839853193   Harvey Harrison   bluetooth: use ge...
1650
  		u16 opcode = get_unaligned_le16(skb->data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1651
1652
1653
1654
  		u16 ogf = hci_opcode_ogf(opcode);
  		u16 ocf = hci_opcode_ocf(opcode);
  
  		if (((ogf > HCI_SFLT_MAX_OGF) ||
3bb3c7551   Gustavo Padovan   Bluetooth: Fix co...
1655
1656
1657
  		     !hci_test_bit(ocf & HCI_FLT_OCF_BITS,
  				   &hci_sec_filter.ocf_mask[ogf])) &&
  		    !capable(CAP_NET_RAW)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1658
1659
1660
  			err = -EPERM;
  			goto drop;
  		}
1982162bb   Marcel Holtmann   Bluetooth: Add mi...
1661
1662
1663
1664
  		/* Since the opcode has already been extracted here, store
  		 * a copy of the value for later use by the drivers.
  		 */
  		hci_skb_opcode(skb) = opcode;
fee746b0b   Marcel Holtmann   Bluetooth: Restri...
1665
  		if (ogf == 0x3f) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1666
  			skb_queue_tail(&hdev->raw_q, skb);
3eff45eaf   Gustavo F. Padovan   Bluetooth: conver...
1667
  			queue_work(hdev->workqueue, &hdev->tx_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1668
  		} else {
49c922bb1   Stephen Hemminger   Bluetooth: spelli...
1669
  			/* Stand-alone HCI commands must be flagged as
11714b3d7   Johan Hedberg   Bluetooth: Fix st...
1670
1671
  			 * single-command requests.
  			 */
44d271377   Johan Hedberg   Bluetooth: Compre...
1672
  			bt_cb(skb)->hci.req_flags |= HCI_REQ_START;
11714b3d7   Johan Hedberg   Bluetooth: Fix st...
1673

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1674
  			skb_queue_tail(&hdev->cmd_q, skb);
c347b765f   Gustavo F. Padovan   Bluetooth: Move c...
1675
  			queue_work(hdev->workqueue, &hdev->cmd_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1676
1677
1678
1679
1680
1681
  		}
  	} else {
  		if (!capable(CAP_NET_RAW)) {
  			err = -EPERM;
  			goto drop;
  		}
d79f34e32   Marcel Holtmann   Bluetooth: Use ne...
1682
  		if (hci_skb_pkt_type(skb) != HCI_ACLDATA_PKT &&
cc9740036   Marcel Holtmann   Bluetooth: Add mi...
1683
1684
  		    hci_skb_pkt_type(skb) != HCI_SCODATA_PKT &&
  		    hci_skb_pkt_type(skb) != HCI_ISODATA_PKT) {
bb77543eb   Marcel Holtmann   Bluetooth: Restri...
1685
1686
1687
  			err = -EINVAL;
  			goto drop;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1688
  		skb_queue_tail(&hdev->raw_q, skb);
3eff45eaf   Gustavo F. Padovan   Bluetooth: conver...
1689
  		queue_work(hdev->workqueue, &hdev->tx_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
  	}
  
  	err = len;
  
  done:
  	release_sock(sk);
  	return err;
  
  drop:
  	kfree_skb(skb);
  	goto done;
  }
8fc9ced39   Gustavo Padovan   Bluetooth: Fix co...
1702
  static int hci_sock_setsockopt(struct socket *sock, int level, int optname,
a7b75c5a8   Christoph Hellwig   net: pass a sockp...
1703
  			       sockptr_t optval, unsigned int len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1704
1705
1706
1707
1708
1709
  {
  	struct hci_ufilter uf = { .opcode = 0 };
  	struct sock *sk = sock->sk;
  	int err = 0, opt = 0;
  
  	BT_DBG("sk %p, opt %d", sk, optname);
47b0f573f   Marcel Holtmann   Bluetooth: Check ...
1710
1711
  	if (level != SOL_HCI)
  		return -ENOPROTOOPT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1712
  	lock_sock(sk);
2f39cdb7a   Marcel Holtmann   Bluetooth: Limit ...
1713
  	if (hci_pi(sk)->channel != HCI_CHANNEL_RAW) {
c2371e80b   Marcel Holtmann   Bluetooth: Fix er...
1714
  		err = -EBADFD;
2f39cdb7a   Marcel Holtmann   Bluetooth: Limit ...
1715
1716
  		goto done;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1717
1718
  	switch (optname) {
  	case HCI_DATA_DIR:
a7b75c5a8   Christoph Hellwig   net: pass a sockp...
1719
  		if (copy_from_sockptr(&opt, optval, sizeof(opt))) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
  			err = -EFAULT;
  			break;
  		}
  
  		if (opt)
  			hci_pi(sk)->cmsg_mask |= HCI_CMSG_DIR;
  		else
  			hci_pi(sk)->cmsg_mask &= ~HCI_CMSG_DIR;
  		break;
  
  	case HCI_TIME_STAMP:
a7b75c5a8   Christoph Hellwig   net: pass a sockp...
1731
  		if (copy_from_sockptr(&opt, optval, sizeof(opt))) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
  			err = -EFAULT;
  			break;
  		}
  
  		if (opt)
  			hci_pi(sk)->cmsg_mask |= HCI_CMSG_TSTAMP;
  		else
  			hci_pi(sk)->cmsg_mask &= ~HCI_CMSG_TSTAMP;
  		break;
  
  	case HCI_FILTER:
0878b6667   Marcel Holtmann   [Bluetooth] Fix L...
1743
1744
1745
1746
1747
1748
1749
1750
  		{
  			struct hci_filter *f = &hci_pi(sk)->filter;
  
  			uf.type_mask = f->type_mask;
  			uf.opcode    = f->opcode;
  			uf.event_mask[0] = *((u32 *) f->event_mask + 0);
  			uf.event_mask[1] = *((u32 *) f->event_mask + 1);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1751
  		len = min_t(unsigned int, len, sizeof(uf));
a7b75c5a8   Christoph Hellwig   net: pass a sockp...
1752
  		if (copy_from_sockptr(&uf, optval, len)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
  			err = -EFAULT;
  			break;
  		}
  
  		if (!capable(CAP_NET_RAW)) {
  			uf.type_mask &= hci_sec_filter.type_mask;
  			uf.event_mask[0] &= *((u32 *) hci_sec_filter.event_mask + 0);
  			uf.event_mask[1] &= *((u32 *) hci_sec_filter.event_mask + 1);
  		}
  
  		{
  			struct hci_filter *f = &hci_pi(sk)->filter;
  
  			f->type_mask = uf.type_mask;
  			f->opcode    = uf.opcode;
  			*((u32 *) f->event_mask + 0) = uf.event_mask[0];
  			*((u32 *) f->event_mask + 1) = uf.event_mask[1];
  		}
8e87d1425   YOSHIFUJI Hideaki   [NET] BLUETOOTH: ...
1771
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1772
1773
1774
1775
1776
  
  	default:
  		err = -ENOPROTOOPT;
  		break;
  	}
2f39cdb7a   Marcel Holtmann   Bluetooth: Limit ...
1777
  done:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1778
1779
1780
  	release_sock(sk);
  	return err;
  }
8fc9ced39   Gustavo Padovan   Bluetooth: Fix co...
1781
1782
  static int hci_sock_getsockopt(struct socket *sock, int level, int optname,
  			       char __user *optval, int __user *optlen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1783
1784
1785
  {
  	struct hci_ufilter uf;
  	struct sock *sk = sock->sk;
cedc54697   Marcel Holtmann   Bluetooth: Lock s...
1786
1787
1788
  	int len, opt, err = 0;
  
  	BT_DBG("sk %p, opt %d", sk, optname);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1789

47b0f573f   Marcel Holtmann   Bluetooth: Check ...
1790
1791
  	if (level != SOL_HCI)
  		return -ENOPROTOOPT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1792
1793
  	if (get_user(len, optlen))
  		return -EFAULT;
cedc54697   Marcel Holtmann   Bluetooth: Lock s...
1794
1795
1796
  	lock_sock(sk);
  
  	if (hci_pi(sk)->channel != HCI_CHANNEL_RAW) {
c2371e80b   Marcel Holtmann   Bluetooth: Fix er...
1797
  		err = -EBADFD;
cedc54697   Marcel Holtmann   Bluetooth: Lock s...
1798
1799
  		goto done;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1800
1801
1802
1803
  	switch (optname) {
  	case HCI_DATA_DIR:
  		if (hci_pi(sk)->cmsg_mask & HCI_CMSG_DIR)
  			opt = 1;
8e87d1425   YOSHIFUJI Hideaki   [NET] BLUETOOTH: ...
1804
  		else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1805
1806
1807
  			opt = 0;
  
  		if (put_user(opt, optval))
cedc54697   Marcel Holtmann   Bluetooth: Lock s...
1808
  			err = -EFAULT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1809
1810
1811
1812
1813
  		break;
  
  	case HCI_TIME_STAMP:
  		if (hci_pi(sk)->cmsg_mask & HCI_CMSG_TSTAMP)
  			opt = 1;
8e87d1425   YOSHIFUJI Hideaki   [NET] BLUETOOTH: ...
1814
  		else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1815
1816
1817
  			opt = 0;
  
  		if (put_user(opt, optval))
cedc54697   Marcel Holtmann   Bluetooth: Lock s...
1818
  			err = -EFAULT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1819
1820
1821
1822
1823
  		break;
  
  	case HCI_FILTER:
  		{
  			struct hci_filter *f = &hci_pi(sk)->filter;
e15ca9a0e   Mathias Krause   Bluetooth: HCI - ...
1824
  			memset(&uf, 0, sizeof(uf));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1825
1826
1827
1828
1829
1830
1831
1832
  			uf.type_mask = f->type_mask;
  			uf.opcode    = f->opcode;
  			uf.event_mask[0] = *((u32 *) f->event_mask + 0);
  			uf.event_mask[1] = *((u32 *) f->event_mask + 1);
  		}
  
  		len = min_t(unsigned int, len, sizeof(uf));
  		if (copy_to_user(optval, &uf, len))
cedc54697   Marcel Holtmann   Bluetooth: Lock s...
1833
  			err = -EFAULT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1834
1835
1836
  		break;
  
  	default:
cedc54697   Marcel Holtmann   Bluetooth: Lock s...
1837
  		err = -ENOPROTOOPT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1838
1839
  		break;
  	}
cedc54697   Marcel Holtmann   Bluetooth: Lock s...
1840
1841
1842
  done:
  	release_sock(sk);
  	return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1843
  }
90ddc4f04   Eric Dumazet   [NET]: move struc...
1844
  static const struct proto_ops hci_sock_ops = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1845
1846
1847
1848
1849
1850
1851
1852
  	.family		= PF_BLUETOOTH,
  	.owner		= THIS_MODULE,
  	.release	= hci_sock_release,
  	.bind		= hci_sock_bind,
  	.getname	= hci_sock_getname,
  	.sendmsg	= hci_sock_sendmsg,
  	.recvmsg	= hci_sock_recvmsg,
  	.ioctl		= hci_sock_ioctl,
7a6038b30   Arnd Bergmann   compat_ioctl: mov...
1853
1854
1855
  #ifdef CONFIG_COMPAT
  	.compat_ioctl	= hci_sock_compat_ioctl,
  #endif
a11e1d432   Linus Torvalds   Revert changes to...
1856
  	.poll		= datagram_poll,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
  	.listen		= sock_no_listen,
  	.shutdown	= sock_no_shutdown,
  	.setsockopt	= hci_sock_setsockopt,
  	.getsockopt	= hci_sock_getsockopt,
  	.connect	= sock_no_connect,
  	.socketpair	= sock_no_socketpair,
  	.accept		= sock_no_accept,
  	.mmap		= sock_no_mmap
  };
  
  static struct proto hci_sk_proto = {
  	.name		= "HCI",
  	.owner		= THIS_MODULE,
  	.obj_size	= sizeof(struct hci_pinfo)
  };
3f378b684   Eric Paris   net: pass kern to...
1872
1873
  static int hci_sock_create(struct net *net, struct socket *sock, int protocol,
  			   int kern)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1874
1875
1876
1877
1878
1879
1880
1881
1882
  {
  	struct sock *sk;
  
  	BT_DBG("sock %p", sock);
  
  	if (sock->type != SOCK_RAW)
  		return -ESOCKTNOSUPPORT;
  
  	sock->ops = &hci_sock_ops;
11aa9c28b   Eric W. Biederman   net: Pass kern fr...
1883
  	sk = sk_alloc(net, PF_BLUETOOTH, GFP_ATOMIC, &hci_sk_proto, kern);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
  	if (!sk)
  		return -ENOMEM;
  
  	sock_init_data(sock, sk);
  
  	sock_reset_flag(sk, SOCK_ZAPPED);
  
  	sk->sk_protocol = protocol;
  
  	sock->state = SS_UNCONNECTED;
  	sk->sk_state = BT_OPEN;
  
  	bt_sock_link(&hci_sk_list, sk);
  	return 0;
  }
ec1b4cf74   Stephen Hemminger   net: mark net_pro...
1899
  static const struct net_proto_family hci_sock_family_ops = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1900
1901
1902
1903
  	.family	= PF_BLUETOOTH,
  	.owner	= THIS_MODULE,
  	.create	= hci_sock_create,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1904
1905
1906
  int __init hci_sock_init(void)
  {
  	int err;
b0a8e282b   Marcel Holtmann   Bluetooth: Add BU...
1907
  	BUILD_BUG_ON(sizeof(struct sockaddr_hci) > sizeof(struct sockaddr));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1908
1909
1910
1911
1912
  	err = proto_register(&hci_sk_proto, 0);
  	if (err < 0)
  		return err;
  
  	err = bt_sock_register(BTPROTO_HCI, &hci_sock_family_ops);
f7c866378   Masatake YAMATO   Bluetooth: Added ...
1913
1914
  	if (err < 0) {
  		BT_ERR("HCI socket registration failed");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1915
  		goto error;
f7c866378   Masatake YAMATO   Bluetooth: Added ...
1916
  	}
b03166152   Al Viro   bluetooth: kill u...
1917
  	err = bt_procfs_init(&init_net, "hci", &hci_sk_list, NULL);
f7c866378   Masatake YAMATO   Bluetooth: Added ...
1918
1919
1920
1921
1922
  	if (err < 0) {
  		BT_ERR("Failed to create HCI proc file");
  		bt_sock_unregister(BTPROTO_HCI);
  		goto error;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1923

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1924
1925
1926
1927
1928
  	BT_INFO("HCI socket layer initialized");
  
  	return 0;
  
  error:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1929
1930
1931
  	proto_unregister(&hci_sk_proto);
  	return err;
  }
b7440a14f   Anand Gadiyar   Bluetooth: fix bu...
1932
  void hci_sock_cleanup(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1933
  {
f7c866378   Masatake YAMATO   Bluetooth: Added ...
1934
  	bt_procfs_cleanup(&init_net, "hci");
5e9d7f868   David Herrmann   Bluetooth: discar...
1935
  	bt_sock_unregister(BTPROTO_HCI);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1936
  	proto_unregister(&hci_sk_proto);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1937
  }