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