hciops.c revision 90608519f3701763ca00b27d6ae133d6bbb07bad
1/*
2 *
3 *  BlueZ - Bluetooth protocol stack for Linux
4 *
5 *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
6 *
7 *  This program is free software; you can redistribute it and/or modify
8 *  it under the terms of the GNU General Public License as published by
9 *  the Free Software Foundation; either version 2 of the License, or
10 *  (at your option) any later version.
11 *
12 *  This program is distributed in the hope that it will be useful,
13 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *  GNU General Public License for more details.
16 *
17 *  You should have received a copy of the GNU General Public License
18 *  along with this program; if not, write to the Free Software
19 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 *
21 */
22
23#ifdef HAVE_CONFIG_H
24#include <config.h>
25#endif
26
27#include <stdio.h>
28#include <errno.h>
29#include <unistd.h>
30#include <stdlib.h>
31#include <sys/types.h>
32#include <sys/ioctl.h>
33#include <sys/wait.h>
34
35#include <bluetooth/bluetooth.h>
36#include <bluetooth/hci.h>
37#include <bluetooth/hci_lib.h>
38
39#include <glib.h>
40
41#include "hcid.h"
42#include "sdpd.h"
43#include "adapter.h"
44#include "plugin.h"
45#include "log.h"
46#include "manager.h"
47
48static int child_pipe[2] = { -1, -1 };
49
50static guint child_io_id = 0;
51static guint ctl_io_id = 0;
52
53static gboolean child_exit(GIOChannel *io, GIOCondition cond, void *user_data)
54{
55	int status, fd = g_io_channel_unix_get_fd(io);
56	pid_t child_pid;
57
58	if (read(fd, &child_pid, sizeof(child_pid)) != sizeof(child_pid)) {
59		error("child_exit: unable to read child pid from pipe");
60		return TRUE;
61	}
62
63	if (waitpid(child_pid, &status, 0) != child_pid)
64		error("waitpid(%d) failed", child_pid);
65	else
66		DBG("child %d exited", child_pid);
67
68	return TRUE;
69}
70
71static void at_child_exit(void)
72{
73	pid_t pid = getpid();
74
75	if (write(child_pipe[1], &pid, sizeof(pid)) != sizeof(pid))
76		error("unable to write to child pipe");
77}
78
79static void configure_device(int index)
80{
81	struct hci_dev_info di;
82	uint16_t policy;
83	int dd, err;
84
85	if (hci_devinfo(index, &di) < 0)
86		return;
87
88	if (hci_test_bit(HCI_RAW, &di.flags))
89		return;
90
91	dd = hci_open_dev(index);
92	if (dd < 0) {
93		err = errno;
94		error("Can't open device hci%d: %s (%d)",
95						index, strerror(err), err);
96		return;
97	}
98
99	/* Set page timeout */
100	if ((main_opts.flags & (1 << HCID_SET_PAGETO))) {
101		write_page_timeout_cp cp;
102
103		cp.timeout = htobs(main_opts.pageto);
104		hci_send_cmd(dd, OGF_HOST_CTL, OCF_WRITE_PAGE_TIMEOUT,
105					WRITE_PAGE_TIMEOUT_CP_SIZE, &cp);
106	}
107
108	/* Set default link policy */
109	policy = htobs(main_opts.link_policy);
110	hci_send_cmd(dd, OGF_LINK_POLICY,
111				OCF_WRITE_DEFAULT_LINK_POLICY, 2, &policy);
112
113	hci_close_dev(dd);
114}
115
116static void init_device(int index)
117{
118	struct hci_dev_req dr;
119	struct hci_dev_info di;
120	pid_t pid;
121	int dd, err;
122
123	/* Do initialization in the separate process */
124	pid = fork();
125	switch (pid) {
126		case 0:
127			atexit(at_child_exit);
128			break;
129		case -1:
130			err = errno;
131			error("Fork failed. Can't init device hci%d: %s (%d)",
132					index, strerror(err), err);
133		default:
134			DBG("child %d forked", pid);
135			return;
136	}
137
138	dd = hci_open_dev(index);
139	if (dd < 0) {
140		err = errno;
141		error("Can't open device hci%d: %s (%d)",
142					index, strerror(err), err);
143		exit(1);
144	}
145
146	memset(&dr, 0, sizeof(dr));
147	dr.dev_id = index;
148
149	/* Set link mode */
150	dr.dev_opt = main_opts.link_mode;
151	if (ioctl(dd, HCISETLINKMODE, (unsigned long) &dr) < 0) {
152		err = errno;
153		error("Can't set link mode on hci%d: %s (%d)",
154					index, strerror(err), err);
155	}
156
157	/* Set link policy */
158	dr.dev_opt = main_opts.link_policy;
159	if (ioctl(dd, HCISETLINKPOL, (unsigned long) &dr) < 0 &&
160							errno != ENETDOWN) {
161		error("Can't set link policy on hci%d: %s (%d)",
162					index, strerror(errno), errno);
163	}
164
165	/* Start HCI device */
166	if (ioctl(dd, HCIDEVUP, index) < 0 && errno != EALREADY) {
167		error("Can't init device hci%d: %s (%d)",
168					index, strerror(errno), errno);
169		goto fail;
170	}
171
172	if (hci_devinfo(index, &di) < 0)
173		goto fail;
174
175	if (hci_test_bit(HCI_RAW, &di.flags))
176		goto done;
177
178done:
179	hci_close_dev(dd);
180	exit(0);
181
182fail:
183	hci_close_dev(dd);
184	exit(1);
185}
186
187static void device_devreg_setup(int index)
188{
189	struct hci_dev_info di;
190	gboolean devup;
191
192	init_device(index);
193
194	memset(&di, 0, sizeof(di));
195
196	if (hci_devinfo(index, &di) < 0)
197		return;
198
199	devup = hci_test_bit(HCI_UP, &di.flags);
200
201	if (!hci_test_bit(HCI_RAW, &di.flags))
202		manager_register_adapter(index, devup);
203}
204
205static void device_devup_setup(int index)
206{
207	configure_device(index);
208
209	start_security_manager(index);
210
211	/* Return value 1 means ioctl(DEVDOWN) was performed */
212	if (manager_start_adapter(index) == 1)
213		stop_security_manager(index);
214}
215
216static void device_event(int event, int index)
217{
218	switch (event) {
219	case HCI_DEV_REG:
220		info("HCI dev %d registered", index);
221		device_devreg_setup(index);
222		break;
223
224	case HCI_DEV_UNREG:
225		info("HCI dev %d unregistered", index);
226		manager_unregister_adapter(index);
227		break;
228
229	case HCI_DEV_UP:
230		info("HCI dev %d up", index);
231		device_devup_setup(index);
232		break;
233
234	case HCI_DEV_DOWN:
235		info("HCI dev %d down", index);
236		manager_stop_adapter(index);
237		stop_security_manager(index);
238		break;
239	}
240}
241
242static int init_known_adapters(int ctl)
243{
244	struct hci_dev_list_req *dl;
245	struct hci_dev_req *dr;
246	int i, err;
247
248	dl = g_try_malloc0(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t));
249	if (!dl) {
250		err = errno;
251		error("Can't allocate devlist buffer: %s (%d)",
252							strerror(err), err);
253		return -err;
254	}
255
256	dl->dev_num = HCI_MAX_DEV;
257	dr = dl->dev_req;
258
259	if (ioctl(ctl, HCIGETDEVLIST, (void *) dl) < 0) {
260		err = errno;
261		error("Can't get device list: %s (%d)",
262							strerror(err), err);
263		g_free(dl);
264		return -err;
265	}
266
267	for (i = 0; i < dl->dev_num; i++, dr++) {
268		device_event(HCI_DEV_REG, dr->dev_id);
269
270		if (hci_test_bit(HCI_UP, &dr->dev_opt))
271			device_event(HCI_DEV_UP, dr->dev_id);
272	}
273
274	g_free(dl);
275	return 0;
276}
277
278static gboolean io_stack_event(GIOChannel *chan, GIOCondition cond,
279								gpointer data)
280{
281	unsigned char buf[HCI_MAX_FRAME_SIZE], *ptr;
282	evt_stack_internal *si;
283	evt_si_device *sd;
284	hci_event_hdr *eh;
285	int type;
286	size_t len;
287	GIOError err;
288
289	ptr = buf;
290
291	err = g_io_channel_read(chan, (gchar *) buf, sizeof(buf), &len);
292	if (err) {
293		if (err == G_IO_ERROR_AGAIN)
294			return TRUE;
295
296		error("Read from control socket failed: %s (%d)",
297							strerror(errno), errno);
298		return FALSE;
299	}
300
301	type = *ptr++;
302
303	if (type != HCI_EVENT_PKT)
304		return TRUE;
305
306	eh = (hci_event_hdr *) ptr;
307	if (eh->evt != EVT_STACK_INTERNAL)
308		return TRUE;
309
310	ptr += HCI_EVENT_HDR_SIZE;
311
312	si = (evt_stack_internal *) ptr;
313	switch (si->type) {
314	case EVT_SI_DEVICE:
315		sd = (void *) &si->data;
316		device_event(sd->event, sd->dev_id);
317		break;
318	}
319
320	return TRUE;
321}
322
323static int hciops_setup(void)
324{
325	struct sockaddr_hci addr;
326	struct hci_filter flt;
327	GIOChannel *ctl_io, *child_io;
328	int sock, err;
329
330	if (child_pipe[0] != -1)
331		return -EALREADY;
332
333	if (pipe(child_pipe) < 0) {
334		err = errno;
335		error("pipe(): %s (%d)", strerror(err), err);
336		return -err;
337	}
338
339	child_io = g_io_channel_unix_new(child_pipe[0]);
340	g_io_channel_set_close_on_unref(child_io, TRUE);
341	child_io_id = g_io_add_watch(child_io,
342				G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
343				child_exit, NULL);
344	g_io_channel_unref(child_io);
345
346	/* Create and bind HCI socket */
347	sock = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
348	if (sock < 0) {
349		err = errno;
350		error("Can't open HCI socket: %s (%d)", strerror(err),
351								err);
352		return -err;
353	}
354
355	/* Set filter */
356	hci_filter_clear(&flt);
357	hci_filter_set_ptype(HCI_EVENT_PKT, &flt);
358	hci_filter_set_event(EVT_STACK_INTERNAL, &flt);
359	if (setsockopt(sock, SOL_HCI, HCI_FILTER, &flt,
360							sizeof(flt)) < 0) {
361		err = errno;
362		error("Can't set filter: %s (%d)", strerror(err), err);
363		return -err;
364	}
365
366	memset(&addr, 0, sizeof(addr));
367	addr.hci_family = AF_BLUETOOTH;
368	addr.hci_dev = HCI_DEV_NONE;
369	if (bind(sock, (struct sockaddr *) &addr,
370							sizeof(addr)) < 0) {
371		err = errno;
372		error("Can't bind HCI socket: %s (%d)",
373							strerror(err), err);
374		return -err;
375	}
376
377	ctl_io = g_io_channel_unix_new(sock);
378	g_io_channel_set_close_on_unref(ctl_io, TRUE);
379
380	ctl_io_id = g_io_add_watch(ctl_io, G_IO_IN, io_stack_event, NULL);
381
382	g_io_channel_unref(ctl_io);
383
384	/* Initialize already connected devices */
385	return init_known_adapters(sock);
386}
387
388static void hciops_cleanup(void)
389{
390	if (child_io_id) {
391		g_source_remove(child_io_id);
392		child_io_id = 0;
393	}
394
395	if (ctl_io_id) {
396		g_source_remove(ctl_io_id);
397		ctl_io_id = 0;
398	}
399
400	if (child_pipe[0] >= 0) {
401		close(child_pipe[0]);
402		child_pipe[0] = -1;
403	}
404
405	if (child_pipe[1] >= 0) {
406		close(child_pipe[1]);
407		child_pipe[1] = -1;
408	}
409}
410
411static int hciops_start(int index)
412{
413	int dd;
414	int err = 0;
415
416	dd = hci_open_dev(index);
417	if (dd < 0)
418		return -EIO;
419
420	if (ioctl(dd, HCIDEVUP, index) == 0)
421		goto done; /* on success */
422
423	if (errno != EALREADY) {
424		err = errno;
425		error("Can't init device hci%d: %s (%d)",
426				index, strerror(err), err);
427	}
428
429done:
430	hci_close_dev(dd);
431	return -err;
432}
433
434static int hciops_stop(int index)
435{
436	int dd;
437	int err = 0;
438
439	dd = hci_open_dev(index);
440	if (dd < 0)
441		return -EIO;
442
443	if (ioctl(dd, HCIDEVDOWN, index) == 0)
444		goto done; /* on success */
445
446	if (errno != EALREADY) {
447		err = errno;
448		error("Can't stop device hci%d: %s (%d)",
449				index, strerror(err), err);
450	}
451
452done:
453	hci_close_dev(dd);
454	return -err;
455}
456
457static int hciops_powered(int index, gboolean powered)
458{
459	int dd, err;
460	uint8_t mode = SCAN_DISABLED;
461
462	if (powered)
463		return hciops_start(index);
464
465	dd = hci_open_dev(index);
466	if (dd < 0)
467		return -EIO;
468
469	err = hci_send_cmd(dd, OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE,
470					1, &mode);
471	if (err < 0) {
472		err = -errno;
473		hci_close_dev(dd);
474		return err;
475	}
476
477	hci_close_dev(dd);
478
479	return hciops_stop(index);
480}
481
482static int hciops_connectable(int index)
483{
484	int dd, err;
485	uint8_t mode = SCAN_PAGE;
486
487	dd = hci_open_dev(index);
488	if (dd < 0)
489		return -EIO;
490
491	err = hci_send_cmd(dd, OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE,
492					1, &mode);
493	if (err < 0)
494		err = -errno;
495
496	hci_close_dev(dd);
497
498	return err;
499}
500
501static int hciops_discoverable(int index)
502{
503	int dd, err;
504	uint8_t mode = (SCAN_PAGE | SCAN_INQUIRY);
505
506	dd = hci_open_dev(index);
507	if (dd < 0)
508		return -EIO;
509
510	err = hci_send_cmd(dd, OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE,
511					1, &mode);
512	if (err < 0)
513		err = -errno;
514
515	hci_close_dev(dd);
516
517	return err;
518}
519
520static int hciops_set_class(int index, uint32_t class)
521{
522	int dd, err;
523	write_class_of_dev_cp cp;
524
525	dd = hci_open_dev(index);
526	if (dd < 0)
527		return -EIO;
528
529	memcpy(cp.dev_class, &class, 3);
530
531	err = hci_send_cmd(dd, OGF_HOST_CTL, OCF_WRITE_CLASS_OF_DEV,
532					WRITE_CLASS_OF_DEV_CP_SIZE, &cp);
533
534	if (err < 0)
535		err = -errno;
536
537	hci_close_dev(dd);
538
539	return err;
540}
541
542static int hciops_set_limited_discoverable(int index, uint32_t class,
543							gboolean limited)
544{
545	int dd, err;
546	int num = (limited ? 2 : 1);
547	uint8_t lap[] = { 0x33, 0x8b, 0x9e, 0x00, 0x8b, 0x9e };
548	write_current_iac_lap_cp cp;
549
550	/*
551	 * 1: giac
552	 * 2: giac + liac
553	 */
554	dd = hci_open_dev(index);
555	if (dd < 0)
556		return -EIO;
557
558	memset(&cp, 0, sizeof(cp));
559	cp.num_current_iac = num;
560	memcpy(&cp.lap, lap, num * 3);
561
562	err = hci_send_cmd(dd, OGF_HOST_CTL, OCF_WRITE_CURRENT_IAC_LAP,
563			(num * 3 + 1), &cp);
564	if (err < 0) {
565		err = -errno;
566		hci_close_dev(dd);
567		return err;
568	}
569
570	hci_close_dev(dd);
571
572	return hciops_set_class(index, class);
573}
574
575static int hciops_start_discovery(int index, gboolean periodic)
576{
577	uint8_t lap[3] = { 0x33, 0x8b, 0x9e };
578	int dd, err;
579
580	dd = hci_open_dev(index);
581	if (dd < 0)
582		return -EIO;
583
584	if (periodic) {
585		periodic_inquiry_cp cp;
586
587		memset(&cp, 0, sizeof(cp));
588		memcpy(&cp.lap, lap, 3);
589		cp.max_period = htobs(24);
590		cp.min_period = htobs(16);
591		cp.length  = 0x08;
592		cp.num_rsp = 0x00;
593
594		err = hci_send_cmd(dd, OGF_LINK_CTL, OCF_PERIODIC_INQUIRY,
595					PERIODIC_INQUIRY_CP_SIZE, &cp);
596	} else {
597		inquiry_cp inq_cp;
598
599		memset(&inq_cp, 0, sizeof(inq_cp));
600		memcpy(&inq_cp.lap, lap, 3);
601		inq_cp.length = 0x08;
602		inq_cp.num_rsp = 0x00;
603
604		err = hci_send_cmd(dd, OGF_LINK_CTL, OCF_INQUIRY,
605					INQUIRY_CP_SIZE, &inq_cp);
606	}
607
608	if (err < 0)
609		err = -errno;
610
611	hci_close_dev(dd);
612
613	return err;
614}
615
616static int hciops_stop_discovery(int index)
617{
618	struct hci_dev_info di;
619	int dd, err;
620
621	if (hci_devinfo(index, &di) < 0)
622		return -errno;
623
624	dd = hci_open_dev(index);
625	if (dd < 0)
626		return -EIO;
627
628	if (hci_test_bit(HCI_INQUIRY, &di.flags))
629		err = hci_send_cmd(dd, OGF_LINK_CTL, OCF_INQUIRY_CANCEL,
630				0, 0);
631	else
632		err = hci_send_cmd(dd, OGF_LINK_CTL, OCF_EXIT_PERIODIC_INQUIRY,
633				0, 0);
634	if (err < 0)
635		err = -errno;
636
637	hci_close_dev(dd);
638
639	return err;
640}
641
642static int hciops_resolve_name(int index, bdaddr_t *bdaddr)
643{
644	remote_name_req_cp cp;
645	int dd, err;
646
647	dd = hci_open_dev(index);
648	if (dd < 0)
649		return -EIO;
650
651	memset(&cp, 0, sizeof(cp));
652	bacpy(&cp.bdaddr, bdaddr);
653	cp.pscan_rep_mode = 0x02;
654
655	err = hci_send_cmd(dd, OGF_LINK_CTL, OCF_REMOTE_NAME_REQ,
656					REMOTE_NAME_REQ_CP_SIZE, &cp);
657	if (err < 0)
658		err = -errno;
659
660	hci_close_dev(dd);
661
662	return err;
663}
664
665static int hciops_set_name(int index, const char *name)
666{
667	change_local_name_cp cp;
668	int dd, err;
669
670	dd = hci_open_dev(index);
671	if (dd < 0)
672		return -EIO;
673
674	memset(&cp, 0, sizeof(cp));
675	strncpy((char *) cp.name, name, sizeof(cp.name));
676
677	err = hci_send_cmd(dd, OGF_HOST_CTL, OCF_CHANGE_LOCAL_NAME,
678					CHANGE_LOCAL_NAME_CP_SIZE, &cp);
679	if (err < 0)
680		err = -errno;
681
682	hci_close_dev(dd);
683
684	return err;
685}
686
687static int hciops_read_name(int index)
688{
689	int dd, err;
690
691	dd = hci_open_dev(index);
692	if (dd < 0)
693		return -EIO;
694
695	err = hci_send_cmd(dd, OGF_HOST_CTL, OCF_READ_LOCAL_NAME, 0, 0);
696	if (err < 0)
697		err = -errno;
698
699	hci_close_dev(dd);
700
701	return err;
702}
703
704static int hciops_cancel_resolve_name(int index, bdaddr_t *bdaddr)
705{
706	remote_name_req_cancel_cp cp;
707	int dd, err;
708
709	dd = hci_open_dev(index);
710	if (dd < 0)
711		return -EIO;
712
713	memset(&cp, 0, sizeof(cp));
714	bacpy(&cp.bdaddr, bdaddr);
715
716	err = hci_send_cmd(dd, OGF_LINK_CTL, OCF_REMOTE_NAME_REQ_CANCEL,
717					REMOTE_NAME_REQ_CANCEL_CP_SIZE, &cp);
718	if (err < 0)
719		err = -errno;
720
721	hci_close_dev(dd);
722
723	return err;
724}
725
726static struct btd_adapter_ops hci_ops = {
727	.setup = hciops_setup,
728	.cleanup = hciops_cleanup,
729	.start = hciops_start,
730	.stop = hciops_stop,
731	.set_powered = hciops_powered,
732	.set_connectable = hciops_connectable,
733	.set_discoverable = hciops_discoverable,
734	.set_limited_discoverable = hciops_set_limited_discoverable,
735	.start_discovery = hciops_start_discovery,
736	.stop_discovery = hciops_stop_discovery,
737	.resolve_name = hciops_resolve_name,
738	.cancel_resolve_name = hciops_cancel_resolve_name,
739	.set_name = hciops_set_name,
740	.read_name = hciops_read_name,
741	.set_class = hciops_set_class,
742};
743
744static int hciops_init(void)
745{
746	return btd_register_adapter_ops(&hci_ops);
747}
748static void hciops_exit(void)
749{
750	btd_adapter_cleanup_ops(&hci_ops);
751}
752
753BLUETOOTH_PLUGIN_DEFINE(hciops, VERSION,
754		BLUETOOTH_PLUGIN_PRIORITY_LOW, hciops_init, hciops_exit)
755