}
}
+static uint8_t status_mgmt2hal(uint8_t mgmt)
+{
+ switch (mgmt) {
+ case MGMT_STATUS_SUCCESS:
+ return HAL_STATUS_SUCCESS;
+ case MGMT_STATUS_NO_RESOURCES:
+ return HAL_STATUS_NOMEM;
+ case MGMT_STATUS_BUSY:
+ return HAL_STATUS_BUSY;
+ case MGMT_STATUS_NOT_SUPPORTED:
+ return HAL_STATUS_UNSUPPORTED;
+ case MGMT_STATUS_INVALID_PARAMS:
+ return HAL_STATUS_INVALID;
+ case MGMT_STATUS_AUTH_FAILED:
+ return HAL_STATUS_AUTH_FAILURE;
+ case MGMT_STATUS_NOT_CONNECTED:
+ return HAL_STATUS_REMOTE_DEVICE_DOWN;
+ default:
+ return HAL_STATUS_FAILED;
+ }
+}
+
+static void pair_device_complete(uint8_t status, uint16_t length,
+ const void *param, void *user_data)
+{
+ const struct mgmt_rp_pair_device *rp = param;
+
+ DBG("status %u", status);
+
+ /* On success bond state change will be send when new link key event
+ * is received */
+ if (status == MGMT_STATUS_SUCCESS)
+ return;
+
+ send_bond_state_change(&rp->addr.bdaddr, status_mgmt2hal(status),
+ HAL_BOND_STATE_NONE);
+}
+
+static bool create_bond(void *buf, uint16_t len)
+{
+ struct hal_cmd_create_bond *cmd = buf;
+ struct mgmt_cp_pair_device cp;
+
+ cp.io_cap = DEFAULT_IO_CAPABILITY;
+ cp.addr.type = BDADDR_BREDR;
+ android2bdaddr(cmd->bdaddr, &cp.addr.bdaddr);
+
+ if (mgmt_send(adapter->mgmt, MGMT_OP_PAIR_DEVICE, adapter->index,
+ sizeof(cp), &cp, pair_device_complete, NULL,
+ NULL) == 0)
+ return false;
+
+ send_bond_state_change(&cp.addr.bdaddr, HAL_STATUS_SUCCESS,
+ HAL_BOND_STATE_BONDING);
+
+ return true;
+}
+
void bt_adapter_handle_cmd(GIOChannel *io, uint8_t opcode, void *buf,
uint16_t len)
{
goto error;
break;
+ case HAL_OP_CREATE_BOND:
+ if (!create_bond(buf, len))
+ goto error;
+
+ break;
default:
DBG("Unhandled command, opcode 0x%x", opcode);
goto error;