Skip to content

Commit

Permalink
nimble: controller: Add initial support for CS HCI
Browse files Browse the repository at this point in the history
Add stubs for Channel Sounding.
  • Loading branch information
mkasenberg authored and sjanc committed Apr 9, 2024
1 parent 58eb408 commit f639326
Show file tree
Hide file tree
Showing 6 changed files with 273 additions and 40 deletions.
83 changes: 43 additions & 40 deletions nimble/controller/include/controller/ble_ll.h
Original file line number Diff line number Diff line change
Expand Up @@ -245,46 +245,49 @@ extern STATS_SECT_DECL(ble_ll_stats) ble_ll_stats;
#endif

/* LL Features */
#define BLE_LL_FEAT_LE_ENCRYPTION (0x0000000001)
#define BLE_LL_FEAT_CONN_PARM_REQ (0x0000000002)
#define BLE_LL_FEAT_EXTENDED_REJ (0x0000000004)
#define BLE_LL_FEAT_PERIPH_INIT (0x0000000008)
#define BLE_LL_FEAT_LE_PING (0x0000000010)
#define BLE_LL_FEAT_DATA_LEN_EXT (0x0000000020)
#define BLE_LL_FEAT_LL_PRIVACY (0x0000000040)
#define BLE_LL_FEAT_EXT_SCAN_FILT (0x0000000080)
#define BLE_LL_FEAT_LE_2M_PHY (0x0000000100)
#define BLE_LL_FEAT_STABLE_MOD_ID_TX (0x0000000200)
#define BLE_LL_FEAT_STABLE_MOD_ID_RX (0x0000000400)
#define BLE_LL_FEAT_LE_CODED_PHY (0x0000000800)
#define BLE_LL_FEAT_EXT_ADV (0x0000001000)
#define BLE_LL_FEAT_PERIODIC_ADV (0x0000002000)
#define BLE_LL_FEAT_CSA2 (0x0000004000)
#define BLE_LL_FEAT_LE_POWER_CLASS_1 (0x0000008000)
#define BLE_LL_FEAT_MIN_USED_CHAN (0x0000010000)
#define BLE_LL_FEAT_CTE_REQ (0x0000020000)
#define BLE_LL_FEAT_CTE_RSP (0x0000040000)
#define BLE_LL_FEAT_CTE_TX (0x0000080000)
#define BLE_LL_FEAT_CTE_RX (0x0000100000)
#define BLE_LL_FEAT_CTE_AOD (0x0000200000)
#define BLE_LL_FEAT_CTE_AOA (0x0000400000)
#define BLE_LL_FEAT_CTE_RECV (0x0000800000)
#define BLE_LL_FEAT_SYNC_TRANS_SEND (0x0001000000)
#define BLE_LL_FEAT_SYNC_TRANS_RECV (0x0002000000)
#define BLE_LL_FEAT_SCA_UPDATE (0x0004000000)
#define BLE_LL_FEAT_REM_PKEY (0x0008000000)
#define BLE_LL_FEAT_CIS_CENTRAL (0x0010000000)
#define BLE_LL_FEAT_CIS_PERIPH (0x0020000000)
#define BLE_LL_FEAT_ISO_BROADCASTER (0x0040000000)
#define BLE_LL_FEAT_SYNC_RECV (0x0080000000)
#define BLE_LL_FEAT_CIS_HOST (0x0100000000)
#define BLE_LL_FEAT_POWER_CTRL_REQ (0x0200000000)
#define BLE_LL_FEAT_POWER_CHANGE_IND (0x0400000000)
#define BLE_LL_FEAT_PATH_LOSS_MON (0x0800000000)
#define BLE_LL_FEAT_PERIODIC_ADV_ADI (0x1000000000)
#define BLE_LL_FEAT_CONN_SUBRATING (0x2000000000)
#define BLE_LL_FEAT_CONN_SUBRATING_HOST (0x4000000000)
#define BLE_LL_FEAT_CHANNEL_CLASS (0x8000000000)
#define BLE_LL_FEAT_LE_ENCRYPTION (0x0000000000001)
#define BLE_LL_FEAT_CONN_PARM_REQ (0x0000000000002)
#define BLE_LL_FEAT_EXTENDED_REJ (0x0000000000004)
#define BLE_LL_FEAT_PERIPH_INIT (0x0000000000008)
#define BLE_LL_FEAT_LE_PING (0x0000000000010)
#define BLE_LL_FEAT_DATA_LEN_EXT (0x0000000000020)
#define BLE_LL_FEAT_LL_PRIVACY (0x0000000000040)
#define BLE_LL_FEAT_EXT_SCAN_FILT (0x0000000000080)
#define BLE_LL_FEAT_LE_2M_PHY (0x0000000000100)
#define BLE_LL_FEAT_STABLE_MOD_ID_TX (0x0000000000200)
#define BLE_LL_FEAT_STABLE_MOD_ID_RX (0x0000000000400)
#define BLE_LL_FEAT_LE_CODED_PHY (0x0000000000800)
#define BLE_LL_FEAT_EXT_ADV (0x0000000001000)
#define BLE_LL_FEAT_PERIODIC_ADV (0x0000000002000)
#define BLE_LL_FEAT_CSA2 (0x0000000004000)
#define BLE_LL_FEAT_LE_POWER_CLASS_1 (0x0000000008000)
#define BLE_LL_FEAT_MIN_USED_CHAN (0x0000000010000)
#define BLE_LL_FEAT_CTE_REQ (0x0000000020000)
#define BLE_LL_FEAT_CTE_RSP (0x0000000040000)
#define BLE_LL_FEAT_CTE_TX (0x0000000080000)
#define BLE_LL_FEAT_CTE_RX (0x0000000100000)
#define BLE_LL_FEAT_CTE_AOD (0x0000000200000)
#define BLE_LL_FEAT_CTE_AOA (0x0000000400000)
#define BLE_LL_FEAT_CTE_RECV (0x0000000800000)
#define BLE_LL_FEAT_SYNC_TRANS_SEND (0x0000001000000)
#define BLE_LL_FEAT_SYNC_TRANS_RECV (0x0000002000000)
#define BLE_LL_FEAT_SCA_UPDATE (0x0000004000000)
#define BLE_LL_FEAT_REM_PKEY (0x0000008000000)
#define BLE_LL_FEAT_CIS_CENTRAL (0x0000010000000)
#define BLE_LL_FEAT_CIS_PERIPH (0x0000020000000)
#define BLE_LL_FEAT_ISO_BROADCASTER (0x0000040000000)
#define BLE_LL_FEAT_SYNC_RECV (0x0000080000000)
#define BLE_LL_FEAT_CIS_HOST (0x0000100000000)
#define BLE_LL_FEAT_POWER_CTRL_REQ (0x0000200000000)
#define BLE_LL_FEAT_POWER_CHANGE_IND (0x0000400000000)
#define BLE_LL_FEAT_PATH_LOSS_MON (0x0000800000000)
#define BLE_LL_FEAT_PERIODIC_ADV_ADI (0x0001000000000)
#define BLE_LL_FEAT_CONN_SUBRATING (0x0002000000000)
#define BLE_LL_FEAT_CONN_SUBRATING_HOST (0x0004000000000)
#define BLE_LL_FEAT_CHANNEL_CLASS (0x0008000000000)
#define BLE_LL_FEAT_CS (0x0400000000000)
#define BLE_LL_FEAT_CS_HOST_SUPPORT (0x0800000000000)
#define BLE_LL_FEAT_CS_PCT_QUALITY_IND (0x1000000000000)

