diff options
| author | Johan Hedberg <johan.hedberg@nokia.com> | 2009-02-03 12:15:07 -0800 | 
|---|---|---|
| committer | Johan Hedberg <johan.hedberg@nokia.com> | 2009-02-03 12:19:00 -0800 | 
| commit | e35dd0c0246236371269b79cc28b1a23f4999560 (patch) | |
| tree | 59d611de1106fc3db522ac998e73234035a2c855 | |
| parent | f7d1ee361e410e096929bd3918178af356c50bbd (diff) | |
Add support for HCI_Simple_Pairing_Complete event
When we are the acceptors of a pairing request and we have used the
Agent.DisplayPasskey we need to use the Simple Pairing Complete HCI
event for calling Agent.Cancel.
| -rw-r--r-- | src/dbus-hci.c | 25 | ||||
| -rw-r--r-- | src/dbus-hci.h | 1 | ||||
| -rw-r--r-- | src/device.c | 15 | ||||
| -rw-r--r-- | src/device.h | 1 | ||||
| -rw-r--r-- | src/security.c | 11 | 
5 files changed, 53 insertions, 0 deletions
| diff --git a/src/dbus-hci.c b/src/dbus-hci.c index 8059478d..7950ce79 100644 --- a/src/dbus-hci.c +++ b/src/dbus-hci.c @@ -445,6 +445,31 @@ void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer,  	device_bonding_complete(device, status);  } +void hcid_dbus_simple_pairing_complete(bdaddr_t *local, bdaddr_t *peer, +					uint8_t status) +{ +	struct btd_adapter *adapter; char peer_addr[18]; +	struct btd_device *device; + +	debug("hcid_dbus_simple_pairing_complete: status=%02x", status); + +	adapter = manager_find_adapter(local); +	if (!adapter) { +		error("Unable to find matching adapter"); +		return; +	} + +	ba2str(peer, peer_addr); + +	device = adapter_find_device(adapter, peer_addr); +	if (!device) { +		error("Unable to get device object!"); +		return; +	} + +	device_simple_pairing_complete(device, status); +} +  void hcid_dbus_inquiry_start(bdaddr_t *local)  {  	struct btd_adapter *adapter; diff --git a/src/dbus-hci.h b/src/dbus-hci.h index 7481522e..b930e893 100644 --- a/src/dbus-hci.h +++ b/src/dbus-hci.h @@ -34,6 +34,7 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status, char  void hcid_dbus_conn_complete(bdaddr_t *local, uint8_t status, uint16_t handle, bdaddr_t *peer);  void hcid_dbus_disconn_complete(bdaddr_t *local, uint8_t status, uint16_t handle, uint8_t reason);  void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer, uint8_t status); +void hcid_dbus_simple_pairing_complete(bdaddr_t *local, bdaddr_t *peer, uint8_t status);  void hcid_dbus_setname_complete(bdaddr_t *local);  void hcid_dbus_setscan_enable_complete(bdaddr_t *local);  void hcid_dbus_write_class_complete(bdaddr_t *local); diff --git a/src/device.c b/src/device.c index 926d9591..df68639d 100644 --- a/src/device.c +++ b/src/device.c @@ -1816,9 +1816,24 @@ DBusMessage *device_create_bonding(struct btd_device *device,  	return NULL;  } +void device_simple_pairing_complete(struct btd_device *device, uint8_t status) +{ +	struct authentication_req *auth = device->authr; + +	if (auth && auth->type == AUTH_TYPE_NOTIFY && auth->agent) +		agent_cancel(auth->agent); + +	g_free(auth); +	device->authr = NULL; +} +  void device_bonding_complete(struct btd_device *device, uint8_t status)  {  	struct bonding_req *bonding = device->bonding; +	struct authentication_req *auth = device->authr; + +	if (auth && auth->type == AUTH_TYPE_NOTIFY && auth->agent) +		agent_cancel(auth->agent);  	if (status)  		goto failed; diff --git a/src/device.h b/src/device.h index 6b750a82..19112d20 100644 --- a/src/device.h +++ b/src/device.h @@ -64,6 +64,7 @@ DBusMessage *device_create_bonding(struct btd_device *device,  				const char *agent_path, uint8_t capability);  void device_remove_bondind(struct btd_device *device, DBusConnection *connection);  void device_bonding_complete(struct btd_device *device, uint8_t status); +void device_simple_pairing_complete(struct btd_device *device, uint8_t status);  gboolean device_is_bonding(struct btd_device *device, const char *sender);  void device_cancel_bonding(struct btd_device *device, uint8_t status);  int device_request_authentication(struct btd_device *device, auth_type_t type, diff --git a/src/security.c b/src/security.c index 1ab952ae..1a33a9d2 100644 --- a/src/security.c +++ b/src/security.c @@ -784,6 +784,13 @@ static inline void auth_complete(int dev, bdaddr_t *sba, void *ptr)  	hcid_dbus_bonding_process_complete(sba, &dba, evt->status);  } +static inline void simple_pairing_complete(int dev, bdaddr_t *sba, void *ptr) +{ +	evt_simple_pairing_complete *evt = ptr; + +	hcid_dbus_simple_pairing_complete(sba, &evt->bdaddr, evt->status); +} +  static inline void conn_request(int dev, bdaddr_t *sba, void *ptr)  {  	evt_conn_request *evt = ptr; @@ -894,6 +901,10 @@ static gboolean io_security_event(GIOChannel *chan, GIOCondition cond, gpointer  		auth_complete(dev, &di->bdaddr, ptr);  		break; +	case EVT_SIMPLE_PAIRING_COMPLETE: +		simple_pairing_complete(dev, &di->bdaddr, ptr); +		break; +  	case EVT_CONN_REQUEST:  		conn_request(dev, &di->bdaddr, ptr);  		break; | 
