#include <string.h>
#include "bt_target.h"
-#if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE)
+#if (BLE_INCLUDED == TRUE)
#include "bt_types.h"
#include "hcimsgs.h"
#include "btu.h"
static const BD_ADDR na_bda= {0};
-
/*******************************************************************************
** Resolve Address Using IRK List functions
*******************************************************************************/
-#if BLE_PRIVACY_SPT == TRUE
-/* Forward declaration */
-tBTM_STATUS BTM_BleEnableIRKFeature(BOOLEAN enable);
/*******************************************************************************
**
*******************************************************************************/
void btm_ble_vendor_enq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_bda, UINT8 to_add)
{
+#if BLE_PRIVACY_SPT == TRUE
tBTM_BLE_IRK_Q *p_q = &btm_ble_vendor_cb.irk_pend_q;
memcpy(p_q->irk_q[p_q->q_next], target_bda, BD_ADDR_LEN);
p_q->irk_q_action[p_q->q_next] = to_add;
p_q->q_next ++;
- p_q->q_next %= BTM_CS_IRK_LIST_MAX;
-
+ p_q->q_next %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;;
+#endif
return ;
}
/*******************************************************************************
*******************************************************************************/
BOOLEAN btm_ble_vendor_find_irk_pending_entry(BD_ADDR psuedo_addr, UINT8 action)
{
+#if BLE_PRIVACY_SPT == TRUE
tBTM_BLE_IRK_Q *p_q = &btm_ble_vendor_cb.irk_pend_q;
UINT8 i;
return TRUE;
i ++;
- i %= BTM_CS_IRK_LIST_MAX;
+ i %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;
}
+#endif
return FALSE;
}
/*******************************************************************************
*******************************************************************************/
BOOLEAN btm_ble_vendor_deq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_addr)
{
+#if BLE_PRIVACY_SPT == TRUE
tBTM_BLE_IRK_Q *p_q = &btm_ble_vendor_cb.irk_pend_q;
if (p_q->q_next != p_q->q_pending)
memcpy(psuedo_addr, p_q->irk_q_random_pseudo[p_q->q_pending], BD_ADDR_LEN);
p_q->q_pending ++;
- p_q->q_pending %= BTM_CS_IRK_LIST_MAX;
+ p_q->q_pending %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;
return TRUE;
}
-
+#endif
return FALSE;
}
*******************************************************************************/
tBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry(BD_ADDR target_bda)
{
+#if BLE_PRIVACY_SPT == TRUE
tBTM_BLE_IRK_ENTRY *p_irk_entry = &btm_ble_vendor_cb.irk_list[0];
UINT8 i;
- for (i = 0; i < BTM_CS_IRK_LIST_MAX; i ++, p_irk_entry++)
+ for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++)
{
if (p_irk_entry->in_use && memcmp(p_irk_entry->bd_addr, target_bda, BD_ADDR_LEN) == 0)
{
return p_irk_entry ;
}
}
+#endif
return NULL;
}
/*******************************************************************************
*******************************************************************************/
tBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry_by_psuedo_addr (BD_ADDR psuedo_bda)
{
+#if BLE_PRIVACY_SPT == TRUE
tBTM_BLE_IRK_ENTRY *p_irk_entry = &btm_ble_vendor_cb.irk_list[0];
UINT8 i;
- for (i = 0; i < BTM_CS_IRK_LIST_MAX; i ++, p_irk_entry++)
+ for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++)
{
if (p_irk_entry->in_use && memcmp(p_irk_entry->psuedo_bda, psuedo_bda, BD_ADDR_LEN) == 0)
{
return p_irk_entry ;
}
}
+#endif
return NULL;
}
/*******************************************************************************
*******************************************************************************/
UINT8 btm_ble_vendor_alloc_irk_entry(BD_ADDR target_bda, BD_ADDR pseudo_bda)
{
+#if BLE_PRIVACY_SPT == TRUE
tBTM_BLE_IRK_ENTRY *p_irk_entry = &btm_ble_vendor_cb.irk_list[0];
UINT8 i;
- for (i = 0; i < BTM_CS_IRK_LIST_MAX; i ++, p_irk_entry++)
+ for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++)
{
if (!p_irk_entry->in_use)
{
return i;
}
}
+#endif
return BTM_CS_IRK_LIST_INVALID;
}
*******************************************************************************/
void btm_ble_vendor_update_irk_list(BD_ADDR target_bda, BD_ADDR pseudo_bda, BOOLEAN add)
{
+#if BLE_PRIVACY_SPT == TRUE
tBTM_BLE_IRK_ENTRY *p_irk_entry = btm_ble_vendor_find_irk_entry(target_bda);
UINT8 i;
BTM_TRACE_ERROR("No IRK exist in list, can not remove");
}
}
+#endif
return ;
}
/*******************************************************************************
op_subcode = *p ++;
BTM_TRACE_DEBUG("btm_ble_vendor_irk_vsc_op_cmpl op_subcode = %d", op_subcode);
- if (evt_len < 2 )
+ if (evt_len < 1)
{
- BTM_TRACE_ERROR("can not interpret IRK VSC cmpl callback");
+ BTM_TRACE_ERROR("cannot interpret IRK VSC cmpl callback");
return;
}
-
+ if (BTM_BLE_META_IRK_ENABLE == op_subcode)
+ {
+ BTM_TRACE_DEBUG("IRK enable: %d, %d", status, op_subcode);
+ return;
+ }
+ else
if (op_subcode == BTM_BLE_META_CLEAR_IRK_LIST)
{
if (status == HCI_SUCCESS)
BTM_TRACE_DEBUG("p_cb->irk_list_size = %d", p_cb->irk_avail_size);
- for (i = 0; i < BTM_CS_IRK_LIST_MAX; i ++)
+ for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++)
memset(&p_cb->irk_list[i], 0, sizeof(tBTM_BLE_IRK_ENTRY));
}
}
p += (1 + 16 + 1); /* skip index, IRK value, address type */
STREAM_TO_BDADDR(target_bda, p);
STREAM_TO_BDADDR(rra, p);
-
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
btm_ble_refresh_rra(target_bda, rra);
-#endif
}
}
*******************************************************************************/
tBTM_STATUS btm_ble_remove_irk_entry(tBTM_SEC_DEV_REC *p_dev_rec)
{
+#if BLE_PRIVACY_SPT == TRUE
UINT8 param[20], *p;
tBTM_STATUS st;
tBTM_BLE_VENDOR_CB *p_cb = &btm_ble_vendor_cb;
}
return st;
-
+#endif
+ return BTM_MODE_UNSUPPORTED;
}
/*******************************************************************************
**
*******************************************************************************/
tBTM_STATUS btm_ble_vendor_clear_irk_list(void)
{
+#if BLE_PRIVACY_SPT == TRUE
UINT8 param[20], *p;
tBTM_STATUS st;
btm_ble_vendor_irk_vsc_op_cmpl);
return st;
-
+#endif
+ return BTM_MODE_UNSUPPORTED;
}
/*******************************************************************************
**
*******************************************************************************/
tBTM_STATUS btm_ble_read_irk_entry(BD_ADDR target_bda)
{
+#if BLE_PRIVACY_SPT == TRUE
UINT8 param[20], *p;
tBTM_STATUS st = BTM_UNKNOWN_ADDR;
tBTM_BLE_IRK_ENTRY *p_entry = btm_ble_vendor_find_irk_entry(target_bda);
btm_ble_vendor_irk_vsc_op_cmpl);
return st;
-
+#endif
+ return BTM_MODE_UNSUPPORTED;
}
*******************************************************************************/
void btm_ble_vendor_irk_list_known_dev(BOOLEAN enable)
{
+#if BLE_PRIVACY_SPT == TRUE
UINT8 i;
UINT8 count = 0;
tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0];
}
if ((count > 0 && enable) || !enable)
- BTM_BleEnableIRKFeature(enable);
-
+ btm_ble_vendor_enable_irk_feature(enable);
+#endif
return ;
}
/*******************************************************************************
*******************************************************************************/
BOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec)
{
+#if BLE_PRIVACY_SPT == TRUE
UINT8 param[40], *p;
tBTM_BLE_VENDOR_CB *p_cb = &btm_ble_vendor_cb;
BOOLEAN rt = FALSE;
BTM_TRACE_DEBUG("Device not a RPA enabled device");
}
return rt;
+#endif
+ return FALSE;
}
/*******************************************************************************
**
*******************************************************************************/
void btm_ble_vendor_irk_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec)
{
+#if BLE_PRIVACY_SPT == TRUE
tBTM_BLE_VENDOR_CB *p_cs_cb = &btm_ble_vendor_cb;
tBTM_BLE_IRK_ENTRY *p_irk_entry;
}
if (p_cs_cb->irk_list_size == 0)
- BTM_BleEnableIRKFeature(FALSE);
+ btm_ble_vendor_enable_irk_feature(FALSE);
+#endif
}
/*******************************************************************************
**
*******************************************************************************/
void btm_ble_vendor_disable_irk_list(void)
{
- BTM_BleEnableIRKFeature(FALSE);
-
+#if BLE_PRIVACY_SPT == TRUE
+ btm_ble_vendor_enable_irk_feature(FALSE);
+#endif
}
/*******************************************************************************
**
-** Function BTM_BleEnableIRKFeature
+** Function btm_ble_vendor_enable_irk_feature
**
** Description This function is called to enable or disable the RRA
** offloading feature.
** Returns BTM_SUCCESS if successful
**
*******************************************************************************/
-tBTM_STATUS BTM_BleEnableIRKFeature(BOOLEAN enable)
+tBTM_STATUS btm_ble_vendor_enable_irk_feature(BOOLEAN enable)
{
+#if BLE_PRIVACY_SPT == TRUE
UINT8 param[20], *p;
tBTM_STATUS st = BTM_WRONG_MODE;
tBTM_BLE_PF_COUNT *p_bda_filter;
param, btm_ble_vendor_irk_vsc_op_cmpl);
return st;
+#endif
+ return BTM_MODE_UNSUPPORTED;
}
#endif
+
+/*******************************************************************************
+**
+** Function btm_ble_vendor_init
+**
+** Description Initialize customer specific feature information in host stack
+**
+** Parameters Max IRK list size
+** Max filter supported
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_vendor_init(UINT8 max_irk_list_sz)
+{
+ memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB));
+
+#if BLE_PRIVACY_SPT == TRUE
+ if (max_irk_list_sz > 0)
+ {
+ btm_ble_vendor_cb.irk_list = (tBTM_BLE_IRK_ENTRY*)GKI_getbuf (sizeof (tBTM_BLE_IRK_ENTRY)
+ * max_irk_list_sz);
+ btm_ble_vendor_cb.irk_pend_q.irk_q = (BD_ADDR*) GKI_getbuf (sizeof (BD_ADDR) *
+ max_irk_list_sz);
+ btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo = (BD_ADDR*)GKI_getbuf (sizeof (BD_ADDR) *
+ max_irk_list_sz);
+ btm_ble_vendor_cb.irk_pend_q.irk_q_action = (UINT8*) GKI_getbuf (max_irk_list_sz);
+ }
+
+ btm_ble_vendor_cb.irk_avail_size = max_irk_list_sz;
+
+ if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+ return;
+#endif
+}
+
+/*******************************************************************************
+**
+** Function btm_ble_vendor_cleanup
+**
+** Description Cleanup VSC specific dynamic memory
+**
+** Parameters
+**
+** Returns void
+**
+*******************************************************************************/
+void btm_ble_vendor_cleanup(void)
+{
+#if BLE_PRIVACY_SPT == TRUE
+ if (btm_ble_vendor_cb.irk_list)
+ GKI_freebuf(btm_ble_vendor_cb.irk_list);
+
+ if (btm_ble_vendor_cb.irk_pend_q.irk_q)
+ GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q);
+
+ if (btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo)
+ GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo);
+
+ if (btm_ble_vendor_cb.irk_pend_q.irk_q_action)
+ GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q_action);
#endif
+ memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB));
+}
+