/* This is initial mask, so if feature exchange will not happen,
* but host will want to use this procedure, we will try. If not
Expand Down
51 changes: 51 additions & 0 deletions nimble/controller/include/controller/ble_ll_cs.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

/* All Channel Sounding APIs are experimental and subject to change at any time */

#ifndef H_BLE_LL_CS
#define H_BLE_LL_CS

#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

/* HCI handlers */
int ble_ll_cs_hci_rd_loc_supp_cap(uint8_t *rspbuf, uint8_t *rsplen);
int ble_ll_cs_hci_rd_rem_supp_cap(const uint8_t *cmdbuf, uint8_t cmdlen);
int ble_ll_cs_hci_wr_cached_rem_supp_cap(const uint8_t *cmdbuf, uint8_t cmdlen, uint8_t *rspbuf, uint8_t *rsplen);
int ble_ll_cs_hci_sec_enable(const uint8_t *cmdbuf, uint8_t cmdlen);
int ble_ll_cs_hci_set_def_settings(const uint8_t *cmdbuf, uint8_t cmdlen, uint8_t *rspbuf, uint8_t *rsplen);
int ble_ll_cs_hci_rd_rem_fae(const uint8_t *cmdbuf, uint8_t cmdlen);
int ble_ll_cs_hci_wr_cached_rem_fae(const uint8_t *cmdbuf, uint8_t cmdlen, uint8_t *rspbuf, uint8_t *rsplen);
int ble_ll_cs_hci_create_config(const uint8_t *cmdbuf, uint8_t cmdlen);
int ble_ll_cs_hci_remove_config(const uint8_t *cmdbuf, uint8_t cmdlen);
int ble_ll_cs_hci_set_chan_class(const uint8_t *cmdbuf, uint8_t cmdlen);
int ble_ll_cs_hci_set_proc_params(const uint8_t *cmdbuf, uint8_t cmdlen, uint8_t *rspbuf, uint8_t *rsplen);
int ble_ll_cs_hci_proc_enable(const uint8_t *cmdbuf, uint8_t cmdlen);
int ble_ll_cs_hci_test(const uint8_t *cmdbuf, uint8_t cmdlen, uint8_t *rspbuf, uint8_t *rsplen);
int ble_ll_cs_hci_test_end(void);

