blob: 9d46dc342d35ade5fbddaca40b5d4030809abfc2 [file] [log] [blame]
/*
* Copyright (c) 2020 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include <zephyr/toolchain.h>
#include <zephyr/sys/util.h>
#include "util/util.h"
#include "util/memq.h"
#include "util/mem.h"
#include "util/dbuf.h"
#include "hal/ccm.h"
#include "pdu.h"
#include "lll.h"
#include "lll/lll_adv_types.h"
#include "lll_adv.h"
#include "lll/lll_adv_pdu.h"
#include "lll/lll_df_types.h"
#include "lll_conn.h"
#include "ull_adv_types.h"
#include "ull_adv_internal.h"
#include "ull_central_internal.h"
/* Initial channel map indicating Used and Unused data channels.
* The HCI LE Set Host Channel Classification command allows the Host to
* specify a channel classification for the data, secondary advertising,
* periodic, and isochronous physical channels based on its local information.
*/
static uint8_t map[5] = {0xFF, 0xFF, 0xFF, 0xFF, 0x1F};
static uint8_t count = 37U;
static void chan_map_set(uint8_t const *const chan_map);
uint8_t ll_chm_update(uint8_t const *const chm)
{
chan_map_set(chm);
#if defined(CONFIG_BT_CENTRAL)
(void)ull_central_chm_update();
#endif /* CONFIG_BT_CENTRAL */
#if (CONFIG_BT_CTLR_ADV_AUX_SET > 0)
(void)ull_adv_aux_chm_update();
#endif /*(CONFIG_BT_CTLR_ADV_AUX_SET > 0) */
#if defined(CONFIG_BT_CTLR_ADV_PERIODIC)
(void)ull_adv_sync_chm_update();
#endif /* CONFIG_BT_CTLR_ADV_PERIODIC */
#if defined(CONFIG_BT_CTLR_ADV_ISO)
(void)ull_adv_iso_chm_update();
#endif /* CONFIG_BT_CTLR_ADV_ISO */
/* TODO: Should failure due to Channel Map Update being already in
* progress be returned to caller?
*/
return 0;
}
int ull_chan_reset(void)
{
/* initialise connection channel map */
map[0] = 0xFF;
map[1] = 0xFF;
map[2] = 0xFF;
map[3] = 0xFF;
map[4] = 0x1F;
count = 37U;
return 0;
}
uint8_t ull_chan_map_get(uint8_t *const chan_map)
{
(void)memcpy(chan_map, map, sizeof(map));
return count;
}
static void chan_map_set(uint8_t const *const chan_map)
{
(void)memcpy(map, chan_map, sizeof(map));
count = util_ones_count_get(map, sizeof(map));
}