blob: 6fcde31bf9ad1481335596b87849ef8e1fe9b68f [file] [log] [blame]
/*
* Copyright (c) 2020 Demant
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <string.h>
#include <zephyr/types.h>
#include <ztest.h>
#include <stdio.h>
#include <stdlib.h>
#define CONFIG_BT_CTLR_FILTER_ACCEPT_LIST 1
#define CONFIG_BT_CTLR_PRIVACY 1
#define CONFIG_BT_CTLR_RL_SIZE 8
#define CONFIG_BT_CTLR_FAL_SIZE 8
#define CONFIG_BT_CTLR_RPA_CACHE_SIZE 4
#define CONFIG_BT_CTLR_SW_DEFERRED_PRIVACY 1
#define CONFIG_BT_LOG_LEVEL 1
#include "ll_sw/ull_filter.c"
/*
* Unit test of SW deferred privacy data structure and related methods
* Tests the prpa_cache_add, prpa_cache_clear and prpa_cache_find functions
*/
#define BT_ADDR_INIT(P0, P1, P2, P3, P4, P5) \
(&(bt_addr_t){ { P0, P1, P2, P3, P4, P5 } })
void helper_privacy_clear(void)
{
zassert_equal(newest_prpa, 0, "");
for (uint8_t i = 0; i < CONFIG_BT_CTLR_RPA_CACHE_SIZE; i++) {
zassert_equal(prpa_cache[i].taken, 0U, "");
}
}
void helper_privacy_add(int skew)
{
bt_addr_t a1, a2, a3, a4, a5;
uint8_t pos, ex_pos;
bt_addr_copy(&a1, BT_ADDR_INIT(0x12, 0x13, 0x14, 0x15, 0x16, 0x17));
bt_addr_copy(&a2, BT_ADDR_INIT(0x22, 0x23, 0x24, 0x25, 0x26, 0x27));
bt_addr_copy(&a3, BT_ADDR_INIT(0x32, 0x33, 0x34, 0x35, 0x36, 0x37));
bt_addr_copy(&a4, BT_ADDR_INIT(0x42, 0x43, 0x44, 0x45, 0x46, 0x47));
bt_addr_copy(&a5, BT_ADDR_INIT(0x52, 0x53, 0x54, 0x55, 0x56, 0x57));
prpa_cache_add(&a1);
pos = prpa_cache_find(&a1);
ex_pos = (1 + skew) % CONFIG_BT_CTLR_RPA_CACHE_SIZE;
zassert_equal(pos, ex_pos, "%d == %d", pos, ex_pos);
prpa_cache_add(&a2);
pos = prpa_cache_find(&a2);
ex_pos = (2 + skew) % CONFIG_BT_CTLR_RPA_CACHE_SIZE;
zassert_equal(pos, ex_pos, "");
prpa_cache_add(&a3);
pos = prpa_cache_find(&a3);
ex_pos = (3 + skew) % CONFIG_BT_CTLR_RPA_CACHE_SIZE;
zassert_equal(pos, ex_pos, "");
/* Adding this should cause wrap around */
prpa_cache_add(&a4);
pos = prpa_cache_find(&a4);
ex_pos = (4 + skew) % CONFIG_BT_CTLR_RPA_CACHE_SIZE;
zassert_equal(pos, ex_pos, "");
/* adding this should cause a1 to be dropped */
prpa_cache_add(&a5);
pos = prpa_cache_find(&a5);
ex_pos = (1 + skew) % CONFIG_BT_CTLR_RPA_CACHE_SIZE;
zassert_equal(pos, ex_pos, "");
/* check that a1 can no longer be found */
pos = prpa_cache_find(&a1);
zassert_equal(pos, FILTER_IDX_NONE, "");
}
static void before(void *data)
{
ARG_UNUSED(data);
/* Run before each test - clear the cache so we start fresh each time. */
prpa_cache_clear();
}
ZTEST_SUITE(test_ctrl_sw_privacy_unit, NULL, NULL, before, NULL, NULL);
ZTEST(test_ctrl_sw_privacy_unit, test_privacy_clear)
{
helper_privacy_clear();
}
ZTEST(test_ctrl_sw_privacy_unit, test_privacy_add)
{
helper_privacy_add(0);
}
ZTEST(test_ctrl_sw_privacy_unit, test_privacy_add_stress)
{
bt_addr_t ar;
for (uint8_t skew = 0; skew < CONFIG_BT_CTLR_RPA_CACHE_SIZE; skew++) {
for (uint8_t i = 0; i < skew; i++) {
bt_addr_copy(&ar,
BT_ADDR_INIT(0xde, 0xad, 0xbe,
0xef, 0xaa, 0xff));
prpa_cache_add(&ar);
}
helper_privacy_add(skew);
prpa_cache_clear();
}
}