#ifdef __cplusplus
}
#endif

#endif
5 changes: 5 additions & 0 deletions nimble/controller/src/ble_ll.c
Original file line number Diff line number Diff line change
Expand Up @@ -1930,6 +1930,11 @@ ble_ll_init(void)
features |= BLE_LL_FEAT_CONN_SUBRATING;
#endif

#if MYNEWT_VAL(BLE_LL_CHANNEL_SOUNDING)
features |= BLE_LL_FEAT_CS;
features |= BLE_LL_FEAT_CS_PCT_QUALITY_IND;
#endif

lldata->ll_supp_features = features;

/* Initialize random number generation */
Expand Down
119 changes: 119 additions & 0 deletions nimble/controller/src/ble_ll_cs.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

#include <syscfg/syscfg.h>
#if MYNEWT_VAL(BLE_LL_CHANNEL_SOUNDING)
#include <stdint.h>
#include "nimble/hci_common.h"
#include "controller/ble_ll_utils.h"
#include "controller/ble_ll.h"
#include "controller/ble_ll_conn.h"
#include "controller/ble_ll_hci.h"
#include "controller/ble_ll_cs.h"

int
ble_ll_cs_hci_rd_loc_supp_cap(uint8_t *rspbuf, uint8_t *rsplen)
{
return BLE_ERR_UNSUPPORTED;
}

int
ble_ll_cs_hci_rd_rem_supp_cap(const uint8_t *cmdbuf, uint8_t cmdlen)
{
return BLE_ERR_UNSUPPORTED;
}

int
ble_ll_cs_hci_wr_cached_rem_supp_cap(const uint8_t *cmdbuf, uint8_t cmdlen,
uint8_t *rspbuf, uint8_t *rsplen)
{
return BLE_ERR_UNSUPPORTED;
}

int
ble_ll_cs_hci_sec_enable(const uint8_t *cmdbuf, uint8_t cmdlen)
{
return BLE_ERR_UNSUPPORTED;
}

int
ble_ll_cs_hci_set_def_settings(const uint8_t *cmdbuf, uint8_t cmdlen,
uint8_t *rspbuf, uint8_t *rsplen)
{
return BLE_ERR_UNSUPPORTED;
}

int
ble_ll_cs_hci_rd_rem_fae(const uint8_t *cmdbuf, uint8_t cmdlen)
{
return BLE_ERR_UNSUPPORTED;
}

int
ble_ll_cs_hci_wr_cached_rem_fae(const uint8_t *cmdbuf, uint8_t cmdlen,
uint8_t *rspbuf, uint8_t *rsplen)
{
return BLE_ERR_UNSUPPORTED;
}

int
ble_ll_cs_hci_create_config(const uint8_t *cmdbuf, uint8_t cmdlen)
{
return BLE_ERR_UNSUPPORTED;
}

int
ble_ll_cs_hci_remove_config(const uint8_t *cmdbuf, uint8_t cmdlen)
{
return BLE_ERR_UNSUPPORTED;
}

int
ble_ll_cs_hci_set_chan_class(const uint8_t *cmdbuf, uint8_t cmdlen)
{
return BLE_ERR_UNSUPPORTED;
}

int
ble_ll_cs_hci_set_proc_params(const uint8_t *cmdbuf, uint8_t cmdlen,
uint8_t *rspbuf, uint8_t *rsplen)
{
return BLE_ERR_UNSUPPORTED;
}

int
ble_ll_cs_hci_proc_enable(const uint8_t *cmdbuf, uint8_t cmdlen)
{
return BLE_ERR_UNSUPPORTED;
}

int
ble_ll_cs_hci_test(const uint8_t *cmdbuf, uint8_t cmdlen,
uint8_t *rspbuf, uint8_t *rsplen)
{
return BLE_ERR_UNSUPPORTED;
}

