Home | History | Annotate | Download | only in tools
      1 /*
      2  *
      3  *  BlueZ - Bluetooth protocol stack for Linux
      4  *
      5  *  Copyright (C) 2002-2010  Marcel Holtmann <marcel (at) holtmann.org>
      6  *
      7  *
      8  *  This program is free software; you can redistribute it and/or modify
      9  *  it under the terms of the GNU General Public License as published by
     10  *  the Free Software Foundation; either version 2 of the License, or
     11  *  (at your option) any later version.
     12  *
     13  *  This program is distributed in the hope that it will be useful,
     14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16  *  GNU General Public License for more details.
     17  *
     18  *  You should have received a copy of the GNU General Public License
     19  *  along with this program; if not, write to the Free Software
     20  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     21  *
     22  */
     23 
     24 #ifdef HAVE_CONFIG_H
     25 #include <config.h>
     26 #endif
     27 
     28 #include <stdio.h>
     29 #include <errno.h>
     30 #include <stdlib.h>
     31 #include <getopt.h>
     32 #include <sys/socket.h>
     33 
     34 #include <bluetooth/bluetooth.h>
     35 #include <bluetooth/hci.h>
     36 #include <bluetooth/hci_lib.h>
     37 
     38 static struct option main_options[] = {
     39 	{ "device",	1, 0, 'i' },
     40 	{ 0, 0, 0, 0 }
     41 };
     42 
     43 int main(int argc, char *argv[])
     44 {
     45 	uint8_t events[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00 };
     46 	struct hci_dev_info di;
     47 	struct hci_version ver;
     48 	int dd, opt, dev = 0;
     49 
     50 	while ((opt=getopt_long(argc, argv, "+i:", main_options, NULL)) != -1) {
     51 		switch (opt) {
     52 		case 'i':
     53 			dev = hci_devid(optarg);
     54 			if (dev < 0) {
     55 				perror("Invalid device");
     56 				exit(1);
     57 			}
     58 			break;
     59 		}
     60 	}
     61 
     62 	dd = hci_open_dev(dev);
     63 	if (dd < 0) {
     64 		fprintf(stderr, "Can't open device hci%d: %s (%d)\n",
     65 						dev, strerror(errno), errno);
     66 		exit(1);
     67 	}
     68 
     69 	if (hci_devinfo(dev, &di) < 0) {
     70 		fprintf(stderr, "Can't get device info for hci%d: %s (%d)\n",
     71 						dev, strerror(errno), errno);
     72 		hci_close_dev(dd);
     73 		exit(1);
     74 	}
     75 
     76 	if (hci_read_local_version(dd, &ver, 1000) < 0) {
     77 		fprintf(stderr, "Can't read version info for hci%d: %s (%d)\n",
     78 						dev, strerror(errno), errno);
     79 		hci_close_dev(dd);
     80 		exit(1);
     81 	}
     82 
     83 	hci_close_dev(dd);
     84 
     85 	if (ver.hci_ver > 1) {
     86 		if (di.features[5] & LMP_SNIFF_SUBR)
     87 			events[5] |= 0x20;
     88 
     89 		if (di.features[5] & LMP_PAUSE_ENC)
     90 			events[5] |= 0x80;
     91 
     92 		if (di.features[6] & LMP_EXT_INQ)
     93 			events[5] |= 0x40;
     94 
     95 		if (di.features[6] & LMP_NFLUSH_PKTS)
     96 			events[7] |= 0x01;
     97 
     98 		if (di.features[7] & LMP_LSTO)
     99 			events[6] |= 0x80;
    100 
    101 		if (di.features[6] & LMP_SIMPLE_PAIR) {
    102 			events[6] |= 0x01;	/* IO Capability Request */
    103 			events[6] |= 0x02;	/* IO Capability Response */
    104 			events[6] |= 0x04;	/* User Confirmation Request */
    105 			events[6] |= 0x08;	/* User Passkey Request */
    106 			events[6] |= 0x10;	/* Remote OOB Data Request */
    107 			events[6] |= 0x20;	/* Simple Pairing Complete */
    108 			events[7] |= 0x04;	/* User Passkey Notification */
    109 			events[7] |= 0x08;	/* Keypress Notification */
    110 			events[7] |= 0x10;	/* Remote Host Supported
    111 						 * Features Notification */
    112 		}
    113 
    114 		if (di.features[4] & LMP_LE)
    115 			events[7] |= 0x20;
    116 
    117 		if (di.features[6] & LMP_LE_BREDR)
    118 			events[7] |= 0x20;
    119 	}
    120 
    121 	printf("Setting event mask:\n");
    122 	printf("\thcitool cmd 0x%02x 0x%04x  "
    123 					"0x%02x 0x%02x 0x%02x 0x%02x "
    124 					"0x%02x 0x%02x 0x%02x 0x%02x\n",
    125 				OGF_HOST_CTL, OCF_SET_EVENT_MASK,
    126 				events[0], events[1], events[2], events[3],
    127 				events[4], events[5], events[6], events[7]);
    128 
    129 	return 0;
    130 }
    131