diff options
Diffstat (limited to 'hcid/main.c')
| -rw-r--r-- | hcid/main.c | 55 | 
1 files changed, 45 insertions, 10 deletions
| diff --git a/hcid/main.c b/hcid/main.c index c73c03e0..850f1086 100644 --- a/hcid/main.c +++ b/hcid/main.c @@ -65,6 +65,7 @@ static inline void init_device_defaults(struct device_opts *device_opts)  {  	memset(device_opts, 0, sizeof(*device_opts));  	device_opts->scan = SCAN_PAGE; +	device_opts->mode = MODE_CONNECTABLE;  	device_opts->name = g_strdup("BlueZ");  	device_opts->discovto = HCID_DEFAULT_DISCOVERABLE_TIMEOUT;  } @@ -143,7 +144,7 @@ static struct device_opts *get_device_opts(int hdev)  	return device_opts;  } -uint8_t get_startup_mode(int hdev) +static struct device_opts *get_opts(int hdev)  {  	struct device_opts *device_opts = NULL;  	struct hci_dev_info di; @@ -151,7 +152,7 @@ uint8_t get_startup_mode(int hdev)  	int sock;  	if (hdev < 0) -		return SCAN_DISABLED; +		return NULL;  	sock = hci_open_dev(hdev);  	if (sock < 0) @@ -177,9 +178,27 @@ no_address:  	if (!device_opts)  		device_opts = &default_device; +	return device_opts; +} + +uint8_t get_startup_scan(int hdev) +{ +	struct device_opts *device_opts = get_opts(hdev); +	if (!device_opts) +		return SCAN_DISABLED; +  	return device_opts->scan;  } +uint8_t get_startup_mode(int hdev) +{ +	struct device_opts *device_opts = get_opts(hdev); +	if (!device_opts) +		return MODE_OFF; + +	return device_opts->mode; +} +  int get_discoverable_timeout(int hdev)  {  	struct device_opts *device_opts = NULL; @@ -326,16 +345,30 @@ static void configure_device(int dev_id)  	/* Set scan mode */  	if (read_device_mode(&di.bdaddr, mode, sizeof(mode)) == 0) { -		if (!strcmp(mode, MODE_OFF) && hcid.offmode == HCID_OFFMODE_NOSCAN) +		if (!strcmp(mode, "off") && hcid.offmode == HCID_OFFMODE_NOSCAN) { +			device_opts->mode = MODE_OFF;  			device_opts->scan = SCAN_DISABLED; -		else if (!strcmp(mode, MODE_CONNECTABLE)) +		} else if (!strcmp(mode, "connectable")) { +			device_opts->mode = MODE_CONNECTABLE;  			device_opts->scan = SCAN_PAGE; -		else if (!strcmp(mode, MODE_DISCOVERABLE)) { +		} else if (!strcmp(mode, "discoverable")) { +			/* Set discoverable only if timeout is 0 */ +			if (!get_discoverable_timeout(dev_id)) { +				device_opts->scan = SCAN_PAGE | SCAN_INQUIRY; +				device_opts->mode = MODE_DISCOVERABLE; +			} else { +				device_opts->scan = SCAN_PAGE; +				device_opts->mode = MODE_CONNECTABLE; +			} +		} else if (!strcmp(mode, "limited")) {  			/* Set discoverable only if timeout is 0 */ -			if (!get_discoverable_timeout(dev_id)) +			if (!get_discoverable_timeout(dev_id)) {  				device_opts->scan = SCAN_PAGE | SCAN_INQUIRY; -			else +				device_opts->mode = MODE_LIMITED; +			} else {  				device_opts->scan = SCAN_PAGE; +				device_opts->mode = MODE_CONNECTABLE; +			}  		}  	} @@ -431,9 +464,11 @@ static void configure_device(int dev_id)  		if (read_local_class(&di.bdaddr, cls) < 0) {  			class = htobl(device_opts->class);  			memcpy(cp.dev_class, &class, 3); -		} else +		} else { +			if (!(device_opts->scan & SCAN_INQUIRY)) +				cls[1] &= 0xdf; /* Clear discoverable bit */  			memcpy(cp.dev_class, cls, 3); - +		}  		hci_send_cmd(dd, OGF_HOST_CTL, OCF_WRITE_CLASS_OF_DEV,  					WRITE_CLASS_OF_DEV_CP_SIZE, &cp);  	} @@ -500,7 +535,7 @@ static void init_device(int dev_id)  		char mode[16];  		if (read_device_mode(&di.bdaddr, mode, sizeof(mode)) == 0 && -						strcmp(mode, MODE_OFF) == 0) { +						strcmp(mode, "off") == 0) {  			ioctl(dd, HCIDEVDOWN, dev_id);  			exit(0);  		} | 
