diff options
| -rw-r--r-- | hcid/dbus-security.c | 8 | ||||
| -rw-r--r-- | hcid/dbus.c | 18 | ||||
| -rw-r--r-- | hcid/dbus.h | 2 | ||||
| -rw-r--r-- | hcid/hcid.h | 1 | ||||
| -rw-r--r-- | hcid/security.c | 11 | 
5 files changed, 37 insertions, 3 deletions
| diff --git a/hcid/dbus-security.c b/hcid/dbus-security.c index a4ca0dbd..57891afe 100644 --- a/hcid/dbus-security.c +++ b/hcid/dbus-security.c @@ -617,6 +617,14 @@ done:  	return call_passkey_agent(conn, agent, dev, path, sba, dba);  } +int handle_confirm_request(DBusConnection *conn, int dev, const char *path, +				bdaddr_t *sba, bdaddr_t *dba, const char *pin) +{ +	hci_send_cmd(dev, OGF_LINK_CTL, OCF_PIN_CODE_NEG_REPLY, 6, dba); + +	return -1; +} +  static void send_cancel_request(struct pending_agent_request *req)  {  	DBusMessage *message; diff --git a/hcid/dbus.c b/hcid/dbus.c index d650ea5f..35855b0e 100644 --- a/hcid/dbus.c +++ b/hcid/dbus.c @@ -855,6 +855,24 @@ int hcid_dbus_request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci)  	return handle_passkey_request(connection, dev, path, sba, &ci->bdaddr);  } +int hcid_dbus_confirm_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci, char *pin) +{ +	char path[MAX_PATH_LENGTH], addr[18]; +	int id; + +	ba2str(sba, addr); + +	id = hci_devid(addr); +	if (id < 0) { +		error("No matching device id for %s", addr); +		return -1; +	} + +	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); + +	return handle_confirm_request(connection, dev, path, sba, &ci->bdaddr, pin); +} +  void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer,  					uint8_t status)  { diff --git a/hcid/dbus.h b/hcid/dbus.h index 81f37a76..56a0b686 100644 --- a/hcid/dbus.h +++ b/hcid/dbus.h @@ -240,6 +240,8 @@ int pending_remote_name_cancel(struct adapter *adapter);  int handle_passkey_request(DBusConnection *conn, int dev, const char *path,  				bdaddr_t *sba, bdaddr_t *dba); +int handle_confirm_request(DBusConnection *conn, int dev, const char *path, +				bdaddr_t *sba, bdaddr_t *dba, const char *pin);  void release_default_agent(void);  void release_passkey_agents(struct adapter *adapter, bdaddr_t *bda);  void cancel_passkey_agent_requests(struct slist *agents, const char *path, bdaddr_t *dba); diff --git a/hcid/hcid.h b/hcid/hcid.h index 2a4d221b..c109f7a2 100644 --- a/hcid/hcid.h +++ b/hcid/hcid.h @@ -149,6 +149,7 @@ int hcid_dbus_start_device(uint16_t id);  int hcid_dbus_stop_device(uint16_t id);  void hcid_dbus_pending_pin_req_add(bdaddr_t *sba, bdaddr_t *dba);  int hcid_dbus_request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci); +int hcid_dbus_confirm_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci, char *pin);  void hcid_dbus_inquiry_start(bdaddr_t *local);  void hcid_dbus_inquiry_complete(bdaddr_t *local); diff --git a/hcid/security.c b/hcid/security.c index c82fbc00..7d2ff9c1 100644 --- a/hcid/security.c +++ b/hcid/security.c @@ -390,13 +390,18 @@ static void pin_code_request(int dev, bdaddr_t *sba, bdaddr_t *dba)  				hci_send_cmd(dev, OGF_LINK_CTL, OCF_PIN_CODE_REPLY,  					PIN_CODE_REPLY_CP_SIZE, &pr);  			} else { -				/* Let PIN helper handle that */  +				/* Request PIN from passkey agent */  				hcid_dbus_request_pin(dev, sba, ci);  			}  		}  	} else { -		/* Let PIN helper handle that */  -		hcid_dbus_request_pin(dev, sba, ci); +		if (pinlen > 0) { +			/* Confirm PIN by passkey agent */ +			hcid_dbus_confirm_pin(dev, sba, ci, pin); +		} else { +			/* Request PIN from passkey agent */  +			hcid_dbus_request_pin(dev, sba, ci); +		}  	}  	hcid_dbus_pending_pin_req_add(sba, &ci->bdaddr); | 
