1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include <linux/kref.h>
25#include <linux/module.h>
26#include <linux/file.h>
27#include <linux/kthread.h>
28#include <linux/hidraw.h>
29
30#include <net/bluetooth/bluetooth.h>
31#include <net/bluetooth/hci_core.h>
32#include <net/bluetooth/l2cap.h>
33
34#include "hidp.h"
35
36#define VERSION "1.2"
37
38static DECLARE_RWSEM(hidp_session_sem);
39static LIST_HEAD(hidp_session_list);
40
41static unsigned char hidp_keycode[256] = {
42 0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36,
43 37, 38, 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45,
44 21, 44, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 28, 1,
45 14, 15, 57, 12, 13, 26, 27, 43, 43, 39, 40, 41, 51, 52,
46 53, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 87, 88,
47 99, 70, 119, 110, 102, 104, 111, 107, 109, 106, 105, 108, 103, 69,
48 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71, 72, 73,
49 82, 83, 86, 127, 116, 117, 183, 184, 185, 186, 187, 188, 189, 190,
50 191, 192, 193, 194, 134, 138, 130, 132, 128, 129, 131, 137, 133, 135,
51 136, 113, 115, 114, 0, 0, 0, 121, 0, 89, 93, 124, 92, 94,
52 95, 0, 0, 0, 122, 123, 90, 91, 85, 0, 0, 0, 0, 0,
53 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
54 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
55 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
57 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
58 29, 42, 56, 125, 97, 54, 100, 126, 164, 166, 165, 163, 161, 115,
59 114, 113, 150, 158, 159, 128, 136, 177, 178, 176, 142, 152, 173, 140
60};
61
62static unsigned char hidp_mkeyspat[] = { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
63
64static int hidp_session_probe(struct l2cap_conn *conn,
65 struct l2cap_user *user);
66static void hidp_session_remove(struct l2cap_conn *conn,
67 struct l2cap_user *user);
68static int hidp_session_thread(void *arg);
69static void hidp_session_terminate(struct hidp_session *s);
70
71static void hidp_copy_session(struct hidp_session *session, struct hidp_conninfo *ci)
72{
73 u32 valid_flags = 0;
74 memset(ci, 0, sizeof(*ci));
75 bacpy(&ci->bdaddr, &session->bdaddr);
76
77 ci->flags = session->flags & valid_flags;
78 ci->state = BT_CONNECTED;
79
80 if (session->input) {
81 ci->vendor = session->input->id.vendor;
82 ci->product = session->input->id.product;
83 ci->version = session->input->id.version;
84 if (session->input->name)
85 strlcpy(ci->name, session->input->name, 128);
86 else
87 strlcpy(ci->name, "HID Boot Device", 128);
88 } else if (session->hid) {
89 ci->vendor = session->hid->vendor;
90 ci->product = session->hid->product;
91 ci->version = session->hid->version;
92 strlcpy(ci->name, session->hid->name, 128);
93 }
94}
95
96
97static int hidp_send_message(struct hidp_session *session, struct socket *sock,
98 struct sk_buff_head *transmit, unsigned char hdr,
99 const unsigned char *data, int size)
100{
101 struct sk_buff *skb;
102 struct sock *sk = sock->sk;
103
104 BT_DBG("session %p data %p size %d", session, data, size);
105
106 if (atomic_read(&session->terminate))
107 return -EIO;
108
109 skb = alloc_skb(size + 1, GFP_ATOMIC);
110 if (!skb) {
111 BT_ERR("Can't allocate memory for new frame");
112 return -ENOMEM;
113 }
114
115 *(u8 *)skb_put(skb, 1) = hdr;
116 if (data && size > 0)
117 memcpy(skb_put(skb, size), data, size);
118
119 skb_queue_tail(transmit, skb);
120 wake_up_interruptible(sk_sleep(sk));
121
122 return 0;
123}
124
125static int hidp_send_ctrl_message(struct hidp_session *session,
126 unsigned char hdr, const unsigned char *data,
127 int size)
128{
129 return hidp_send_message(session, session->ctrl_sock,
130 &session->ctrl_transmit, hdr, data, size);
131}
132
133static int hidp_send_intr_message(struct hidp_session *session,
134 unsigned char hdr, const unsigned char *data,
135 int size)
136{
137 return hidp_send_message(session, session->intr_sock,
138 &session->intr_transmit, hdr, data, size);
139}
140
141static int hidp_input_event(struct input_dev *dev, unsigned int type,
142 unsigned int code, int value)
143{
144 struct hidp_session *session = input_get_drvdata(dev);
145 unsigned char newleds;
146 unsigned char hdr, data[2];
147
148 BT_DBG("session %p type %d code %d value %d",
149 session, type, code, value);
150
151 if (type != EV_LED)
152 return -1;
153
154 newleds = (!!test_bit(LED_KANA, dev->led) << 3) |
155 (!!test_bit(LED_COMPOSE, dev->led) << 3) |
156 (!!test_bit(LED_SCROLLL, dev->led) << 2) |
157 (!!test_bit(LED_CAPSL, dev->led) << 1) |
158 (!!test_bit(LED_NUML, dev->led) << 0);
159
160 if (session->leds == newleds)
161 return 0;
162
163 session->leds = newleds;
164
165 hdr = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUPUT;
166 data[0] = 0x01;
167 data[1] = newleds;
168
169 return hidp_send_intr_message(session, hdr, data, 2);
170}
171
172static void hidp_input_report(struct hidp_session *session, struct sk_buff *skb)
173{
174 struct input_dev *dev = session->input;
175 unsigned char *keys = session->keys;
176 unsigned char *udata = skb->data + 1;
177 signed char *sdata = skb->data + 1;
178 int i, size = skb->len - 1;
179
180 switch (skb->data[0]) {
181 case 0x01:
182 for (i = 0; i < 8; i++)
183 input_report_key(dev, hidp_keycode[i + 224], (udata[0] >> i) & 1);
184
185
186
187 if (!memcmp(udata + 2, hidp_mkeyspat, 6))
188 break;
189
190 for (i = 2; i < 8; i++) {
191 if (keys[i] > 3 && memscan(udata + 2, keys[i], 6) == udata + 8) {
192 if (hidp_keycode[keys[i]])
193 input_report_key(dev, hidp_keycode[keys[i]], 0);
194 else
195 BT_ERR("Unknown key (scancode %#x) released.", keys[i]);
196 }
197
198 if (udata[i] > 3 && memscan(keys + 2, udata[i], 6) == keys + 8) {
199 if (hidp_keycode[udata[i]])
200 input_report_key(dev, hidp_keycode[udata[i]], 1);
201 else
202 BT_ERR("Unknown key (scancode %#x) pressed.", udata[i]);
203 }
204 }
205
206 memcpy(keys, udata, 8);
207 break;
208
209 case 0x02:
210 input_report_key(dev, BTN_LEFT, sdata[0] & 0x01);
211 input_report_key(dev, BTN_RIGHT, sdata[0] & 0x02);
212 input_report_key(dev, BTN_MIDDLE, sdata[0] & 0x04);
213 input_report_key(dev, BTN_SIDE, sdata[0] & 0x08);
214 input_report_key(dev, BTN_EXTRA, sdata[0] & 0x10);
215
216 input_report_rel(dev, REL_X, sdata[1]);
217 input_report_rel(dev, REL_Y, sdata[2]);
218
219 if (size > 3)
220 input_report_rel(dev, REL_WHEEL, sdata[3]);
221 break;
222 }
223
224 input_sync(dev);
225}
226
227static int hidp_get_raw_report(struct hid_device *hid,
228 unsigned char report_number,
229 unsigned char *data, size_t count,
230 unsigned char report_type)
231{
232 struct hidp_session *session = hid->driver_data;
233 struct sk_buff *skb;
234 size_t len;
235 int numbered_reports = hid->report_enum[report_type].numbered;
236 int ret;
237
238 if (atomic_read(&session->terminate))
239 return -EIO;
240
241 switch (report_type) {
242 case HID_FEATURE_REPORT:
243 report_type = HIDP_TRANS_GET_REPORT | HIDP_DATA_RTYPE_FEATURE;
244 break;
245 case HID_INPUT_REPORT:
246 report_type = HIDP_TRANS_GET_REPORT | HIDP_DATA_RTYPE_INPUT;
247 break;
248 case HID_OUTPUT_REPORT:
249 report_type = HIDP_TRANS_GET_REPORT | HIDP_DATA_RTYPE_OUPUT;
250 break;
251 default:
252 return -EINVAL;
253 }
254
255 if (mutex_lock_interruptible(&session->report_mutex))
256 return -ERESTARTSYS;
257
258
259 session->waiting_report_type = report_type & HIDP_DATA_RTYPE_MASK;
260 session->waiting_report_number = numbered_reports ? report_number : -1;
261 set_bit(HIDP_WAITING_FOR_RETURN, &session->flags);
262 data[0] = report_number;
263 ret = hidp_send_ctrl_message(session, report_type, data, 1);
264 if (ret)
265 goto err;
266
267
268
269 while (test_bit(HIDP_WAITING_FOR_RETURN, &session->flags) &&
270 !atomic_read(&session->terminate)) {
271 int res;
272
273 res = wait_event_interruptible_timeout(session->report_queue,
274 !test_bit(HIDP_WAITING_FOR_RETURN, &session->flags)
275 || atomic_read(&session->terminate),
276 5*HZ);
277 if (res == 0) {
278
279 ret = -EIO;
280 goto err;
281 }
282 if (res < 0) {
283
284 ret = -ERESTARTSYS;
285 goto err;
286 }
287 }
288
289 skb = session->report_return;
290 if (skb) {
291 len = skb->len < count ? skb->len : count;
292 memcpy(data, skb->data, len);
293
294 kfree_skb(skb);
295 session->report_return = NULL;
296 } else {
297
298 len = -EIO;
299 }
300
301 clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags);
302 mutex_unlock(&session->report_mutex);
303
304 return len;
305
306err:
307 clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags);
308 mutex_unlock(&session->report_mutex);
309 return ret;
310}
311
312static int hidp_set_raw_report(struct hid_device *hid, unsigned char reportnum,
313 unsigned char *data, size_t count,
314 unsigned char report_type)
315{
316 struct hidp_session *session = hid->driver_data;
317 int ret;
318
319 switch (report_type) {
320 case HID_FEATURE_REPORT:
321 report_type = HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE;
322 break;
323 case HID_INPUT_REPORT:
324 report_type = HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_INPUT;
325 break;
326 case HID_OUTPUT_REPORT:
327 report_type = HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_OUPUT;
328 break;
329 default:
330 return -EINVAL;
331 }
332
333 if (mutex_lock_interruptible(&session->report_mutex))
334 return -ERESTARTSYS;
335
336
337 data[0] = reportnum;
338 set_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags);
339 ret = hidp_send_ctrl_message(session, report_type, data, count);
340 if (ret)
341 goto err;
342
343
344 while (test_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags) &&
345 !atomic_read(&session->terminate)) {
346 int res;
347
348 res = wait_event_interruptible_timeout(session->report_queue,
349 !test_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags)
350 || atomic_read(&session->terminate),
351 10*HZ);
352 if (res == 0) {
353
354 ret = -EIO;
355 goto err;
356 }
357 if (res < 0) {
358
359 ret = -ERESTARTSYS;
360 goto err;
361 }
362 }
363
364 if (!session->output_report_success) {
365 ret = -EIO;
366 goto err;
367 }
368
369 ret = count;
370
371err:
372 clear_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags);
373 mutex_unlock(&session->report_mutex);
374 return ret;
375}
376
377static int hidp_output_report(struct hid_device *hid, __u8 *data, size_t count)
378{
379 struct hidp_session *session = hid->driver_data;
380
381 return hidp_send_intr_message(session,
382 HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUPUT,
383 data, count);
384}
385
386static int hidp_raw_request(struct hid_device *hid, unsigned char reportnum,
387 __u8 *buf, size_t len, unsigned char rtype,
388 int reqtype)
389{
390 switch (reqtype) {
391 case HID_REQ_GET_REPORT:
392 return hidp_get_raw_report(hid, reportnum, buf, len, rtype);
393 case HID_REQ_SET_REPORT:
394 return hidp_set_raw_report(hid, reportnum, buf, len, rtype);
395 default:
396 return -EIO;
397 }
398}
399
400static void hidp_idle_timeout(unsigned long arg)
401{
402 struct hidp_session *session = (struct hidp_session *) arg;
403
404
405
406
407
408
409
410
411
412
413 session->intr_sock->sk->sk_err = EUNATCH;
414 session->ctrl_sock->sk->sk_err = EUNATCH;
415 wake_up_interruptible(sk_sleep(session->intr_sock->sk));
416 wake_up_interruptible(sk_sleep(session->ctrl_sock->sk));
417
418 hidp_session_terminate(session);
419}
420
421static void hidp_set_timer(struct hidp_session *session)
422{
423 if (session->idle_to > 0)
424 mod_timer(&session->timer, jiffies + HZ * session->idle_to);
425}
426
427static void hidp_del_timer(struct hidp_session *session)
428{
429 if (session->idle_to > 0)
430 del_timer(&session->timer);
431}
432
433static void hidp_process_report(struct hidp_session *session,
434 int type, const u8 *data, int len, int intr)
435{
436 if (len > HID_MAX_BUFFER_SIZE)
437 len = HID_MAX_BUFFER_SIZE;
438
439 memcpy(session->input_buf, data, len);
440 hid_input_report(session->hid, type, session->input_buf, len, intr);
441}
442
443static void hidp_process_handshake(struct hidp_session *session,
444 unsigned char param)
445{
446 BT_DBG("session %p param 0x%02x", session, param);
447 session->output_report_success = 0;
448
449 switch (param) {
450 case HIDP_HSHK_SUCCESSFUL:
451
452 session->output_report_success = 1;
453 break;
454
455 case HIDP_HSHK_NOT_READY:
456 case HIDP_HSHK_ERR_INVALID_REPORT_ID:
457 case HIDP_HSHK_ERR_UNSUPPORTED_REQUEST:
458 case HIDP_HSHK_ERR_INVALID_PARAMETER:
459 if (test_and_clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags))
460 wake_up_interruptible(&session->report_queue);
461
462
463 break;
464
465 case HIDP_HSHK_ERR_UNKNOWN:
466 break;
467
468 case HIDP_HSHK_ERR_FATAL:
469
470
471 hidp_send_ctrl_message(session,
472 HIDP_TRANS_HID_CONTROL | HIDP_CTRL_SOFT_RESET, NULL, 0);
473 break;
474
475 default:
476 hidp_send_ctrl_message(session,
477 HIDP_TRANS_HANDSHAKE | HIDP_HSHK_ERR_INVALID_PARAMETER, NULL, 0);
478 break;
479 }
480
481
482 if (test_and_clear_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags))
483 wake_up_interruptible(&session->report_queue);
484}
485
486static void hidp_process_hid_control(struct hidp_session *session,
487 unsigned char param)
488{
489 BT_DBG("session %p param 0x%02x", session, param);
490
491 if (param == HIDP_CTRL_VIRTUAL_CABLE_UNPLUG) {
492
493 skb_queue_purge(&session->ctrl_transmit);
494 skb_queue_purge(&session->intr_transmit);
495
496 hidp_session_terminate(session);
497 }
498}
499
500
501static int hidp_process_data(struct hidp_session *session, struct sk_buff *skb,
502 unsigned char param)
503{
504 int done_with_skb = 1;
505 BT_DBG("session %p skb %p len %d param 0x%02x", session, skb, skb->len, param);
506
507 switch (param) {
508 case HIDP_DATA_RTYPE_INPUT:
509 hidp_set_timer(session);
510
511 if (session->input)
512 hidp_input_report(session, skb);
513
514 if (session->hid)
515 hidp_process_report(session, HID_INPUT_REPORT,
516 skb->data, skb->len, 0);
517 break;
518
519 case HIDP_DATA_RTYPE_OTHER:
520 case HIDP_DATA_RTYPE_OUPUT:
521 case HIDP_DATA_RTYPE_FEATURE:
522 break;
523
524 default:
525 hidp_send_ctrl_message(session,
526 HIDP_TRANS_HANDSHAKE | HIDP_HSHK_ERR_INVALID_PARAMETER, NULL, 0);
527 }
528
529 if (test_bit(HIDP_WAITING_FOR_RETURN, &session->flags) &&
530 param == session->waiting_report_type) {
531 if (session->waiting_report_number < 0 ||
532 session->waiting_report_number == skb->data[0]) {
533
534 session->report_return = skb;
535 done_with_skb = 0;
536 clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags);
537 wake_up_interruptible(&session->report_queue);
538 }
539 }
540
541 return done_with_skb;
542}
543
544static void hidp_recv_ctrl_frame(struct hidp_session *session,
545 struct sk_buff *skb)
546{
547 unsigned char hdr, type, param;
548 int free_skb = 1;
549
550 BT_DBG("session %p skb %p len %d", session, skb, skb->len);
551
552 hdr = skb->data[0];
553 skb_pull(skb, 1);
554
555 type = hdr & HIDP_HEADER_TRANS_MASK;
556 param = hdr & HIDP_HEADER_PARAM_MASK;
557
558 switch (type) {
559 case HIDP_TRANS_HANDSHAKE:
560 hidp_process_handshake(session, param);
561 break;
562
563 case HIDP_TRANS_HID_CONTROL:
564 hidp_process_hid_control(session, param);
565 break;
566
567 case HIDP_TRANS_DATA:
568 free_skb = hidp_process_data(session, skb, param);
569 break;
570
571 default:
572 hidp_send_ctrl_message(session,
573 HIDP_TRANS_HANDSHAKE | HIDP_HSHK_ERR_UNSUPPORTED_REQUEST, NULL, 0);
574 break;
575 }
576
577 if (free_skb)
578 kfree_skb(skb);
579}
580
581static void hidp_recv_intr_frame(struct hidp_session *session,
582 struct sk_buff *skb)
583{
584 unsigned char hdr;
585
586 BT_DBG("session %p skb %p len %d", session, skb, skb->len);
587
588 hdr = skb->data[0];
589 skb_pull(skb, 1);
590
591 if (hdr == (HIDP_TRANS_DATA | HIDP_DATA_RTYPE_INPUT)) {
592 hidp_set_timer(session);
593
594 if (session->input)
595 hidp_input_report(session, skb);
596
597 if (session->hid) {
598 hidp_process_report(session, HID_INPUT_REPORT,
599 skb->data, skb->len, 1);
600 BT_DBG("report len %d", skb->len);
601 }
602 } else {
603 BT_DBG("Unsupported protocol header 0x%02x", hdr);
604 }
605
606 kfree_skb(skb);
607}
608
609static int hidp_send_frame(struct socket *sock, unsigned char *data, int len)
610{
611 struct kvec iv = { data, len };
612 struct msghdr msg;
613
614 BT_DBG("sock %p data %p len %d", sock, data, len);
615
616 if (!len)
617 return 0;
618
619 memset(&msg, 0, sizeof(msg));
620
621 return kernel_sendmsg(sock, &msg, &iv, 1, len);
622}
623
624
625static void hidp_process_transmit(struct hidp_session *session,
626 struct sk_buff_head *transmit,
627 struct socket *sock)
628{
629 struct sk_buff *skb;
630 int ret;
631
632 BT_DBG("session %p", session);
633
634 while ((skb = skb_dequeue(transmit))) {
635 ret = hidp_send_frame(sock, skb->data, skb->len);
636 if (ret == -EAGAIN) {
637 skb_queue_head(transmit, skb);
638 break;
639 } else if (ret < 0) {
640 hidp_session_terminate(session);
641 kfree_skb(skb);
642 break;
643 }
644
645 hidp_set_timer(session);
646 kfree_skb(skb);
647 }
648}
649
650static int hidp_setup_input(struct hidp_session *session,
651 struct hidp_connadd_req *req)
652{
653 struct input_dev *input;
654 int i;
655
656 input = input_allocate_device();
657 if (!input)
658 return -ENOMEM;
659
660 session->input = input;
661
662 input_set_drvdata(input, session);
663
664 input->name = "Bluetooth HID Boot Protocol Device";
665
666 input->id.bustype = BUS_BLUETOOTH;
667 input->id.vendor = req->vendor;
668 input->id.product = req->product;
669 input->id.version = req->version;
670
671 if (req->subclass & 0x40) {
672 set_bit(EV_KEY, input->evbit);
673 set_bit(EV_LED, input->evbit);
674 set_bit(EV_REP, input->evbit);
675
676 set_bit(LED_NUML, input->ledbit);
677 set_bit(LED_CAPSL, input->ledbit);
678 set_bit(LED_SCROLLL, input->ledbit);
679 set_bit(LED_COMPOSE, input->ledbit);
680 set_bit(LED_KANA, input->ledbit);
681
682 for (i = 0; i < sizeof(hidp_keycode); i++)
683 set_bit(hidp_keycode[i], input->keybit);
684 clear_bit(0, input->keybit);
685 }
686
687 if (req->subclass & 0x80) {
688 input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);
689 input->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) |
690 BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE);
691 input->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);
692 input->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_SIDE) |
693 BIT_MASK(BTN_EXTRA);
694 input->relbit[0] |= BIT_MASK(REL_WHEEL);
695 }
696
697 input->dev.parent = &session->conn->hcon->dev;
698
699 input->event = hidp_input_event;
700
701 return 0;
702}
703
704static int hidp_open(struct hid_device *hid)
705{
706 return 0;
707}
708
709static void hidp_close(struct hid_device *hid)
710{
711}
712
713static int hidp_parse(struct hid_device *hid)
714{
715 struct hidp_session *session = hid->driver_data;
716
717 return hid_parse_report(session->hid, session->rd_data,
718 session->rd_size);
719}
720
721static int hidp_start(struct hid_device *hid)
722{
723 return 0;
724}
725
726static void hidp_stop(struct hid_device *hid)
727{
728 struct hidp_session *session = hid->driver_data;
729
730 skb_queue_purge(&session->ctrl_transmit);
731 skb_queue_purge(&session->intr_transmit);
732
733 hid->claimed = 0;
734}
735
736struct hid_ll_driver hidp_hid_driver = {
737 .parse = hidp_parse,
738 .start = hidp_start,
739 .stop = hidp_stop,
740 .open = hidp_open,
741 .close = hidp_close,
742 .raw_request = hidp_raw_request,
743 .output_report = hidp_output_report,
744};
745EXPORT_SYMBOL_GPL(hidp_hid_driver);
746
747
748
749static int hidp_setup_hid(struct hidp_session *session,
750 struct hidp_connadd_req *req)
751{
752 struct hid_device *hid;
753 int err;
754
755 session->rd_data = memdup_user(req->rd_data, req->rd_size);
756 if (IS_ERR(session->rd_data))
757 return PTR_ERR(session->rd_data);
758
759 session->rd_size = req->rd_size;
760
761 hid = hid_allocate_device();
762 if (IS_ERR(hid)) {
763 err = PTR_ERR(hid);
764 goto fault;
765 }
766
767 session->hid = hid;
768
769 hid->driver_data = session;
770
771 hid->bus = BUS_BLUETOOTH;
772 hid->vendor = req->vendor;
773 hid->product = req->product;
774 hid->version = req->version;
775 hid->country = req->country;
776
777 strncpy(hid->name, req->name, sizeof(req->name) - 1);
778
779 snprintf(hid->phys, sizeof(hid->phys), "%pMR",
780 &l2cap_pi(session->ctrl_sock->sk)->chan->src);
781
782
783
784
785 snprintf(hid->uniq, sizeof(hid->uniq), "%pMR",
786 &l2cap_pi(session->ctrl_sock->sk)->chan->dst);
787
788 hid->dev.parent = &session->conn->hcon->dev;
789 hid->ll_driver = &hidp_hid_driver;
790
791
792 if (hid_ignore(hid)) {
793 hid_destroy_device(session->hid);
794 session->hid = NULL;
795 return -ENODEV;
796 }
797
798 return 0;
799
800fault:
801 kfree(session->rd_data);
802 session->rd_data = NULL;
803
804 return err;
805}
806
807
808static int hidp_session_dev_init(struct hidp_session *session,
809 struct hidp_connadd_req *req)
810{
811 int ret;
812
813 if (req->rd_size > 0) {
814 ret = hidp_setup_hid(session, req);
815 if (ret && ret != -ENODEV)
816 return ret;
817 }
818
819 if (!session->hid) {
820 ret = hidp_setup_input(session, req);
821 if (ret < 0)
822 return ret;
823 }
824
825 return 0;
826}
827
828
829static void hidp_session_dev_destroy(struct hidp_session *session)
830{
831 if (session->hid)
832 put_device(&session->hid->dev);
833 else if (session->input)
834 input_put_device(session->input);
835
836 kfree(session->rd_data);
837 session->rd_data = NULL;
838}
839
840
841static int hidp_session_dev_add(struct hidp_session *session)
842{
843 int ret;
844
845
846
847
848
849
850 if (session->hid) {
851 ret = hid_add_device(session->hid);
852 if (ret)
853 return ret;
854 get_device(&session->hid->dev);
855 } else if (session->input) {
856 ret = input_register_device(session->input);
857 if (ret)
858 return ret;
859 input_get_device(session->input);
860 }
861
862 return 0;
863}
864
865
866static void hidp_session_dev_del(struct hidp_session *session)
867{
868 if (session->hid)
869 hid_destroy_device(session->hid);
870 else if (session->input)
871 input_unregister_device(session->input);
872}
873
874
875
876
877
878
879
880
881
882
883static void hidp_session_dev_work(struct work_struct *work)
884{
885 struct hidp_session *session = container_of(work,
886 struct hidp_session,
887 dev_init);
888 int ret;
889
890 ret = hidp_session_dev_add(session);
891 if (!ret)
892 atomic_inc(&session->state);
893 else
894 hidp_session_terminate(session);
895}
896
897
898
899
900
901
902
903
904
905static int hidp_session_new(struct hidp_session **out, const bdaddr_t *bdaddr,
906 struct socket *ctrl_sock,
907 struct socket *intr_sock,
908 struct hidp_connadd_req *req,
909 struct l2cap_conn *conn)
910{
911 struct hidp_session *session;
912 int ret;
913 struct bt_sock *ctrl, *intr;
914
915 ctrl = bt_sk(ctrl_sock->sk);
916 intr = bt_sk(intr_sock->sk);
917
918 session = kzalloc(sizeof(*session), GFP_KERNEL);
919 if (!session)
920 return -ENOMEM;
921
922
923 kref_init(&session->ref);
924 atomic_set(&session->state, HIDP_SESSION_IDLING);
925 init_waitqueue_head(&session->state_queue);
926 session->flags = req->flags & BIT(HIDP_BLUETOOTH_VENDOR_ID);
927
928
929 bacpy(&session->bdaddr, bdaddr);
930 session->conn = l2cap_conn_get(conn);
931 session->user.probe = hidp_session_probe;
932 session->user.remove = hidp_session_remove;
933 INIT_LIST_HEAD(&session->user.list);
934 session->ctrl_sock = ctrl_sock;
935 session->intr_sock = intr_sock;
936 skb_queue_head_init(&session->ctrl_transmit);
937 skb_queue_head_init(&session->intr_transmit);
938 session->ctrl_mtu = min_t(uint, l2cap_pi(ctrl)->chan->omtu,
939 l2cap_pi(ctrl)->chan->imtu);
940 session->intr_mtu = min_t(uint, l2cap_pi(intr)->chan->omtu,
941 l2cap_pi(intr)->chan->imtu);
942 session->idle_to = req->idle_to;
943
944
945 INIT_WORK(&session->dev_init, hidp_session_dev_work);
946 setup_timer(&session->timer, hidp_idle_timeout,
947 (unsigned long)session);
948
949
950 mutex_init(&session->report_mutex);
951 init_waitqueue_head(&session->report_queue);
952
953 ret = hidp_session_dev_init(session, req);
954 if (ret)
955 goto err_free;
956
957 get_file(session->intr_sock->file);
958 get_file(session->ctrl_sock->file);
959 *out = session;
960 return 0;
961
962err_free:
963 l2cap_conn_put(session->conn);
964 kfree(session);
965 return ret;
966}
967
968
969static void hidp_session_get(struct hidp_session *session)
970{
971 kref_get(&session->ref);
972}
973
974
975static void session_free(struct kref *ref)
976{
977 struct hidp_session *session = container_of(ref, struct hidp_session,
978 ref);
979
980 hidp_session_dev_destroy(session);
981 skb_queue_purge(&session->ctrl_transmit);
982 skb_queue_purge(&session->intr_transmit);
983 fput(session->intr_sock->file);
984 fput(session->ctrl_sock->file);
985 l2cap_conn_put(session->conn);
986 kfree(session);
987}
988
989
990static void hidp_session_put(struct hidp_session *session)
991{
992 kref_put(&session->ref, session_free);
993}
994
995
996
997
998
999
1000
1001static struct hidp_session *__hidp_session_find(const bdaddr_t *bdaddr)
1002{
1003 struct hidp_session *session;
1004
1005 list_for_each_entry(session, &hidp_session_list, list) {
1006 if (!bacmp(bdaddr, &session->bdaddr))
1007 return session;
1008 }
1009
1010 return NULL;
1011}
1012
1013
1014
1015
1016
1017
1018static struct hidp_session *hidp_session_find(const bdaddr_t *bdaddr)
1019{
1020 struct hidp_session *session;
1021
1022 down_read(&hidp_session_sem);
1023
1024 session = __hidp_session_find(bdaddr);
1025 if (session)
1026 hidp_session_get(session);
1027
1028 up_read(&hidp_session_sem);
1029
1030 return session;
1031}
1032
1033
1034
1035
1036
1037
1038
1039
1040static int hidp_session_start_sync(struct hidp_session *session)
1041{
1042 unsigned int vendor, product;
1043
1044 if (session->hid) {
1045 vendor = session->hid->vendor;
1046 product = session->hid->product;
1047 } else if (session->input) {
1048 vendor = session->input->id.vendor;
1049 product = session->input->id.product;
1050 } else {
1051 vendor = 0x0000;
1052 product = 0x0000;
1053 }
1054
1055 session->task = kthread_run(hidp_session_thread, session,
1056 "khidpd_%04x%04x", vendor, product);
1057 if (IS_ERR(session->task))
1058 return PTR_ERR(session->task);
1059
1060 while (atomic_read(&session->state) <= HIDP_SESSION_IDLING)
1061 wait_event(session->state_queue,
1062 atomic_read(&session->state) > HIDP_SESSION_IDLING);
1063
1064 return 0;
1065}
1066
1067
1068
1069
1070
1071
1072
1073
1074static void hidp_session_terminate(struct hidp_session *session)
1075{
1076 atomic_inc(&session->terminate);
1077 wake_up_process(session->task);
1078}
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089static int hidp_session_probe(struct l2cap_conn *conn,
1090 struct l2cap_user *user)
1091{
1092 struct hidp_session *session = container_of(user,
1093 struct hidp_session,
1094 user);
1095 struct hidp_session *s;
1096 int ret;
1097
1098 down_write(&hidp_session_sem);
1099
1100
1101 s = __hidp_session_find(&session->bdaddr);
1102 if (s) {
1103 ret = -EEXIST;
1104 goto out_unlock;
1105 }
1106
1107 if (session->input) {
1108 ret = hidp_session_dev_add(session);
1109 if (ret)
1110 goto out_unlock;
1111 }
1112
1113 ret = hidp_session_start_sync(session);
1114 if (ret)
1115 goto out_del;
1116
1117
1118 if (session->input)
1119 atomic_inc(&session->state);
1120 else
1121 schedule_work(&session->dev_init);
1122
1123 hidp_session_get(session);
1124 list_add(&session->list, &hidp_session_list);
1125 ret = 0;
1126 goto out_unlock;
1127
1128out_del:
1129 if (session->input)
1130 hidp_session_dev_del(session);
1131out_unlock:
1132 up_write(&hidp_session_sem);
1133 return ret;
1134}
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150static void hidp_session_remove(struct l2cap_conn *conn,
1151 struct l2cap_user *user)
1152{
1153 struct hidp_session *session = container_of(user,
1154 struct hidp_session,
1155 user);
1156
1157 down_write(&hidp_session_sem);
1158
1159 hidp_session_terminate(session);
1160
1161 cancel_work_sync(&session->dev_init);
1162 if (session->input ||
1163 atomic_read(&session->state) > HIDP_SESSION_PREPARING)
1164 hidp_session_dev_del(session);
1165
1166 list_del(&session->list);
1167
1168 up_write(&hidp_session_sem);
1169
1170 hidp_session_put(session);
1171}
1172
1173
1174
1175
1176
1177
1178
1179static void hidp_session_run(struct hidp_session *session)
1180{
1181 struct sock *ctrl_sk = session->ctrl_sock->sk;
1182 struct sock *intr_sk = session->intr_sock->sk;
1183 struct sk_buff *skb;
1184
1185 for (;;) {
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196 set_current_state(TASK_INTERRUPTIBLE);
1197
1198 if (atomic_read(&session->terminate))
1199 break;
1200
1201 if (ctrl_sk->sk_state != BT_CONNECTED ||
1202 intr_sk->sk_state != BT_CONNECTED)
1203 break;
1204
1205
1206 while ((skb = skb_dequeue(&intr_sk->sk_receive_queue))) {
1207 skb_orphan(skb);
1208 if (!skb_linearize(skb))
1209 hidp_recv_intr_frame(session, skb);
1210 else
1211 kfree_skb(skb);
1212 }
1213
1214
1215 hidp_process_transmit(session, &session->intr_transmit,
1216 session->intr_sock);
1217
1218
1219 while ((skb = skb_dequeue(&ctrl_sk->sk_receive_queue))) {
1220 skb_orphan(skb);
1221 if (!skb_linearize(skb))
1222 hidp_recv_ctrl_frame(session, skb);
1223 else
1224 kfree_skb(skb);
1225 }
1226
1227
1228 hidp_process_transmit(session, &session->ctrl_transmit,
1229 session->ctrl_sock);
1230
1231 schedule();
1232 }
1233
1234 atomic_inc(&session->terminate);
1235 set_current_state(TASK_RUNNING);
1236}
1237
1238
1239
1240
1241
1242
1243
1244
1245static int hidp_session_thread(void *arg)
1246{
1247 struct hidp_session *session = arg;
1248 wait_queue_t ctrl_wait, intr_wait;
1249
1250 BT_DBG("session %p", session);
1251
1252
1253 hidp_session_get(session);
1254 __module_get(THIS_MODULE);
1255 set_user_nice(current, -15);
1256 hidp_set_timer(session);
1257
1258 init_waitqueue_entry(&ctrl_wait, current);
1259 init_waitqueue_entry(&intr_wait, current);
1260 add_wait_queue(sk_sleep(session->ctrl_sock->sk), &ctrl_wait);
1261 add_wait_queue(sk_sleep(session->intr_sock->sk), &intr_wait);
1262
1263
1264 smp_mb();
1265
1266
1267 atomic_inc(&session->state);
1268 wake_up(&session->state_queue);
1269
1270
1271 hidp_session_run(session);
1272
1273
1274 remove_wait_queue(sk_sleep(session->intr_sock->sk), &intr_wait);
1275 remove_wait_queue(sk_sleep(session->intr_sock->sk), &ctrl_wait);
1276 wake_up_interruptible(&session->report_queue);
1277 hidp_del_timer(session);
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287 l2cap_unregister_user(session->conn, &session->user);
1288 hidp_session_put(session);
1289
1290 module_put_and_exit(0);
1291 return 0;
1292}
1293
1294static int hidp_verify_sockets(struct socket *ctrl_sock,
1295 struct socket *intr_sock)
1296{
1297 struct l2cap_chan *ctrl_chan, *intr_chan;
1298 struct bt_sock *ctrl, *intr;
1299 struct hidp_session *session;
1300
1301 if (!l2cap_is_socket(ctrl_sock) || !l2cap_is_socket(intr_sock))
1302 return -EINVAL;
1303
1304 ctrl_chan = l2cap_pi(ctrl_sock->sk)->chan;
1305 intr_chan = l2cap_pi(intr_sock->sk)->chan;
1306
1307 if (bacmp(&ctrl_chan->src, &intr_chan->src) ||
1308 bacmp(&ctrl_chan->dst, &intr_chan->dst))
1309 return -ENOTUNIQ;
1310
1311 ctrl = bt_sk(ctrl_sock->sk);
1312 intr = bt_sk(intr_sock->sk);
1313
1314 if (ctrl->sk.sk_state != BT_CONNECTED ||
1315 intr->sk.sk_state != BT_CONNECTED)
1316 return -EBADFD;
1317
1318
1319 session = hidp_session_find(&ctrl_chan->dst);
1320 if (session) {
1321 hidp_session_put(session);
1322 return -EEXIST;
1323 }
1324
1325 return 0;
1326}
1327
1328int hidp_connection_add(struct hidp_connadd_req *req,
1329 struct socket *ctrl_sock,
1330 struct socket *intr_sock)
1331{
1332 u32 valid_flags = BIT(HIDP_VIRTUAL_CABLE_UNPLUG) |
1333 BIT(HIDP_BOOT_PROTOCOL_MODE);
1334 struct hidp_session *session;
1335 struct l2cap_conn *conn;
1336 struct l2cap_chan *chan;
1337 int ret;
1338
1339 ret = hidp_verify_sockets(ctrl_sock, intr_sock);
1340 if (ret)
1341 return ret;
1342
1343 if (req->flags & ~valid_flags)
1344 return -EINVAL;
1345
1346 chan = l2cap_pi(ctrl_sock->sk)->chan;
1347 conn = NULL;
1348 l2cap_chan_lock(chan);
1349 if (chan->conn)
1350 conn = l2cap_conn_get(chan->conn);
1351 l2cap_chan_unlock(chan);
1352
1353 if (!conn)
1354 return -EBADFD;
1355
1356 ret = hidp_session_new(&session, &chan->dst, ctrl_sock,
1357 intr_sock, req, conn);
1358 if (ret)
1359 goto out_conn;
1360
1361 ret = l2cap_register_user(conn, &session->user);
1362 if (ret)
1363 goto out_session;
1364
1365 ret = 0;
1366
1367out_session:
1368 hidp_session_put(session);
1369out_conn:
1370 l2cap_conn_put(conn);
1371 return ret;
1372}
1373
1374int hidp_connection_del(struct hidp_conndel_req *req)
1375{
1376 u32 valid_flags = BIT(HIDP_VIRTUAL_CABLE_UNPLUG);
1377 struct hidp_session *session;
1378
1379 if (req->flags & ~valid_flags)
1380 return -EINVAL;
1381
1382 session = hidp_session_find(&req->bdaddr);
1383 if (!session)
1384 return -ENOENT;
1385
1386 if (req->flags & BIT(HIDP_VIRTUAL_CABLE_UNPLUG))
1387 hidp_send_ctrl_message(session,
1388 HIDP_TRANS_HID_CONTROL |
1389 HIDP_CTRL_VIRTUAL_CABLE_UNPLUG,
1390 NULL, 0);
1391 else
1392 l2cap_unregister_user(session->conn, &session->user);
1393
1394 hidp_session_put(session);
1395
1396 return 0;
1397}
1398
1399int hidp_get_connlist(struct hidp_connlist_req *req)
1400{
1401 struct hidp_session *session;
1402 int err = 0, n = 0;
1403
1404 BT_DBG("");
1405
1406 down_read(&hidp_session_sem);
1407
1408 list_for_each_entry(session, &hidp_session_list, list) {
1409 struct hidp_conninfo ci;
1410
1411 hidp_copy_session(session, &ci);
1412
1413 if (copy_to_user(req->ci, &ci, sizeof(ci))) {
1414 err = -EFAULT;
1415 break;
1416 }
1417
1418 if (++n >= req->cnum)
1419 break;
1420
1421 req->ci++;
1422 }
1423 req->cnum = n;
1424
1425 up_read(&hidp_session_sem);
1426 return err;
1427}
1428
1429int hidp_get_conninfo(struct hidp_conninfo *ci)
1430{
1431 struct hidp_session *session;
1432
1433 session = hidp_session_find(&ci->bdaddr);
1434 if (session) {
1435 hidp_copy_session(session, ci);
1436 hidp_session_put(session);
1437 }
1438
1439 return session ? 0 : -ENOENT;
1440}
1441
1442static int __init hidp_init(void)
1443{
1444 BT_INFO("HIDP (Human Interface Emulation) ver %s", VERSION);
1445
1446 return hidp_init_sockets();
1447}
1448
1449static void __exit hidp_exit(void)
1450{
1451 hidp_cleanup_sockets();
1452}
1453
1454module_init(hidp_init);
1455module_exit(hidp_exit);
1456
1457MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
1458MODULE_AUTHOR("David Herrmann <dh.herrmann@gmail.com>");
1459MODULE_DESCRIPTION("Bluetooth HIDP ver " VERSION);
1460MODULE_VERSION(VERSION);
1461MODULE_LICENSE("GPL");
1462MODULE_ALIAS("bt-proto-6");
1463