diff options
Diffstat (limited to 'net/bluetooth/hci_core.c')
| -rw-r--r-- | net/bluetooth/hci_core.c | 44 | 
1 files changed, 33 insertions, 11 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 2f8fb33067e1..adcbc74c2432 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -2822,10 +2822,6 @@ struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev,  {  	struct hci_conn_params *params; -	/* The conn params list only contains identity addresses */ -	if (!hci_is_identity_address(addr, addr_type)) -		return NULL; -  	list_for_each_entry(params, &hdev->le_conn_params, list) {  		if (bacmp(¶ms->addr, addr) == 0 &&  		    params->addr_type == addr_type) { @@ -2842,10 +2838,6 @@ struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list,  {  	struct hci_conn_params *param; -	/* The list only contains identity addresses */ -	if (!hci_is_identity_address(addr, addr_type)) -		return NULL; -  	list_for_each_entry(param, list, action) {  		if (bacmp(¶m->addr, addr) == 0 &&  		    param->addr_type == addr_type) @@ -2856,14 +2848,35 @@ struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list,  }  /* This function requires the caller holds hdev->lock */ +struct hci_conn_params *hci_explicit_connect_lookup(struct hci_dev *hdev, +						    bdaddr_t *addr, +						    u8 addr_type) +{ +	struct hci_conn_params *param; + +	list_for_each_entry(param, &hdev->pend_le_conns, action) { +		if (bacmp(¶m->addr, addr) == 0 && +		    param->addr_type == addr_type && +		    param->explicit_connect) +			return param; +	} + +	list_for_each_entry(param, &hdev->pend_le_reports, action) { +		if (bacmp(¶m->addr, addr) == 0 && +		    param->addr_type == addr_type && +		    param->explicit_connect) +			return param; +	} + +	return NULL; +} + +/* This function requires the caller holds hdev->lock */  struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev,  					    bdaddr_t *addr, u8 addr_type)  {  	struct hci_conn_params *params; -	if (!hci_is_identity_address(addr, addr_type)) -		return NULL; -  	params = hci_conn_params_lookup(hdev, addr, addr_type);  	if (params)  		return params; @@ -2927,6 +2940,15 @@ void hci_conn_params_clear_disabled(struct hci_dev *hdev)  	list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list) {  		if (params->auto_connect != HCI_AUTO_CONN_DISABLED)  			continue; + +		/* If trying to estabilish one time connection to disabled +		 * device, leave the params, but mark them as just once. +		 */ +		if (params->explicit_connect) { +			params->auto_connect = HCI_AUTO_CONN_EXPLICIT; +			continue; +		} +  		list_del(¶ms->list);  		kfree(params);  	}  |