static int create_bond(const bt_bdaddr_t *bd_addr, int transport)
{
DBG("+");
- return _bt_hal_device_create_bond(bd_addr);
+ return _bt_hal_device_create_bond(bd_addr, transport);
}
static int cancel_bond(const bt_bdaddr_t *bd_addr)
static void __bt_hal_unbond_device_cb(GDBusProxy *proxy, GAsyncResult *res,
gpointer user_data);
-int _bt_hal_device_create_bond(const bt_bdaddr_t *bd_addr)
+int _bt_hal_device_create_bond(const bt_bdaddr_t *bd_addr, unsigned short transport)
{
GDBusProxy *proxy;
char address[BT_HAL_ADDRESS_STRING_SIZE] = { 0 };
- int transport = 0;
GDBusConnection *conn;
char *device_path = NULL;
memset(&ev, 0, sizeof(ev));
DBG("+");
- DBG("Transport [%d] Add[0x%x] [0x%x][0x%x][0x%x][0x%x][0x%x]",
+ DBG("Transport [0x%x] Add[0x%x] [0x%x][0x%x][0x%x][0x%x][0x%x]",
transport, bd_addr->address[0], bd_addr->address[1],
bd_addr->address[2], bd_addr->address[3],
bd_addr->address[4], bd_addr->address[5]);
extern "C" {
#endif
-int _bt_hal_device_create_bond(const bt_bdaddr_t *bd_addr);
+int _bt_hal_device_create_bond(const bt_bdaddr_t *bd_addr, unsigned short transport);
int _bt_hal_device_remove_bond(const bt_bdaddr_t *bd_addr);
#endif
/**
+ * @brief Connection type
+ *
+ * @see device_create_bond
+ */
+
+typedef enum {
+ CONN_TYPE_DEFAULT = 0xFF, /* represents that connection type can both BR/EDR and LE */
+ CONN_TYPE_BREDR = 0x00,
+ CONN_TYPE_LE = 0x01,
+} connection_type_e;
+
+/**
* @brief Request remote device attributes
*
* @details Attibutes such as name, vidpid, bond state etc are requested. remote_device_t is provided
oal_status_t device_set_alias(bt_address_t * addr, char * alias);
+/**
+ * @brief Initiate bonding with remote device
+ *
+ * @details Based on IO capabilties of 2 devices, different events can be generated
+ *
+ * @return OAL_STATUS_SUCCESS on success, otherwise a non-zero error value.
+ * @retval #OAL_STATUS_SUCCESS Successful
+ *
+ * @pre Adapter must be enabled with adapter_enable() followed by OAL_EVENT_ADAPTER_ENABLED
+ *
+ * @see OAL_EVENT_DEVICE_PIN_REQUEST
+ * @see OAL_EVENT_DEVICE_PASSKEY_ENTRY_REQUEST
+ * @see OAL_EVENT_DEVICE_PASSKEY_CONFIRMATION_REQUEST
+ * @see OAL_EVENT_DEVICE_PASSKEY_DISPLAY
+ * @see OAL_EVENT_DEVICE_SSP_CONSENT_REQUEST
+ * @see OAL_EVENT_DEVICE_BONDING_SUCCESS
+ * @see OAL_EVENT_DEVICE_BONDING_FAILED
+ */
+oal_status_t device_create_bond(bt_address_t * addr, connection_type_e transport);
+
+/**
+ * @brief Cancel already in-progress bonding procedure
+ *
+ * @details Based on current progress different events can be recieved.
+ *
+ * @return OAL_STATUS_SUCCESS on success, otherwise a non-zero error value.
+ * @retval #OAL_STATUS_SUCCESS Successful
+ *
+ * @pre Bonding must be in progress by calling device_create_bond()
+ *
+ * @see OAL_EVENT_DEVICE_BONDING_SUCCESS
+ * @see OAL_EVENT_DEVICE_BONDING_FAILED
+ * @see OAL_EVENT_DEVICE_BONDING_REMOVED
+ */
+oal_status_t device_stop_bond(bt_address_t * addr);
+
+
+/**
+ * @brief Remove the already created Bond with remote device
+ *
+ * @details Based on current progress different events can be recieved.
+ *
+ * @return OAL_STATUS_SUCCESS on success, otherwise a non-zero error value.
+ * @retval #OAL_STATUS_SUCCESS Successful
+ *
+ * @pre Bond should exist
+ *
+ * @see OAL_EVENT_DEVICE_BONDING_REMOVED
+ */
+oal_status_t device_destroy_bond(bt_address_t * addr);
#ifdef __cplusplus
}
#endif /* __cplusplus */
int num_properties, bt_property_t *properties);
extern void cb_device_properties(bt_status_t status, bt_bdaddr_t *bd_addr,
int num_properties, bt_property_t *properties);
+extern void cb_device_bond_state_changed(bt_status_t status, bt_bdaddr_t *bd_addr,
+ bt_bond_state_t state);
static bt_callbacks_t callbacks = {
sizeof(callbacks),
cb_adapter_discovery_state_changed,
NULL, /* pin_request_callback */
NULL, /* ssp_request_callback */
- NULL, /* bond_state_changed_callback */
+ cb_device_bond_state_changed,
NULL, /* acl_state_changed_callback */
NULL, /* callback_thread_event */
NULL, /* dut_mode_recv_callback */
#include "oal-common.h"
#include "oal-manager.h"
#include "oal-utils.h"
+#include "oal-device-mgr.h"
static const bt_interface_t * blued_api;
return OAL_STATUS_SUCCESS;
}
+oal_status_t device_create_bond(bt_address_t *addr, connection_type_e transport)
+{
+ int res;
+ bdstr_t bdstr;
+
+ CHECK_OAL_INITIALIZED();
+
+ OAL_CHECK_PARAMETER(addr, return);
+
+ API_TRACE("[%s]", bdt_bd2str(addr, &bdstr));
+
+ res = blued_api->create_bond((bt_bdaddr_t *)addr, (unsigned char)transport);
+ if (res != BT_STATUS_SUCCESS) {
+ BT_ERR("create_bond error: [%s]", status2string(res));
+ return convert_to_oal_status(res);
+ }
+
+ return OAL_STATUS_SUCCESS;
+}
+
+oal_status_t device_destroy_bond(bt_address_t * addr)
+{
+ int res;
+ bdstr_t bdstr;
+
+ CHECK_OAL_INITIALIZED();
+
+ OAL_CHECK_PARAMETER(addr, return);
+
+ API_TRACE("[%s]", bdt_bd2str(addr, &bdstr));
+
+ res = blued_api->remove_bond((bt_bdaddr_t *)addr);
+ if (res != BT_STATUS_SUCCESS) {
+ BT_ERR("remove_bond error: [%s]", status2string(res));
+ return convert_to_oal_status(res);
+ }
+
+ return OAL_STATUS_SUCCESS;
+}
+
void cb_device_properties(bt_status_t status, bt_bdaddr_t *bd_addr,
int num_properties, bt_property_t *properties)
{
send_event_bda_trace(event, event_data, size, (bt_address_t*)bd_addr);
}
+
+void cb_device_bond_state_changed(bt_status_t status, bt_bdaddr_t *bd_addr,
+ bt_bond_state_t state)
+{
+ bt_address_t * address = g_new0(bt_address_t, 1);
+ oal_event_t event;
+ gsize size = 0;
+
+ BT_DBG("status: %d, state: %d", status, state);
+
+ memcpy(address->addr, bd_addr->address, 6);
+
+ switch(state) {
+ case BT_BOND_STATE_BONDED:
+ event = OAL_EVENT_DEVICE_BONDING_SUCCESS;
+ break;
+ case BT_BOND_STATE_NONE:
+ /* Reaches both when bonding removed or bonding cancelled */
+ if (BT_STATUS_SUCCESS != status) {
+ event_dev_bond_failed_t * bond_fail_info = g_new0(event_dev_bond_failed_t, 1);
+ bond_fail_info->status = convert_to_oal_status(status);
+ bond_fail_info->address = *address;
+ size = sizeof(event_dev_bond_failed_t);
+ send_event_bda_trace(OAL_EVENT_DEVICE_BONDING_FAILED, bond_fail_info, size, (bt_address_t*)bd_addr);
+ g_free(address);
+ return;
+ } else
+ event = OAL_EVENT_DEVICE_BONDING_REMOVED;
+ break;
+ case BT_BOND_STATE_BONDING:
+ g_free(address);
+ return;
+ default:
+ BT_ERR("Unexpected Bond state %d", state);
+ g_free(address);
+ return;
+ }
+ send_event_bda_trace(event, address, size, (bt_address_t*)bd_addr);
+}