DO NOT MERGE LE: Add service UUIDs and data to advertising data
Add support for UUIDs and custom service data in the advertising and
scan response records.
Cherry picking ble advertising changes from master to KLP MR2.
b/13137996
Change-Id: I6470427ad194871488cc90f3ab384b9ecf326b15
diff --git a/bta/dm/bta_dm_act.c b/bta/dm/bta_dm_act.c
index 04bd186..a74132a 100755
--- a/bta/dm/bta_dm_act.c
+++ b/bta/dm/bta_dm_act.c
@@ -4997,6 +4997,7 @@
p_data->ble_set_adv_params.p_dir_bda,
BTA_DM_BLE_ADV_CHNL_MAP);
}
+
/*******************************************************************************
**
** Function bta_dm_ble_set_adv_config
@@ -5012,6 +5013,34 @@
(tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg);
}
+/*******************************************************************************
+**
+** Function bta_dm_ble_set_scan_rsp
+**
+** Description This function set the customized ADV scan resp. configuration
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data)
+{
+ BTM_BleWriteScanRsp(p_data->ble_set_adv_data.data_mask,
+ (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg);
+}
+
+/*******************************************************************************
+**
+** Function bta_dm_ble_broadcast
+**
+** Description Starts or stops LE broadcasts
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_broadcast (tBTA_DM_MSG *p_data)
+{
+ BTM_BleBroadcast(p_data->ble_observe.start);
+}
#if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
#ifndef BTA_DM_GATT_CLOSE_DELAY_TOUT
diff --git a/bta/dm/bta_dm_api.c b/bta/dm/bta_dm_api.c
index 941213a..e37548e 100644
--- a/bta/dm/bta_dm_api.c
+++ b/bta/dm/bta_dm_api.c
@@ -1510,6 +1510,60 @@
bta_sys_sendmsg(p_msg);
}
}
+
+/*******************************************************************************
+**
+** Function BTA_DmBleSetScanRsp
+**
+** Description This function is called to override the BTA scan response.
+**
+** Parameters Pointer to User defined ADV data structure
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleSetScanRsp (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_adv_cfg)
+{
+ tBTA_DM_API_SET_ADV_CONFIG *p_msg;
+
+ if ((p_msg = (tBTA_DM_API_SET_ADV_CONFIG *) GKI_getbuf(sizeof(tBTA_DM_API_SET_ADV_CONFIG))) != NULL)
+ {
+ p_msg->hdr.event = BTA_DM_API_BLE_SET_SCAN_RSP_EVT;
+ p_msg->data_mask = data_mask;
+ p_msg->p_adv_cfg = p_adv_cfg;
+
+ bta_sys_sendmsg(p_msg);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_DmBleBroadcast
+**
+** Description This function starts or stops LE broadcasting.
+**
+** Parameters start: start or stop broadcast.
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleBroadcast (BOOLEAN start)
+{
+ tBTA_DM_API_BLE_OBSERVE *p_msg;
+
+ APPL_TRACE_API1("BTA_DmBleBroadcast: start = %d ", start);
+
+ if ((p_msg = (tBTA_DM_API_BLE_OBSERVE *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_OBSERVE))) != NULL)
+ {
+ memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_OBSERVE));
+
+ p_msg->hdr.event = BTA_DM_API_BLE_BROADCAST_EVT;
+ p_msg->start = start;
+
+ bta_sys_sendmsg(p_msg);
+ }
+}
+
#endif
/*******************************************************************************
**
diff --git a/bta/dm/bta_dm_int.h b/bta/dm/bta_dm_int.h
index d87dbf3..dd3e16c 100644
--- a/bta/dm/bta_dm_int.h
+++ b/bta/dm/bta_dm_int.h
@@ -101,6 +101,8 @@
BTA_DM_API_BLE_OBSERVE_EVT,
BTA_DM_API_BLE_ADV_PARAM_EVT,
BTA_DM_API_BLE_SET_ADV_CONFIG_EVT,
+ BTA_DM_API_BLE_SET_SCAN_RSP_EVT,
+ BTA_DM_API_BLE_BROADCAST_EVT,
#endif
#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
@@ -996,6 +998,8 @@
extern void bta_dm_ble_observe (tBTA_DM_MSG *p_data);
extern void bta_dm_ble_set_adv_params (tBTA_DM_MSG *p_data);
extern void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data);
+extern void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data);
+extern void bta_dm_ble_broadcast (tBTA_DM_MSG *p_data);
#endif
extern void bta_dm_set_encryption(tBTA_DM_MSG *p_data);
diff --git a/bta/dm/bta_dm_main.c b/bta/dm/bta_dm_main.c
index 50f871f..0f6b91a 100644
--- a/bta/dm/bta_dm_main.c
+++ b/bta/dm/bta_dm_main.c
@@ -98,6 +98,8 @@
bta_dm_ble_observe,
bta_dm_ble_set_adv_params, /* BTA_DM_API_BLE_SCAN_PARAM_EVT */
bta_dm_ble_set_adv_config, /* BTA_DM_API_BLE_SET_ADV_CONFIG_EVT */
+ bta_dm_ble_set_scan_rsp, /* BTA_DM_API_BLE_SET_SCAN_RSP_EVT */
+ bta_dm_ble_broadcast, /* BTA_DM_API_BLE_BROADCAST_EVT */
#endif
#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
diff --git a/bta/include/bta_api.h b/bta/include/bta_api.h
index e52e699..4345fbf 100644
--- a/bta/include/bta_api.h
+++ b/bta/include/bta_api.h
@@ -1884,7 +1884,7 @@
*******************************************************************************/
BTA_API extern void BTA_DmSetAfhChannelAssessment (BOOLEAN enable_or_disable);
-#if BLE_INCLUDE == TRUE
+#if BLE_INCLUDED == TRUE
// btla-specific --
/*******************************************************************************
**
@@ -1927,6 +1927,34 @@
*******************************************************************************/
BTA_API extern void BTA_DmBleSetAdvConfig (tBTA_BLE_AD_MASK data_mask,
tBTA_BLE_ADV_DATA *p_adv_cfg);
+
+/*******************************************************************************
+**
+** Function BTA_DmBleSetScanRsp
+**
+** Description This function is called to override the BTA scan response.
+**
+** Parameters Pointer to User defined ADV data structure
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleSetScanRsp (tBTA_BLE_AD_MASK data_mask,
+ tBTA_BLE_ADV_DATA *p_adv_cfg);
+
+/*******************************************************************************
+**
+** Function BTA_DmBleBroadcast
+**
+** Description This function starts or stops LE broadcasting.
+**
+** Parameters start: start or stop broadcast.
+**
+** Returns None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleBroadcast (BOOLEAN start);
+
#endif
#ifdef __cplusplus
diff --git a/btif/src/btif_gatt_client.c b/btif/src/btif_gatt_client.c
index ce51ce2..64cd976 100644
--- a/btif/src/btif_gatt_client.c
+++ b/btif/src/btif_gatt_client.c
@@ -104,8 +104,8 @@
typedef struct
{
- tBTM_BLE_AD_MASK mask;
- tBTM_BLE_ADV_DATA data;
+ tBTA_BLE_AD_MASK mask;
+ tBTA_BLE_ADV_DATA data;
} btgatt_adv_data;
typedef struct
@@ -819,17 +819,46 @@
break;
case BTIF_GATTC_LISTEN:
+#ifdef BLE_PERIPHERAL_MODE_SUPPORT
BTA_GATTC_Listen(p_cb->client_if, p_cb->start, NULL);
+#else
+ BTA_DmBleBroadcast(p_cb->start);
+#endif
break;
case BTIF_GATTC_SET_ADV_DATA:
{
if (p_cb->start == 0)
- BTM_BleWriteAdvData(p_cb->adv_data.mask, &p_cb->adv_data.data);
+ BTA_DmBleSetAdvConfig(p_cb->adv_data.mask, &p_cb->adv_data.data);
else
- BTM_BleWriteScanRsp(p_cb->adv_data.mask, &p_cb->adv_data.data);
+ BTA_DmBleSetScanRsp(p_cb->adv_data.mask, &p_cb->adv_data.data);
+
+ // Cleanup ...
+
+ // ... manufacturer data
if (p_cb->adv_data.data.manu.p_val != NULL)
GKI_freebuf(p_cb->adv_data.data.manu.p_val);
+
+ // ... service data
+ if (p_cb->adv_data.data.p_proprietary != NULL)
+ {
+ int i = 0;
+ tBTA_BLE_PROP_ELEM *p_elem = p_cb->adv_data.data.p_proprietary->p_elem;
+ while (i++ != p_cb->adv_data.data.p_proprietary->num_elem && p_elem)
+ {
+ if (p_elem->p_val != NULL)
+ GKI_freebuf(p_elem->p_val);
+ ++p_elem;
+ }
+ if (p_cb->adv_data.data.p_proprietary->p_elem != NULL)
+ GKI_freebuf(p_cb->adv_data.data.p_proprietary->p_elem);
+ GKI_freebuf(p_cb->adv_data.data.p_proprietary);
+ }
+
+ // ... service list
+ if (p_cb->adv_data.data.services.p_uuid != NULL)
+ GKI_freebuf(p_cb->adv_data.data.services.p_uuid);
+
break;
}
@@ -904,7 +933,9 @@
static bt_status_t btif_gattc_set_adv_data(int client_if, bool set_scan_rsp, bool include_name,
bool include_txpower, int min_interval, int max_interval, int appearance,
- uint16_t manufacturer_len, char* manufacturer_data)
+ uint16_t manufacturer_len, char* manufacturer_data,
+ uint16_t service_data_len, char* service_data,
+ uint16_t service_uuid_len, char* service_uuid)
{
CHECK_BTGATT_INIT();
btif_gattc_cb_t btif_cb;
@@ -950,6 +981,112 @@
}
}
+ tBTA_BLE_PROP_ELEM *p_elem_service_data = NULL;
+ tBTA_BLE_PROP_ELEM *p_elem_service_128 = NULL;
+
+ if (service_data_len > 0 && service_data != NULL)
+ {
+ p_elem_service_data = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM));
+ if (p_elem_service_data != NULL)
+ {
+ p_elem_service_data->p_val = GKI_getbuf(service_data_len);
+ if (p_elem_service_data->p_val != NULL)
+ {
+ p_elem_service_data->adv_type = BTM_BLE_AD_TYPE_SERVICE_DATA;
+ p_elem_service_data->len = service_data_len;
+ memcpy(p_elem_service_data->p_val, service_data, service_data_len);
+
+ } else {
+ GKI_freebuf(p_elem_service_data);
+ p_elem_service_data = NULL;
+ }
+ }
+ }
+
+ if (service_uuid_len > 0 && service_uuid != NULL)
+ {
+ btif_cb.adv_data.data.services.list_cmpl = FALSE;
+ btif_cb.adv_data.data.services.num_service = 0;
+
+ btif_cb.adv_data.data.services.p_uuid =
+ GKI_getbuf(service_uuid_len / LEN_UUID_128 * LEN_UUID_16);
+ if (btif_cb.adv_data.data.services.p_uuid != NULL)
+ {
+ UINT16 *p_uuid_out = btif_cb.adv_data.data.services.p_uuid;
+ while (service_uuid_len >= LEN_UUID_128)
+ {
+ bt_uuid_t uuid;
+ memset(&uuid, 0, sizeof(bt_uuid_t));
+ memcpy(&uuid.uu, service_uuid, LEN_UUID_128);
+
+ tBT_UUID bt_uuid;
+ memset(&bt_uuid, 0, sizeof(tBT_UUID));
+ btif_to_bta_uuid(&bt_uuid, &uuid);
+
+ if (bt_uuid.len == LEN_UUID_16)
+ {
+ btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_SERVICE;
+ ++btif_cb.adv_data.data.services.num_service;
+ *p_uuid_out++ = bt_uuid.uu.uuid16;
+
+ } else if (bt_uuid.len == LEN_UUID_128 && p_elem_service_128 == NULL) {
+ /* Currently, only one 128-bit UUID is supported */
+ p_elem_service_128 = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM));
+ if (p_elem_service_128 != NULL)
+ {
+ p_elem_service_128->p_val = GKI_getbuf(LEN_UUID_128);
+ if (p_elem_service_128->p_val != NULL)
+ {
+ p_elem_service_128->adv_type = BTM_BLE_AD_TYPE_128SRV_PART;
+ p_elem_service_128->len = LEN_UUID_128;
+ memcpy(p_elem_service_128->p_val, bt_uuid.uu.uuid128, LEN_UUID_128);
+
+ } else {
+ GKI_freebuf(p_elem_service_128);
+ p_elem_service_128 = NULL;
+ }
+ }
+ }
+
+ service_uuid += LEN_UUID_128;
+ service_uuid_len -= LEN_UUID_128;
+ }
+ }
+ }
+
+ if (p_elem_service_data != NULL || p_elem_service_128 != NULL)
+ {
+ btif_cb.adv_data.data.p_proprietary = GKI_getbuf(sizeof(tBTA_BLE_PROPRIETARY));
+ if (btif_cb.adv_data.data.p_proprietary != NULL)
+ {
+ tBTA_BLE_PROPRIETARY *p_prop = btif_cb.adv_data.data.p_proprietary;
+ tBTA_BLE_PROP_ELEM *p_elem = NULL;
+ p_prop->num_elem = 0;
+ btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_PROPRIETARY;
+
+ if (p_elem_service_128 != NULL)
+ ++p_prop->num_elem;
+
+ if (p_elem_service_data != NULL)
+ ++p_prop->num_elem;
+
+ p_prop->p_elem = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM) * p_prop->num_elem);
+ p_elem = p_prop->p_elem;
+
+ if (p_elem_service_128 != NULL)
+ {
+ memcpy(p_elem++, p_elem_service_128, sizeof(tBTA_BLE_PROP_ELEM));
+ GKI_freebuf(p_elem_service_128);
+ }
+
+ if (p_elem_service_data != NULL)
+ {
+ memcpy(p_elem++, p_elem_service_data, sizeof(tBTA_BLE_PROP_ELEM));
+ GKI_freebuf(p_elem_service_data);
+ }
+ }
+ }
+
return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SET_ADV_DATA,
(char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
}
diff --git a/stack/gatt/gatt_api.c b/stack/gatt/gatt_api.c
index a96c58a..b53b7c5 100644
--- a/stack/gatt/gatt_api.c
+++ b/stack/gatt/gatt_api.c
@@ -1294,7 +1294,9 @@
gatt_deregister_bgdev_list(gatt_if);
/* update the listen mode */
+#ifdef BLE_PERIPHERAL_MODE_SUPPORT
GATT_Listen(gatt_if, FALSE, NULL);
+#endif
memset (p_reg, 0, sizeof(tGATT_REG));
}