int
ble_ll_cs_hci_test_end(void)
{
return BLE_ERR_UNSUPPORTED;
}

#endif /* BLE_LL_CHANNEL_SOUNDING */
47 changes: 47 additions & 0 deletions nimble/controller/src/ble_ll_hci.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include "controller/ble_ll_isoal.h"
#include "controller/ble_ll_iso.h"
#include "controller/ble_ll_iso_big.h"
#include "controller/ble_ll_cs.h"
#include "ble_ll_priv.h"
#include "ble_ll_conn_priv.h"
#include "ble_ll_hci_priv.h"
Expand Down Expand Up @@ -1315,6 +1316,52 @@ ble_ll_hci_le_cmd_proc(const uint8_t *cmdbuf, uint8_t len, uint16_t ocf,
case BLE_HCI_OCF_LE_SUBRATE_REQ:
rc = ble_ll_conn_hci_subrate_req(cmdbuf, len, rspbuf, rsplen);
break;
#endif
#if MYNEWT_VAL(BLE_LL_CHANNEL_SOUNDING)
case BLE_HCI_OCF_LE_CS_RD_LOC_SUPP_CAP:
rc = ble_ll_cs_hci_rd_loc_supp_cap(rspbuf, rsplen);
break;
case BLE_HCI_OCF_LE_CS_RD_REM_SUPP_CAP:
rc = ble_ll_cs_hci_rd_rem_supp_cap(cmdbuf, len);
break;
case BLE_HCI_OCF_LE_CS_WR_CACHED_REM_SUPP_CAP:
rc = ble_ll_cs_hci_wr_cached_rem_supp_cap(cmdbuf, len, rspbuf, rsplen);
break;
#if MYNEWT_VAL(BLE_LL_ROLE_CENTRAL)
case BLE_HCI_OCF_LE_CS_SEC_ENABLE:
rc = ble_ll_cs_hci_sec_enable(cmdbuf, len);
break;
#endif
case BLE_HCI_OCF_LE_CS_SET_DEF_SETTINGS:
rc = ble_ll_cs_hci_set_def_settings(cmdbuf, len, rspbuf, rsplen);
break;
case BLE_HCI_OCF_LE_CS_RD_REM_FAE:
rc = ble_ll_cs_hci_rd_rem_fae(cmdbuf, len);
break;
case BLE_HCI_OCF_LE_CS_WR_CACHED_REM_FAE:
rc = ble_ll_cs_hci_wr_cached_rem_fae(cmdbuf, len, rspbuf, rsplen);
break;
case BLE_HCI_OCF_LE_CS_CREATE_CONFIG:
rc = ble_ll_cs_hci_create_config(cmdbuf, len);
break;
case BLE_HCI_OCF_LE_CS_REMOVE_CONFIG:
rc = ble_ll_cs_hci_remove_config(cmdbuf, len);
break;
case BLE_HCI_OCF_LE_CS_SET_CHAN_CLASS:
rc = ble_ll_cs_hci_set_chan_class(cmdbuf, len);
break;
case BLE_HCI_OCF_LE_CS_SET_PROC_PARAMS:
rc = ble_ll_cs_hci_set_proc_params(cmdbuf, len, rspbuf, rsplen);
break;
case BLE_HCI_OCF_LE_CS_PROC_ENABLE:
rc = ble_ll_cs_hci_proc_enable(cmdbuf, len);
break;
case BLE_HCI_OCF_LE_CS_TEST:
rc = ble_ll_cs_hci_test(cmdbuf, len, rspbuf, rsplen);
break;
case BLE_HCI_OCF_LE_CS_TEST_END:
rc = ble_ll_cs_hci_test_end();
break;
#endif
default:
rc = BLE_ERR_UNKNOWN_HCI_CMD;
Expand Down
8 changes: 8 additions & 0 deletions nimble/controller/syscfg.yml
Original file line number Diff line number Diff line change
Expand Up @@ -516,6 +516,14 @@ syscfg.defs:
value: 0
experimental: 1

BLE_LL_CHANNEL_SOUNDING:
description: >
Enable support for Channel Sounding feature.
restrictions:
- (BLE_VERSION >= 54) if 1
value: MYNEWT_VAL(BLE_CHANNEL_SOUNDING)
state: experimental

BLE_LL_SYSINIT_STAGE:
description: >
Sysinit stage for the NimBLE controller.
Expand Down

0 comments on commit f639326

Please sign in to comment.