summaryrefslogtreecommitdiff
path: root/src/libs/mynewt-nimble/nimble/controller/include
diff options
context:
space:
mode:
authorJF <jf@codingfield.com>2020-04-26 10:25:59 +0200
committerJF <jf@codingfield.com>2020-04-26 10:25:59 +0200
commitbdc10744fb338ae197692713a0b48a7ccc36f566 (patch)
treeaf7a8f2f16ddd2e5483758effec15c7683f6c453 /src/libs/mynewt-nimble/nimble/controller/include
parent032fad094c6411ad3ff4321ad61ceed95d7dc4ff (diff)
Add Nimble in libs directory
Diffstat (limited to 'src/libs/mynewt-nimble/nimble/controller/include')
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_hw.h116
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll.h587
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_adv.h209
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_conn.h425
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_ctrl.h313
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_hci.h75
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_resolv.h116
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_rfmgmt.h63
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_scan.h293
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_sched.h216
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_sync.h74
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_test.h35
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_trace.h96
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_utils.h29
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_whitelist.h52
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_phy.h242
-rw-r--r--src/libs/mynewt-nimble/nimble/controller/include/controller/ble_phy_trace.h96
17 files changed, 3037 insertions, 0 deletions
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_hw.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_hw.h
new file mode 100644
index 00000000..cf293076
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_hw.h
@@ -0,0 +1,116 @@
+/*
+ * 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.
+ */
+
+#ifndef H_BLE_HW_
+#define H_BLE_HW_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "syscfg/syscfg.h"
+
+#if defined(ARCH_sim)
+#define BLE_USES_HW_WHITELIST (0)
+#else
+#define BLE_USES_HW_WHITELIST MYNEWT_VAL(BLE_HW_WHITELIST_ENABLE)
+#endif
+
+/* Returns the number of hw whitelist elements */
+uint8_t ble_hw_whitelist_size(void);
+
+/* Clear the whitelist */
+void ble_hw_whitelist_clear(void);
+
+/* Remove a device from the hw whitelist */
+void ble_hw_whitelist_rmv(const uint8_t *addr, uint8_t addr_type);
+
+/* Add a device to the hw whitelist */
+int ble_hw_whitelist_add(const uint8_t *addr, uint8_t addr_type);
+
+/* Enable hw whitelisting */
+void ble_hw_whitelist_enable(void);
+
+/* Enable hw whitelisting */
+void ble_hw_whitelist_disable(void);
+
+/* Boolean function returning true if address matches a whitelist entry */
+int ble_hw_whitelist_match(void);
+
+/* Encrypt data */
+struct ble_encryption_block;
+int ble_hw_encrypt_block(struct ble_encryption_block *ecb);
+
+/* Random number generation */
+typedef void (*ble_rng_isr_cb_t)(uint8_t rnum);
+int ble_hw_rng_init(ble_rng_isr_cb_t cb, int bias);
+
+/**
+ * Start the random number generator
+ *
+ * @return int
+ */
+int ble_hw_rng_start(void);
+
+/**
+ * Stop the random generator
+ *
+ * @return int
+ */
+int ble_hw_rng_stop(void);
+
+/**
+ * Read the random number generator.
+ *
+ * @return uint8_t
+ */
+uint8_t ble_hw_rng_read(void);
+
+/* Clear the resolving list*/
+void ble_hw_resolv_list_clear(void);
+
+/* Add a device to the hw resolving list */
+int ble_hw_resolv_list_add(uint8_t *irk);
+
+/* Remove a device from the hw resolving list */
+void ble_hw_resolv_list_rmv(int index);
+
+/* Returns the size of the whitelist in HW */
+uint8_t ble_hw_resolv_list_size(void);
+
+/* Enable the resolving list */
+void ble_hw_resolv_list_enable(void);
+
+/* Disables resolving list devices */
+void ble_hw_resolv_list_disable(void);
+
+/* Returns index of resolved address; -1 if not resolved */
+int ble_hw_resolv_list_match(void);
+
+/* Returns public device address or -1 if not present */
+int ble_hw_get_public_addr(ble_addr_t *addr);
+
+/* Returns random static address or -1 if not present */
+int ble_hw_get_static_addr(ble_addr_t *addr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_BLE_HW_ */
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll.h
new file mode 100644
index 00000000..e515fb98
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll.h
@@ -0,0 +1,587 @@
+/*
+ * 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.
+ */
+
+#ifndef H_BLE_LL_
+#define H_BLE_LL_
+
+#include "stats/stats.h"
+#include "os/os_cputime.h"
+#include "nimble/nimble_opt.h"
+#include "nimble/nimble_npl.h"
+#include "controller/ble_phy.h"
+
+#ifdef MYNEWT
+#include "controller/ble_ll_ctrl.h"
+#include "hal/hal_system.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if MYNEWT_VAL(OS_CPUTIME_FREQ) != 32768
+#error 32.768kHz clock required
+#endif
+
+#if defined(MYNEWT) && MYNEWT_VAL(BLE_LL_VND_EVENT_ON_ASSERT)
+#ifdef NDEBUG
+#define BLE_LL_ASSERT(cond) (void(0))
+#else
+#define BLE_LL_ASSERT(cond) \
+ if (!(cond)) { \
+ if (hal_debugger_connected()) { \
+ assert(0);\
+ } else {\
+ ble_ll_hci_ev_send_vendor_err(__FILE__, __LINE__); \
+ while(1) {}\
+ }\
+ }
+#endif
+#else
+#define BLE_LL_ASSERT(cond) assert(cond)
+#endif
+
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) || MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY)
+#define BLE_LL_BT5_PHY_SUPPORTED (1)
+#else
+#define BLE_LL_BT5_PHY_SUPPORTED (0)
+#endif
+
+/* Controller revision. */
+#define BLE_LL_SUB_VERS_NR (0x0000)
+
+/* Timing jitter as per spec is +/16 usecs */
+#define BLE_LL_JITTER_USECS (16)
+
+/* Packet queue header definition */
+STAILQ_HEAD(ble_ll_pkt_q, os_mbuf_pkthdr);
+
+/*
+ * Global Link Layer data object. There is only one Link Layer data object
+ * per controller although there may be many instances of the link layer state
+ * machine running.
+ */
+struct ble_ll_obj
+{
+ /* Supported features */
+ uint64_t ll_supp_features;
+
+ /* Current Link Layer state */
+ uint8_t ll_state;
+
+ /* Number of ACL data packets supported */
+ uint8_t ll_num_acl_pkts;
+
+ /* ACL data packet size */
+ uint16_t ll_acl_pkt_size;
+
+ /* Preferred PHY's */
+ uint8_t ll_pref_tx_phys;
+ uint8_t ll_pref_rx_phys;
+
+ /* Task event queue */
+ struct ble_npl_eventq ll_evq;
+
+ /* Wait for response timer */
+ struct hal_timer ll_wfr_timer;
+
+ /* Packet receive queue (and event). Holds received packets from PHY */
+ struct ble_npl_event ll_rx_pkt_ev;
+ struct ble_ll_pkt_q ll_rx_pkt_q;
+
+ /* Packet transmit queue */
+ struct ble_npl_event ll_tx_pkt_ev;
+ struct ble_ll_pkt_q ll_tx_pkt_q;
+
+ /* Data buffer overflow event */
+ struct ble_npl_event ll_dbuf_overflow_ev;
+
+ /* Number of completed packets event */
+ struct ble_npl_event ll_comp_pkt_ev;
+
+ /* HW error callout */
+ struct ble_npl_callout ll_hw_err_timer;
+};
+extern struct ble_ll_obj g_ble_ll_data;
+
+/* Link layer statistics */
+STATS_SECT_START(ble_ll_stats)
+ STATS_SECT_ENTRY(hci_cmds)
+ STATS_SECT_ENTRY(hci_cmd_errs)
+ STATS_SECT_ENTRY(hci_events_sent)
+ STATS_SECT_ENTRY(bad_ll_state)
+ STATS_SECT_ENTRY(bad_acl_hdr)
+ STATS_SECT_ENTRY(no_bufs)
+ STATS_SECT_ENTRY(rx_adv_pdu_crc_ok)
+ STATS_SECT_ENTRY(rx_adv_pdu_crc_err)
+ STATS_SECT_ENTRY(rx_adv_bytes_crc_ok)
+ STATS_SECT_ENTRY(rx_adv_bytes_crc_err)
+ STATS_SECT_ENTRY(rx_data_pdu_crc_ok)
+ STATS_SECT_ENTRY(rx_data_pdu_crc_err)
+ STATS_SECT_ENTRY(rx_data_bytes_crc_ok)
+ STATS_SECT_ENTRY(rx_data_bytes_crc_err)
+ STATS_SECT_ENTRY(rx_adv_malformed_pkts)
+ STATS_SECT_ENTRY(rx_adv_ind)
+ STATS_SECT_ENTRY(rx_adv_direct_ind)
+ STATS_SECT_ENTRY(rx_adv_nonconn_ind)
+ STATS_SECT_ENTRY(rx_adv_ext_ind)
+ STATS_SECT_ENTRY(rx_scan_reqs)
+ STATS_SECT_ENTRY(rx_scan_rsps)
+ STATS_SECT_ENTRY(rx_connect_reqs)
+ STATS_SECT_ENTRY(rx_scan_ind)
+ STATS_SECT_ENTRY(rx_aux_connect_rsp)
+ STATS_SECT_ENTRY(adv_txg)
+ STATS_SECT_ENTRY(adv_late_starts)
+ STATS_SECT_ENTRY(adv_resched_pdu_fail)
+ STATS_SECT_ENTRY(adv_drop_event)
+ STATS_SECT_ENTRY(sched_state_conn_errs)
+ STATS_SECT_ENTRY(sched_state_adv_errs)
+ STATS_SECT_ENTRY(scan_starts)
+ STATS_SECT_ENTRY(scan_stops)
+ STATS_SECT_ENTRY(scan_req_txf)
+ STATS_SECT_ENTRY(scan_req_txg)
+ STATS_SECT_ENTRY(scan_rsp_txg)
+ STATS_SECT_ENTRY(aux_missed_adv)
+ STATS_SECT_ENTRY(aux_scheduled)
+ STATS_SECT_ENTRY(aux_received)
+ STATS_SECT_ENTRY(aux_fired_for_read)
+ STATS_SECT_ENTRY(aux_allocated)
+ STATS_SECT_ENTRY(aux_freed)
+ STATS_SECT_ENTRY(aux_sched_cb)
+ STATS_SECT_ENTRY(aux_conn_req_tx)
+ STATS_SECT_ENTRY(aux_conn_rsp_tx)
+ STATS_SECT_ENTRY(aux_conn_rsp_err)
+ STATS_SECT_ENTRY(aux_scan_req_tx)
+ STATS_SECT_ENTRY(aux_scan_rsp_err)
+ STATS_SECT_ENTRY(aux_chain_cnt)
+ STATS_SECT_ENTRY(aux_chain_err)
+ STATS_SECT_ENTRY(aux_scan_drop)
+ STATS_SECT_ENTRY(adv_evt_dropped)
+ STATS_SECT_ENTRY(scan_timer_stopped)
+ STATS_SECT_ENTRY(scan_timer_restarted)
+ STATS_SECT_ENTRY(periodic_adv_drop_event)
+ STATS_SECT_ENTRY(periodic_chain_drop_event)
+ STATS_SECT_ENTRY(sync_event_failed)
+ STATS_SECT_ENTRY(sync_received)
+ STATS_SECT_ENTRY(sync_chain_failed)
+ STATS_SECT_ENTRY(sync_missed_err)
+ STATS_SECT_ENTRY(sync_crc_err)
+ STATS_SECT_ENTRY(sync_rx_buf_err)
+ STATS_SECT_ENTRY(sync_scheduled)
+ STATS_SECT_ENTRY(sched_state_sync_errs)
+ STATS_SECT_ENTRY(sched_invalid_pdu)
+STATS_SECT_END
+extern STATS_SECT_DECL(ble_ll_stats) ble_ll_stats;
+
+/* States */
+#define BLE_LL_STATE_STANDBY (0)
+#define BLE_LL_STATE_ADV (1)
+#define BLE_LL_STATE_SCANNING (2)
+#define BLE_LL_STATE_INITIATING (3)
+#define BLE_LL_STATE_CONNECTION (4)
+#define BLE_LL_STATE_DTM (5)
+#define BLE_LL_STATE_SYNC (6)
+
+/* 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_SLAVE_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_MASTER (0x0010000000)
+#define BLE_LL_FEAT_CIS_SLAVE (0x0020000000)
+#define BLE_LL_FEAT_ISO_BROADCASTER (0x0040000000)
+#define BLE_LL_FEAT_SYNC_RECV (0x0080000000)
+#define BLE_LL_FEAT_ISO_HOST_SUPPORT (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)
+
+/* This is initial mask, so if feature exchange will not happen,
+ * but host will want to use this procedure, we will try. If not
+ * succeed, feature bit will be cleared.
+ * Look at LL Features above to find out what is allowed
+ */
+#define BLE_LL_CONN_INITIAL_FEATURES (0x00000022)
+#define BLE_LL_CONN_CLEAR_FEATURE(connsm, feature) (connsm->conn_features &= ~(feature))
+
+/* All the features which can be controlled by the Host */
+#define BLE_LL_HOST_CONTROLLED_FEATURES (BLE_LL_FEAT_ISO_HOST_SUPPORT)
+
+/* LL timing */
+#define BLE_LL_IFS (150) /* usecs */
+#define BLE_LL_MAFS (300) /* usecs */
+
+/*
+ * BLE LL device address. Note that element 0 of the array is the LSB and
+ * is sent over the air first. Byte 5 is the MSB and is the last one sent over
+ * the air.
+ */
+#define BLE_DEV_ADDR_LEN (6) /* bytes */
+
+struct ble_dev_addr
+{
+ uint8_t u8[BLE_DEV_ADDR_LEN];
+};
+
+#define BLE_IS_DEV_ADDR_STATIC(addr) ((addr->u8[5] & 0xc0) == 0xc0)
+#define BLE_IS_DEV_ADDR_RESOLVABLE(addr) ((addr->u8[5] & 0xc0) == 0x40)
+#define BLE_IS_DEV_ADDR_UNRESOLVABLE(addr) ((addr->u8[5] & 0xc0) == 0x00)
+
+/*
+ * LL packet format
+ *
+ * -> Preamble (1/2 bytes)
+ * -> Access Address (4 bytes)
+ * -> PDU (2 to 257 octets)
+ * -> CRC (3 bytes)
+ */
+#define BLE_LL_PREAMBLE_LEN (1)
+#define BLE_LL_ACC_ADDR_LEN (4)
+#define BLE_LL_CRC_LEN (3)
+#define BLE_LL_PDU_HDR_LEN (2)
+#define BLE_LL_MAX_PAYLOAD_LEN (255)
+#define BLE_LL_MIN_PDU_LEN (BLE_LL_PDU_HDR_LEN)
+#define BLE_LL_MAX_PDU_LEN ((BLE_LL_PDU_HDR_LEN) + (BLE_LL_MAX_PAYLOAD_LEN))
+#define BLE_LL_CRCINIT_ADV (0x555555)
+
+/* Access address for advertising channels */
+#define BLE_ACCESS_ADDR_ADV (0x8E89BED6)
+
+/*
+ * Advertising PDU format:
+ * -> 2 byte header
+ * -> LSB contains pdu type, txadd and rxadd bits.
+ * -> MSB contains length (6 bits). Length is length of payload. Does
+ * not include the header length itself.
+ * -> Payload (max 37 bytes)
+ */
+#define BLE_ADV_PDU_HDR_TYPE_MASK (0x0F)
+#define BLE_ADV_PDU_HDR_CHSEL_MASK (0x20)
+#define BLE_ADV_PDU_HDR_TXADD_MASK (0x40)
+#define BLE_ADV_PDU_HDR_RXADD_MASK (0x80)
+
+/* Advertising channel PDU types */
+#define BLE_ADV_PDU_TYPE_ADV_IND (0)
+#define BLE_ADV_PDU_TYPE_ADV_DIRECT_IND (1)
+#define BLE_ADV_PDU_TYPE_ADV_NONCONN_IND (2)
+#define BLE_ADV_PDU_TYPE_SCAN_REQ (3)
+#define BLE_ADV_PDU_TYPE_SCAN_RSP (4)
+#define BLE_ADV_PDU_TYPE_CONNECT_IND (5)
+#define BLE_ADV_PDU_TYPE_ADV_SCAN_IND (6)
+#define BLE_ADV_PDU_TYPE_ADV_EXT_IND (7)
+#define BLE_ADV_PDU_TYPE_AUX_ADV_IND BLE_ADV_PDU_TYPE_ADV_EXT_IND
+#define BLE_ADV_PDU_TYPE_AUX_SCAN_RSP BLE_ADV_PDU_TYPE_ADV_EXT_IND
+#define BLE_ADV_PDU_TYPE_AUX_SYNC_IND BLE_ADV_PDU_TYPE_ADV_EXT_IND
+#define BLE_ADV_PDU_TYPE_AUX_CHAIN_IND BLE_ADV_PDU_TYPE_ADV_EXT_IND
+#define BLE_ADV_PDU_TYPE_AUX_CONNECT_REQ BLE_ADV_PDU_TYPE_CONNECT_IND
+#define BLE_ADV_PDU_TYPE_AUX_SCAN_REQ BLE_ADV_PDU_TYPE_SCAN_REQ
+#define BLE_ADV_PDU_TYPE_AUX_CONNECT_RSP (8)
+
+/* Extended Header Length (6b) + AdvMode (2b) */
+#define BLE_LL_EXT_ADV_HDR_LEN (1)
+
+#define BLE_LL_EXT_ADV_ADVA_BIT (0)
+#define BLE_LL_EXT_ADV_TARGETA_BIT (1)
+#define BLE_LL_EXT_ADV_CTE_INFO_BIT (2)
+#define BLE_LL_EXT_ADV_DATA_INFO_BIT (3)
+#define BLE_LL_EXT_ADV_AUX_PTR_BIT (4)
+#define BLE_LL_EXT_ADV_SYNC_INFO_BIT (5)
+#define BLE_LL_EXT_ADV_TX_POWER_BIT (6)
+
+#define BLE_LL_EXT_ADV_FLAGS_SIZE (1)
+#define BLE_LL_EXT_ADV_ADVA_SIZE (6)
+#define BLE_LL_EXT_ADV_TARGETA_SIZE (6)
+#define BLE_LL_EXT_ADV_DATA_INFO_SIZE (2)
+#define BLE_LL_EXT_ADV_AUX_PTR_SIZE (3)
+#define BLE_LL_EXT_ADV_SYNC_INFO_SIZE (18)
+#define BLE_LL_EXT_ADV_TX_POWER_SIZE (1)
+
+#define BLE_LL_EXT_ADV_MODE_NON_CONN (0x00)
+#define BLE_LL_EXT_ADV_MODE_CONN (0x01)
+#define BLE_LL_EXT_ADV_MODE_SCAN (0x02)
+
+/* If Channel Selection Algorithm #2 is supported */
+#define BLE_ADV_PDU_HDR_CHSEL (0x20)
+
+/*
+ * TxAdd and RxAdd bit definitions. A 0 is a public address; a 1 is a
+ * random address.
+ */
+#define BLE_ADV_PDU_HDR_TXADD_RAND (0x40)
+#define BLE_ADV_PDU_HDR_RXADD_RAND (0x80)
+
+/*
+ * Data Channel format
+ *
+ * -> Header (2 bytes)
+ * -> LSB contains llid, nesn, sn and md
+ * -> MSB contains length (8 bits)
+ * -> Payload (0 to 251)
+ * -> MIC (0 or 4 bytes)
+ */
+#define BLE_LL_DATA_HDR_LLID_MASK (0x03)
+#define BLE_LL_DATA_HDR_NESN_MASK (0x04)
+#define BLE_LL_DATA_HDR_SN_MASK (0x08)
+#define BLE_LL_DATA_HDR_MD_MASK (0x10)
+#define BLE_LL_DATA_HDR_RSRVD_MASK (0xE0)
+#define BLE_LL_DATA_PDU_MAX_PYLD (251)
+#define BLE_LL_DATA_MIC_LEN (4)
+
+/* LLID definitions */
+#define BLE_LL_LLID_RSRVD (0)
+#define BLE_LL_LLID_DATA_FRAG (1)
+#define BLE_LL_LLID_DATA_START (2)
+#define BLE_LL_LLID_CTRL (3)
+
+/*
+ * CONNECT_REQ
+ * -> InitA (6 bytes)
+ * -> AdvA (6 bytes)
+ * -> LLData (22 bytes)
+ * -> Access address (4 bytes)
+ * -> CRC init (3 bytes)
+ * -> WinSize (1 byte)
+ * -> WinOffset (2 bytes)
+ * -> Interval (2 bytes)
+ * -> Latency (2 bytes)
+ * -> Timeout (2 bytes)
+ * -> Channel Map (5 bytes)
+ * -> Hop Increment (5 bits)
+ * -> SCA (3 bits)
+ *
+ * InitA is the initiators public (TxAdd=0) or random (TxAdd=1) address.
+ * AdvaA is the advertisers public (RxAdd=0) or random (RxAdd=1) address.
+ * LLData contains connection request data.
+ * aa: Link Layer's access address
+ * crc_init: The CRC initialization value used for CRC calculation.
+ * winsize: The transmit window size = winsize * 1.25 msecs
+ * winoffset: The transmit window offset = winoffset * 1.25 msecs
+ * interval: The connection interval = interval * 1.25 msecs.
+ * latency: connection slave latency = latency
+ * timeout: Connection supervision timeout = timeout * 10 msecs.
+ * chanmap: contains channel mapping indicating used and unused data
+ * channels. Only bits that are 1 are usable. LSB is channel 0.
+ * hop_inc: Hop increment used for frequency hopping. Random value in
+ * range of 5 to 16.
+ */
+#define BLE_CONNECT_REQ_LEN (34)
+#define BLE_CONNECT_REQ_PDU_LEN (BLE_CONNECT_REQ_LEN + BLE_LL_PDU_HDR_LEN)
+
+#define BLE_SCAN_REQ_LEN (12)
+#define BLE_SCAN_RSP_MAX_LEN (37)
+#define BLE_SCAN_RSP_MAX_EXT_LEN (251)
+
+#define BLE_LL_ADDR_SUBTYPE_IDENTITY (0)
+#define BLE_LL_ADDR_SUBTYPE_RPA (1)
+#define BLE_LL_ADDR_SUBTYPE_NRPA (2)
+
+/*--- External API ---*/
+/* Initialize the Link Layer */
+void ble_ll_init(void);
+
+/* Reset the Link Layer */
+int ble_ll_reset(void);
+
+int ble_ll_is_valid_public_addr(const uint8_t *addr);
+
+/* 'Boolean' function returning true if address is a valid random address */
+int ble_ll_is_valid_random_addr(const uint8_t *addr);
+
+/*
+ * Check if given own_addr_type is valid for current controller configuration
+ * given the random address provided (when applicable)
+ */
+int ble_ll_is_valid_own_addr_type(uint8_t own_addr_type,
+ const uint8_t *random_addr);
+
+/* Calculate the amount of time in microseconds a PDU with payload length of
+ * 'payload_len' will take to transmit on a PHY 'phy_mode'. */
+uint32_t ble_ll_pdu_tx_time_get(uint16_t payload_len, int phy_mode);
+
+/* Calculate maximum octets of PDU payload which can be transmitted during
+ * 'usecs' on a PHY 'phy_mode'. */
+uint16_t ble_ll_pdu_max_tx_octets_get(uint32_t usecs, int phy_mode);
+
+/* Is this address a resolvable private address? */
+int ble_ll_is_rpa(const uint8_t *addr, uint8_t addr_type);
+
+int ble_ll_addr_subtype(const uint8_t *addr, uint8_t addr_type);
+
+/* Is this address an identity address? */
+int ble_ll_addr_is_id(uint8_t *addr, uint8_t addr_type);
+
+/* Is 'addr' our device address? 'addr_type' is public (0) or random (!=0) */
+int ble_ll_is_our_devaddr(uint8_t *addr, int addr_type);
+
+/* Get identity address 'addr_type' is public (0) or random (!=0) */
+uint8_t *ble_ll_get_our_devaddr(uint8_t addr_type);
+
+/**
+ * Called to put a packet on the Link Layer transmit packet queue.
+ *
+ * @param txpdu Pointer to transmit packet
+ */
+void ble_ll_acl_data_in(struct os_mbuf *txpkt);
+
+/**
+ * Allocates mbuf for received PDU
+ *
+ * This allocated mbuf (may be chained if necessary) that has capacity large
+ * enough to store received PDU of given length. It does not set mbufs length
+ * as this has to be done by PHY when copying data.
+ *
+ * @param len Length of PDU, including PDU header and excluding MIC (if encrypted)
+ *
+ * @return mbuf large enough to store received PDU on success
+ * NULL on failure (oom)
+ */
+struct os_mbuf *ble_ll_rxpdu_alloc(uint16_t len);
+
+/* Tell the Link Layer there has been a data buffer overflow */
+void ble_ll_data_buffer_overflow(void);
+
+/* Tell the link layer there has been a hardware error */
+void ble_ll_hw_error(void);
+
+/*--- PHY interfaces ---*/
+struct ble_mbuf_hdr;
+
+/* Called by the PHY when a packet has started */
+int ble_ll_rx_start(uint8_t *rxbuf, uint8_t chan, struct ble_mbuf_hdr *hdr);
+
+/* Called by the PHY when a packet reception ends */
+int ble_ll_rx_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr);
+
+/* Helper callback to tx mbuf using ble_phy_tx() */
+uint8_t ble_ll_tx_mbuf_pducb(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte);
+uint8_t ble_ll_tx_flat_mbuf_pducb(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte);
+
+/*--- Controller API ---*/
+void ble_ll_mbuf_init(struct os_mbuf *m, uint8_t pdulen, uint8_t hdr);
+
+/* Set the link layer state */
+void ble_ll_state_set(uint8_t ll_state);
+
+/* Get the link layer state */
+uint8_t ble_ll_state_get(void);
+
+/* Send an event to LL task */
+void ble_ll_event_send(struct ble_npl_event *ev);
+
+/* Hand received pdu's to LL task */
+void ble_ll_rx_pdu_in(struct os_mbuf *rxpdu);
+
+/*
+ * Set public address
+ *
+ * This can be used to set controller public address from vendor specific storage,
+ * usually should be done in hal_bsp_init().
+ * Shall be *only* called before LL is initialized, i.e. before sysinit stage.
+ */
+int ble_ll_set_public_addr(const uint8_t *addr);
+
+/* Set random address */
+int ble_ll_set_random_addr(const uint8_t *cmdbuf, uint8_t len, bool hci_adv_ext);
+
+/* Wait for response timer expiration callback */
+void ble_ll_wfr_timer_exp(void *arg);
+
+/* Read set of features supported by the Link Layer */
+uint64_t ble_ll_read_supp_features(void);
+
+/* Set host supported features */
+int ble_ll_set_host_feat(const uint8_t *cmdbuf, uint8_t len);
+
+/* Read set of states supported by the Link Layer */
+uint64_t ble_ll_read_supp_states(void);
+
+/* Check if octets and time are valid. Returns 0 if not valid */
+int ble_ll_chk_txrx_octets(uint16_t octets);
+int ble_ll_chk_txrx_time(uint16_t time);
+
+/* Random numbers */
+int ble_ll_rand_init(void);
+void ble_ll_rand_sample(uint8_t rnum);
+int ble_ll_rand_data_get(uint8_t *buf, uint8_t len);
+void ble_ll_rand_prand_get(uint8_t *prand);
+int ble_ll_rand_start(void);
+
+// TODO added by JF, don't know why I need this?
+void ble_ll_task(void *arg);
+
+static inline int
+ble_ll_get_addr_type(uint8_t txrxflag)
+{
+ if (txrxflag) {
+ return BLE_HCI_ADV_OWN_ADDR_RANDOM;
+ }
+ return BLE_HCI_ADV_OWN_ADDR_PUBLIC;
+}
+
+/* Convert usecs to ticks and round up to nearest tick */
+static inline uint32_t
+ble_ll_usecs_to_ticks_round_up(uint32_t usecs)
+{
+ return os_cputime_usecs_to_ticks(usecs + 30);
+}
+
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION)
+/* LTK 0x4C68384139F574D836BCF34E9DFB01BF */
+extern const uint8_t g_bletest_LTK[];
+extern uint16_t g_bletest_EDIV;
+extern uint64_t g_bletest_RAND;
+extern uint64_t g_bletest_SKDm;
+extern uint64_t g_bletest_SKDs;
+extern uint32_t g_bletest_IVm;
+extern uint32_t g_bletest_IVs;
+#endif
+
+#if MYNEWT_VAL(BLE_LL_DTM)
+void ble_ll_dtm_init(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_LL_ */
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_adv.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_adv.h
new file mode 100644
index 00000000..4afaadd0
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_adv.h
@@ -0,0 +1,209 @@
+/*
+ * 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.
+ */
+
+#ifndef H_BLE_LL_ADV_
+#define H_BLE_LL_ADV_
+
+#include "syscfg/syscfg.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * ADV event timing
+ * T_advEvent = advInterval + advDelay
+ *
+ * advInterval: increments of 625 usecs
+ * advDelay: RAND[0, 10] msecs
+ *
+ */
+#define BLE_LL_ADV_ITVL (625) /* usecs */
+#define BLE_LL_ADV_ITVL_MIN (32) /* units */
+#define BLE_LL_ADV_ITVL_MAX (16384) /* units */
+#define BLE_LL_ADV_ITVL_MS_MIN (20) /* msecs */
+#define BLE_LL_ADV_ITVL_MS_MAX (10240) /* msecs */
+#define BLE_LL_ADV_ITVL_SCAN_MIN (160) /* units */
+#define BLE_LL_ADV_ITVL_SCAN_MS_MIN (100) /* msecs */
+#define BLE_LL_ADV_ITVL_NONCONN_MS_MIN (100) /* msecs */
+#define BLE_LL_ADV_DELAY_MS_MIN (0) /* msecs */
+#define BLE_LL_ADV_DELAY_MS_MAX (10) /* msecs */
+#define BLE_LL_ADV_PDU_ITVL_LD_MS_MAX (10) /* msecs */
+#define BLE_LL_ADV_PDU_ITVL_HD_MS_MAX (3750) /* usecs */
+#define BLE_LL_ADV_STATE_HD_MAX (1280) /* msecs */
+#define BLE_LL_ADV_PERIODIC_ITVL (1250) /* usecs */
+
+/* Maximum advertisement data length */
+#define BLE_ADV_LEGACY_DATA_MAX_LEN (31)
+#define BLE_ADV_LEGACY_MAX_PKT_LEN (37)
+
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
+#define BLE_ADV_DATA_MAX_LEN MYNEWT_VAL(BLE_EXT_ADV_MAX_SIZE)
+#else
+#define BLE_ADV_DATA_MAX_LEN BLE_ADV_LEGACY_DATA_MAX_LEN
+#endif
+
+/*
+ * ADV_IND
+ * -> AdvA (6 bytes)
+ * -> AdvData (0 - 31 bytes)
+ *
+ * The advertising address (AdvA) is a public address (TxAdd=0) or random
+ * address (TxAdd = 1)
+ */
+#define BLE_ADV_IND_MIN_LEN (6)
+#define BLE_ADV_IND_MAX_LEN (37)
+
+/*
+ * ADV_DIRECT_IND
+ * -> AdvA (6 bytes)
+ * -> InitA (6 bytes)
+ *
+ * AdvA is the advertisers public address (TxAdd=0) or random address
+ * (TxAdd = 1).
+ *
+ * InitA is the initiators public or random address. This is the address
+ * to which this packet is addressed.
+ *
+ */
+#define BLE_ADV_DIRECT_IND_LEN (12)
+
+/*
+ * ADV_NONCONN_IND
+ * -> AdvA (6 bytes)
+ * -> AdvData (0 - 31 bytes)
+ *
+ * The advertising address (AdvA) is a public address (TxAdd=0) or random
+ * address (TxAdd = 1)
+ *
+ */
+#define BLE_ADV_NONCONN_IND_MIN_LEN (6)
+#define BLE_ADV_NONCONN_IND_MAX_LEN (37)
+
+/*
+ * ADV_SCAN_IND
+ * -> AdvA (6 bytes)
+ * -> AdvData (0 - 31 bytes)
+ *
+ * The advertising address (AdvA) is a public address (TxAdd=0) or random
+ * address (TxAdd = 1)
+ *
+ */
+#define BLE_ADV_SCAN_IND_MIN_LEN (6)
+#define BLE_ADV_SCAN_IND_MAX_LEN (37)
+
+/*---- HCI ----*/
+struct ble_ll_adv_sm;
+struct ble_ll_conn_sm;
+
+/* Start an advertiser */
+int ble_ll_adv_start_req(uint8_t adv_chanmask, uint8_t adv_type,
+ uint8_t *init_addr, uint16_t adv_itvl, void *handle);
+
+/* Start or stop advertising */
+int ble_ll_hci_adv_set_enable(const uint8_t *cmdbuf, uint8_t len);
+
+/* Set legacy advertising data */
+int ble_ll_hci_set_adv_data(const uint8_t *cmdbuf, uint8_t len);
+
+/* Set scan response data */
+int ble_ll_hci_set_scan_rsp_data(const uint8_t *cmd, uint8_t cmd_len);
+
+/* Set advertising parameters */
+int ble_ll_adv_set_adv_params(const uint8_t *cmdbuf, uint8_t len);
+
+/* Read advertising channel power */
+int ble_ll_adv_read_txpwr(uint8_t *rspbuf, uint8_t *rsplen);
+
+/*---- API used by BLE LL ----*/
+/* Send the connection complete event */
+void ble_ll_adv_send_conn_comp_ev(struct ble_ll_conn_sm *connsm,
+ struct ble_mbuf_hdr *rxhdr);
+
+/* Returns local resolvable private address */
+uint8_t *ble_ll_adv_get_local_rpa(struct ble_ll_adv_sm *advsm);
+
+/* Returns peer resolvable private address */
+uint8_t *ble_ll_adv_get_peer_rpa(struct ble_ll_adv_sm *advsm);
+
+/* Called to initialize advertising functionality. */
+void ble_ll_adv_init(void);
+
+/* Called when LL wait for response timer expires in advertising state */
+void ble_ll_adv_wfr_timer_exp(void);
+
+/* Called to reset the advertiser. */
+void ble_ll_adv_reset(void);
+
+/* Called on rx pdu start when in advertising state */
+int ble_ll_adv_rx_isr_start(uint8_t pdu_type);
+
+/* Called on rx pdu end when in advertising state */
+int ble_ll_adv_rx_isr_end(uint8_t pdu_type, struct os_mbuf *rxpdu, int crcok);
+
+/* Processes received packets at the link layer task */
+void ble_ll_adv_rx_pkt_in(uint8_t ptype, uint8_t *rxbuf,
+ struct ble_mbuf_hdr *hdr);
+
+/* Boolean function denoting whether or not the whitelist can be changed */
+int ble_ll_adv_can_chg_whitelist(void);
+
+/*
+ * Called when an advertising event has been removed from the scheduler
+ * without being run.
+ */
+void ble_ll_adv_event_rmvd_from_sched(struct ble_ll_adv_sm *advsm);
+
+/*
+ * Called when a periodic event has been removed from the scheduler
+ * without being run.
+ */
+void ble_ll_adv_periodic_rmvd_from_sched(struct ble_ll_adv_sm *advsm);
+
+/* Called to halt currently running advertising event */
+void ble_ll_adv_halt(void);
+
+/* Called to determine if advertising is enabled */
+uint8_t ble_ll_adv_enabled(void);
+
+int ble_ll_adv_hci_set_random_addr(const uint8_t *cmdbuf, uint8_t len);
+int ble_ll_adv_set_random_addr(const uint8_t *addr, uint8_t instance);
+int ble_ll_adv_remove(const uint8_t *addr, uint8_t len);
+int ble_ll_adv_clear_all(void);
+int ble_ll_adv_ext_set_param(const uint8_t *cmdbuf, uint8_t len,
+ uint8_t *rspbuf, uint8_t *rsplen);
+int ble_ll_adv_ext_set_adv_data(const uint8_t *cmdbuf, uint8_t cmdlen);
+int ble_ll_adv_ext_set_scan_rsp(const uint8_t *cmdbuf, uint8_t cmdlen);
+int ble_ll_adv_ext_set_enable(const uint8_t *cmdbuf, uint8_t len);
+
+int ble_ll_adv_periodic_set_param(const uint8_t *cmdbuf, uint8_t len);
+int ble_ll_adv_periodic_set_data(const uint8_t *cmdbuf, uint8_t len);
+int ble_ll_adv_periodic_enable(const uint8_t *cmdbuf, uint8_t len);
+
+int ble_ll_adv_periodic_set_info_transfer(const uint8_t *cmdbuf, uint8_t len,
+ uint8_t *rspbuf, uint8_t *rsplen);
+
+/* Called to notify adv code about RPA rotation */
+void ble_ll_adv_rpa_timeout(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_BLE_LL_ADV_ */
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_conn.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_conn.h
new file mode 100644
index 00000000..26c99265
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_conn.h
@@ -0,0 +1,425 @@
+/*
+ * 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.
+ */
+
+#ifndef H_BLE_LL_CONN_
+#define H_BLE_LL_CONN_
+
+#include "os/os.h"
+#include "nimble/ble.h"
+#include "nimble/hci_common.h"
+#include "nimble/nimble_npl.h"
+#include "controller/ble_ll_sched.h"
+#include "controller/ble_ll_ctrl.h"
+#include "controller/ble_phy.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Roles */
+#define BLE_LL_CONN_ROLE_NONE (0)
+#define BLE_LL_CONN_ROLE_MASTER (1)
+#define BLE_LL_CONN_ROLE_SLAVE (2)
+
+/* Connection states */
+#define BLE_LL_CONN_STATE_IDLE (0)
+#define BLE_LL_CONN_STATE_CREATED (1)
+#define BLE_LL_CONN_STATE_ESTABLISHED (2)
+
+/* Channel map size */
+#define BLE_LL_CONN_CHMAP_LEN (5)
+
+/* Definitions for source clock accuracy */
+#define BLE_MASTER_SCA_251_500_PPM (0)
+#define BLE_MASTER_SCA_151_250_PPM (1)
+#define BLE_MASTER_SCA_101_150_PPM (2)
+#define BLE_MASTER_SCA_76_100_PPM (3)
+#define BLE_MASTER_SCA_51_75_PPM (4)
+#define BLE_MASTER_SCA_31_50_PPM (5)
+#define BLE_MASTER_SCA_21_30_PPM (6)
+#define BLE_MASTER_SCA_0_20_PPM (7)
+
+/* Definition for RSSI when the RSSI is unknown */
+#define BLE_LL_CONN_UNKNOWN_RSSI (127)
+
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION)
+/*
+ * Encryption states for a connection
+ *
+ * NOTE: the states are ordered so that we can check to see if the state
+ * is greater than ENCRYPTED. If so, it means that the start or pause
+ * encryption procedure is running and we should not send data pdu's.
+ */
+enum conn_enc_state {
+ CONN_ENC_S_UNENCRYPTED = 1,
+ CONN_ENC_S_ENCRYPTED,
+ CONN_ENC_S_ENC_RSP_WAIT,
+ CONN_ENC_S_PAUSE_ENC_RSP_WAIT,
+ CONN_ENC_S_PAUSED,
+ CONN_ENC_S_START_ENC_REQ_WAIT,
+ CONN_ENC_S_START_ENC_RSP_WAIT,
+ CONN_ENC_S_LTK_REQ_WAIT,
+ CONN_ENC_S_LTK_NEG_REPLY
+};
+
+/*
+ * Note that the LTK is the key, the SDK is the plain text, and the
+ * session key is the cipher text portion of the encryption block.
+ *
+ * NOTE: we have intentionally violated the specification by making the
+ * transmit and receive packet counters 32-bits as opposed to 39 (as per the
+ * specification). We do this to save code space, ram and calculation time. The
+ * only drawback is that any encrypted connection that sends more than 2^32
+ * packets will suffer a MIC failure and thus be disconnected.
+ */
+struct ble_ll_conn_enc_data
+{
+ uint8_t enc_state;
+ uint8_t tx_encrypted;
+ uint16_t enc_div;
+ uint32_t tx_pkt_cntr;
+ uint32_t rx_pkt_cntr;
+ uint64_t host_rand_num;
+ uint8_t iv[8];
+ struct ble_encryption_block enc_block;
+};
+#endif
+
+/* Connection state machine flags. */
+union ble_ll_conn_sm_flags {
+ struct {
+ uint32_t pkt_rxd:1;
+ uint32_t terminate_ind_txd:1;
+ uint32_t terminate_ind_rxd:1;
+ uint32_t terminate_ind_rxd_acked:1;
+ uint32_t allow_slave_latency:1;
+ uint32_t slave_set_last_anchor:1;
+ uint32_t awaiting_host_reply:1;
+ uint32_t terminate_started:1;
+ uint32_t conn_update_sched:1;
+ uint32_t host_expects_upd_event:1;
+ uint32_t version_ind_sent:1;
+ uint32_t rxd_version_ind:1;
+ uint32_t chanmap_update_scheduled:1;
+ uint32_t conn_empty_pdu_txd:1;
+ uint32_t last_txd_md:1;
+ uint32_t conn_req_txd:1;
+ uint32_t send_ltk_req:1;
+ uint32_t encrypted:1;
+ uint32_t encrypt_chg_sent:1;
+ uint32_t le_ping_supp:1;
+ uint32_t csa2_supp:1;
+ uint32_t host_phy_update: 1;
+ uint32_t phy_update_sched: 1;
+ uint32_t ctrlr_phy_update: 1;
+ uint32_t phy_update_event: 1;
+ uint32_t peer_phy_update: 1; /* XXX:combine with ctrlr udpate bit? */
+ uint32_t aux_conn_req: 1;
+ uint32_t rxd_features:1;
+ uint32_t pending_hci_rd_features:1;
+ uint32_t pending_initiate_dle:1;
+ } cfbit;
+ uint32_t conn_flags;
+} __attribute__((packed));
+
+/**
+ * Structure used for PHY data inside a connection.
+ *
+ * NOTE: the new phy's are the phys we will change to when a phy update
+ * procedure is ongoing and the event counter hits the instant.
+ *
+ * tx_phy_mode: chip specific phy mode for tx
+ * rx_phy_mode: chip specific phy mode for rx
+ * cur_tx_phy: value denoting current tx_phy (not a bitmask!)
+ * cur_rx_phy: value denoting current rx phy (not a bitmask!)
+ * new_tx_phy: value denoting new tx_phy (not a bitmask!)
+ * new_rx_phy: value denoting new rx phy (not a bitmask!)
+ * req_pref_tx_phy: tx phy sent in a phy request (may be different than host)
+ * req_pref_rx_phy: rx phy sent in a phy request (may be different than host)
+ * host_pref_tx_phys: bitmask of preferred transmit PHYs sent by host
+ * host_pref_rx_phys: bitmask of preferred receive PHYs sent by host
+ * phy_options: preferred phy options for coded phy
+ */
+struct ble_ll_conn_phy_data
+{
+ uint32_t tx_phy_mode: 2;
+ uint32_t rx_phy_mode: 2;
+ uint32_t cur_tx_phy: 2;
+ uint32_t cur_rx_phy: 2;
+ uint32_t new_tx_phy: 2;
+ uint32_t new_rx_phy: 2;
+ uint32_t host_pref_tx_phys_mask: 3;
+ uint32_t host_pref_rx_phys_mask: 3;
+ uint32_t req_pref_tx_phys_mask: 3;
+ uint32_t req_pref_rx_phys_mask: 3;
+ uint32_t phy_options: 2;
+} __attribute__((packed));
+
+#define CONN_CUR_TX_PHY_MASK(csm) (1 << ((csm)->phy_data.cur_tx_phy - 1))
+#define CONN_CUR_RX_PHY_MASK(csm) (1 << ((csm)->phy_data.cur_rx_phy - 1))
+
+struct hci_conn_update
+{
+ uint16_t handle;
+ uint16_t conn_itvl_min;
+ uint16_t conn_itvl_max;
+ uint16_t conn_latency;
+ uint16_t supervision_timeout;
+ uint16_t min_ce_len;
+ uint16_t max_ce_len;
+};
+
+struct hci_ext_conn_params
+{
+ uint16_t scan_itvl;
+ uint16_t scan_window;
+ uint16_t conn_itvl_min;
+ uint16_t conn_itvl_max;
+ uint16_t conn_latency;
+ uint16_t supervision_timeout;
+ uint16_t min_ce_len;
+ uint16_t max_ce_len;
+};
+
+struct hci_ext_create_conn
+{
+ uint8_t filter_policy;
+ uint8_t own_addr_type;
+ uint8_t peer_addr_type;
+ uint8_t peer_addr[BLE_DEV_ADDR_LEN];
+ uint8_t init_phy_mask;
+ struct hci_ext_conn_params params[3];
+};
+
+/* Connection state machine */
+struct ble_ll_conn_sm
+{
+ /* Connection state machine flags */
+ union ble_ll_conn_sm_flags csmflags;
+
+ /* Current connection handle, state and role */
+ uint16_t conn_handle;
+ uint8_t conn_state;
+ uint8_t conn_role; /* Can possibly be 1 bit */
+
+ /* RSSI */
+ int8_t conn_rssi;
+
+ /* For privacy */
+ int8_t rpa_index;
+
+ /* Connection data length management */
+ uint8_t max_tx_octets;
+ uint8_t max_rx_octets;
+ uint8_t rem_max_tx_octets;
+ uint8_t rem_max_rx_octets;
+ uint8_t eff_max_tx_octets;
+ uint8_t eff_max_rx_octets;
+ uint16_t max_tx_time;
+ uint16_t max_rx_time;
+ uint16_t rem_max_tx_time;
+ uint16_t rem_max_rx_time;
+ uint16_t eff_max_tx_time;
+ uint16_t eff_max_rx_time;
+ uint8_t max_tx_octets_phy_mode[BLE_PHY_NUM_MODE];
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY)
+ uint16_t host_req_max_tx_time;
+#endif
+
+#if (BLE_LL_BT5_PHY_SUPPORTED == 1)
+ struct ble_ll_conn_phy_data phy_data;
+ uint16_t phy_instant;
+ uint8_t phy_tx_transition;
+#endif
+
+ /* Used to calculate data channel index for connection */
+ uint8_t chanmap[BLE_LL_CONN_CHMAP_LEN];
+ uint8_t req_chanmap[BLE_LL_CONN_CHMAP_LEN];
+ uint16_t chanmap_instant;
+ uint16_t channel_id; /* TODO could be union with hop and last chan used */
+ uint8_t hop_inc;
+ uint8_t data_chan_index;
+ uint8_t last_unmapped_chan;
+ uint8_t num_used_chans;
+
+#if MYNEWT_VAL(BLE_LL_STRICT_CONN_SCHEDULING)
+ uint8_t period_occ_mask; /* mask: period 0 = 0x01, period 3 = 0x08 */
+#endif
+
+ /* Ack/Flow Control */
+ uint8_t tx_seqnum; /* note: can be 1 bit */
+ uint8_t next_exp_seqnum; /* note: can be 1 bit */
+ uint8_t cons_rxd_bad_crc; /* note: can be 1 bit */
+ uint8_t last_rxd_sn; /* note: cant be 1 bit given current code */
+ uint8_t last_rxd_hdr_byte; /* note: possibly can make 1 bit since we
+ only use the MD bit now */
+
+ /* connection event mgmt */
+ uint8_t reject_reason;
+ uint8_t host_reply_opcode;
+ uint8_t master_sca;
+ uint8_t tx_win_size;
+ uint8_t cur_ctrl_proc;
+ uint8_t disconnect_reason;
+ uint8_t rxd_disconnect_reason;
+ uint8_t vers_nr;
+ uint8_t conn_features;
+ uint8_t remote_features[7];
+ uint16_t pending_ctrl_procs;
+ uint16_t event_cntr;
+ uint16_t completed_pkts;
+ uint16_t comp_id;
+ uint16_t sub_vers_nr;
+ uint16_t auth_pyld_tmo; /* could be ifdef'd. 10 msec units */
+
+ uint32_t access_addr;
+ uint32_t crcinit; /* only low 24 bits used */
+ /* XXX: do we need ce_end_time? Cant this be sched end time? */
+ uint32_t ce_end_time; /* cputime at which connection event should end */
+ uint32_t terminate_timeout;
+ uint32_t last_scheduled;
+
+ /* Connection timing */
+ uint16_t conn_itvl;
+ uint16_t slave_latency;
+ uint16_t supervision_tmo;
+ uint16_t min_ce_len;
+ uint16_t max_ce_len;
+ uint16_t tx_win_off;
+ uint32_t anchor_point;
+ uint8_t anchor_point_usecs; /* XXX: can this be uint8_t ?*/
+ uint8_t conn_itvl_usecs;
+ uint32_t conn_itvl_ticks;
+ uint32_t last_anchor_point; /* Slave only */
+ uint32_t slave_cur_tx_win_usecs;
+ uint32_t slave_cur_window_widening;
+ uint32_t last_rxd_pdu_cputime; /* Used exclusively for supervision timer */
+
+ /*
+ * Used to mark that identity address was used as InitA
+ */
+ uint8_t inita_identity_used;
+
+ /* address information */
+ uint8_t own_addr_type;
+ uint8_t peer_addr_type;
+ uint8_t peer_addr[BLE_DEV_ADDR_LEN];
+
+ /*
+ * XXX: TODO. Could save memory. Have single event at LL and put these
+ * on a singly linked list. Only would need list pointer here.
+ */
+ /* Connection end event */
+ struct ble_npl_event conn_ev_end;
+
+ /* Packet transmit queue */
+ struct os_mbuf *cur_tx_pdu;
+ STAILQ_HEAD(conn_txq_head, os_mbuf_pkthdr) conn_txq;
+
+ /* List entry for active/free connection pools */
+ union {
+ SLIST_ENTRY(ble_ll_conn_sm) act_sle;
+ STAILQ_ENTRY(ble_ll_conn_sm) free_stqe;
+ };
+
+ /* LL control procedure response timer */
+ struct ble_npl_callout ctrl_proc_rsp_timer;
+
+ /* For scheduling connections */
+ struct ble_ll_sched_item conn_sch;
+
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING)
+ struct ble_npl_callout auth_pyld_timer;
+#endif
+
+ /*
+ * XXX: a note on all these structures for control procedures. First off,
+ * all of these need to be ifdef'd to save memory. Another thing to
+ * consider is this: since most control procedures can only run when no
+ * others are running, can I use just one structure (a union)? Should I
+ * allocate these from a pool? Not sure what to do. For now, I just use
+ * a large chunk of memory per connection.
+ */
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION)
+ struct ble_ll_conn_enc_data enc_data;
+#endif
+ /*
+ * For connection update procedure. XXX: can make this a pointer and
+ * malloc it if we want to save space.
+ */
+ struct hci_conn_update conn_param_req;
+
+ /* For connection update procedure */
+ struct ble_ll_conn_upd_req conn_update_req;
+
+ /* XXX: for now, just store them all */
+ struct ble_ll_conn_params conn_cp;
+
+ struct ble_ll_scan_sm *scansm;
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
+ struct hci_ext_create_conn initial_params;
+#endif
+
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER)
+ uint8_t sync_transfer_mode;
+ uint16_t sync_transfer_skip;
+ uint32_t sync_transfer_sync_timeout;
+#endif
+};
+
+/* Flags */
+#define CONN_F_UPDATE_SCHED(csm) ((csm)->csmflags.cfbit.conn_update_sched)
+#define CONN_F_EMPTY_PDU_TXD(csm) ((csm)->csmflags.cfbit.conn_empty_pdu_txd)
+#define CONN_F_LAST_TXD_MD(csm) ((csm)->csmflags.cfbit.last_txd_md)
+#define CONN_F_CONN_REQ_TXD(csm) ((csm)->csmflags.cfbit.conn_req_txd)
+#define CONN_F_ENCRYPTED(csm) ((csm)->csmflags.cfbit.encrypted)
+#define CONN_F_ENC_CHANGE_SENT(csm) ((csm)->csmflags.cfbit.encrypt_chg_sent)
+#define CONN_F_LE_PING_SUPP(csm) ((csm)->csmflags.cfbit.le_ping_supp)
+#define CONN_F_TERMINATE_STARTED(csm) ((csm)->csmflags.cfbit.terminate_started)
+#define CONN_F_CSA2_SUPP(csm) ((csm)->csmflags.cfbit.csa2_supp)
+#define CONN_F_HOST_PHY_UPDATE(csm) ((csm)->csmflags.cfbit.host_phy_update)
+#define CONN_F_PHY_UPDATE_SCHED(csm) ((csm)->csmflags.cfbit.phy_update_sched)
+#define CONN_F_CTRLR_PHY_UPDATE(csm) ((csm)->csmflags.cfbit.ctrlr_phy_update)
+#define CONN_F_PHY_UPDATE_EVENT(csm) ((csm)->csmflags.cfbit.phy_update_event)
+#define CONN_F_PEER_PHY_UPDATE(csm) ((csm)->csmflags.cfbit.peer_phy_update)
+#define CONN_F_AUX_CONN_REQ(csm) ((csm)->csmflags.cfbit.aux_conn_req)
+
+/* Role */
+#define CONN_IS_MASTER(csm) (csm->conn_role == BLE_LL_CONN_ROLE_MASTER)
+#define CONN_IS_SLAVE(csm) (csm->conn_role == BLE_LL_CONN_ROLE_SLAVE)
+
+/*
+ * Given a handle, returns an active connection state machine (or NULL if the
+ * handle does not exist
+ *
+ */
+struct ble_ll_conn_sm *ble_ll_conn_find_active_conn(uint16_t handle);
+
+/* required for unit testing */
+uint8_t ble_ll_conn_calc_dci(struct ble_ll_conn_sm *conn, uint16_t latency);
+
+/* used to get anchor point for connection event specified */
+void ble_ll_conn_get_anchor(struct ble_ll_conn_sm *connsm, uint16_t conn_event,
+ uint32_t *anchor, uint8_t *anchor_usecs);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_BLE_LL_CONN_ */
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_ctrl.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_ctrl.h
new file mode 100644
index 00000000..b0da1e73
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_ctrl.h
@@ -0,0 +1,313 @@
+/*
+ * 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.
+ */
+
+#ifndef H_BLE_LL_CTRL_
+#define H_BLE_LL_CTRL_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * LL control procedures. This "enumeration" is not in the specification;
+ * It is used to determine which LL control procedure is currently running
+ * in a connection and which ones may be pending.
+ */
+#define BLE_LL_CTRL_PROC_CONN_UPDATE (0)
+#define BLE_LL_CTRL_PROC_CHAN_MAP_UPD (1)
+#define BLE_LL_CTRL_PROC_ENCRYPT (2)
+#define BLE_LL_CTRL_PROC_FEATURE_XCHG (3)
+#define BLE_LL_CTRL_PROC_VERSION_XCHG (4)
+#define BLE_LL_CTRL_PROC_TERMINATE (5)
+#define BLE_LL_CTRL_PROC_CONN_PARAM_REQ (6)
+#define BLE_LL_CTRL_PROC_LE_PING (7)
+#define BLE_LL_CTRL_PROC_DATA_LEN_UPD (8)
+#define BLE_LL_CTRL_PROC_PHY_UPDATE (9)
+#define BLE_LL_CTRL_PROC_NUM (10)
+#define BLE_LL_CTRL_PROC_IDLE (255)
+
+/* Checks if a particular control procedure is running */
+#define IS_PENDING_CTRL_PROC(sm, proc) (sm->pending_ctrl_procs & (1 << proc))
+#define CLR_PENDING_CTRL_PROC(sm, proc) (sm->pending_ctrl_procs &= ~(1 << proc))
+
+/* LL control procedure timeout */
+#define BLE_LL_CTRL_PROC_TIMEOUT_MS (40000) /* ms */
+
+/*
+ * LL CTRL PDU format
+ * -> Opcode (1 byte)
+ * -> Data (0 - 26 bytes)
+ */
+#define BLE_LL_CTRL_CONN_UPDATE_IND (0)
+#define BLE_LL_CTRL_CHANNEL_MAP_REQ (1)
+#define BLE_LL_CTRL_TERMINATE_IND (2)
+#define BLE_LL_CTRL_ENC_REQ (3)
+#define BLE_LL_CTRL_ENC_RSP (4)
+#define BLE_LL_CTRL_START_ENC_REQ (5)
+#define BLE_LL_CTRL_START_ENC_RSP (6)
+#define BLE_LL_CTRL_UNKNOWN_RSP (7)
+#define BLE_LL_CTRL_FEATURE_REQ (8)
+#define BLE_LL_CTRL_FEATURE_RSP (9)
+#define BLE_LL_CTRL_PAUSE_ENC_REQ (10)
+#define BLE_LL_CTRL_PAUSE_ENC_RSP (11)
+#define BLE_LL_CTRL_VERSION_IND (12)
+#define BLE_LL_CTRL_REJECT_IND (13)
+#define BLE_LL_CTRL_SLAVE_FEATURE_REQ (14)
+#define BLE_LL_CTRL_CONN_PARM_REQ (15)
+#define BLE_LL_CTRL_CONN_PARM_RSP (16)
+#define BLE_LL_CTRL_REJECT_IND_EXT (17)
+#define BLE_LL_CTRL_PING_REQ (18)
+#define BLE_LL_CTRL_PING_RSP (19)
+#define BLE_LL_CTRL_LENGTH_REQ (20)
+#define BLE_LL_CTRL_LENGTH_RSP (21)
+#define BLE_LL_CTRL_PHY_REQ (22)
+#define BLE_LL_CTRL_PHY_RSP (23)
+#define BLE_LL_CTRL_PHY_UPDATE_IND (24)
+#define BLE_LL_CTRL_MIN_USED_CHAN_IND (25)
+#define BLE_LL_CTRL_CTE_REQ (26)
+#define BLE_LL_CTRL_CTE_RSP (27)
+#define BLE_LL_CTRL_PERIODIC_SYNC_IND (28)
+#define BLE_LL_CTRL_CLOCK_ACCURACY_REQ (29)
+#define BLE_LL_CTRL_CLOCK_ACCURACY_RSP (30)
+
+/* Maximum opcode value */
+#define BLE_LL_CTRL_OPCODES (BLE_LL_CTRL_CLOCK_ACCURACY_RSP + 1)
+
+extern const uint8_t g_ble_ll_ctrl_pkt_lengths[BLE_LL_CTRL_OPCODES];
+
+/* Maximum LL control PDU size */
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER)
+#define BLE_LL_CTRL_MAX_PDU_LEN (35)
+#else
+#define BLE_LL_CTRL_MAX_PDU_LEN (27)
+#endif
+
+/* LL control connection update request */
+struct ble_ll_conn_upd_req
+{
+ uint8_t winsize;
+ uint16_t winoffset;
+ uint16_t interval;
+ uint16_t latency;
+ uint16_t timeout;
+ uint16_t instant;
+};
+#define BLE_LL_CTRL_CONN_UPD_REQ_LEN (11)
+
+/* LL control channel map request */
+struct ble_ll_chan_map_req
+{
+ uint8_t chmap[5];
+ uint16_t instant;
+};
+#define BLE_LL_CTRL_CHAN_MAP_LEN (7)
+
+/*
+ * LL control terminate ind
+ * -> error code (1 byte)
+ */
+#define BLE_LL_CTRL_TERMINATE_IND_LEN (1)
+
+/* LL control enc req */
+struct ble_ll_enc_req
+{
+ uint8_t rand[8];
+ uint16_t ediv;
+ uint8_t skdm[8];
+ uint32_t ivm;
+};
+
+#define BLE_LL_CTRL_ENC_REQ_LEN (22)
+
+/* LL control enc rsp */
+struct ble_ll_enc_rsp
+{
+ uint8_t skds[8];
+ uint32_t ivs;
+};
+
+#define BLE_LL_CTRL_ENC_RSP_LEN (12)
+
+/* LL control start/pause enc request and response */
+#define BLE_LL_CTRL_START_ENC_REQ_LEN (0)
+#define BLE_LL_CTRL_START_ENC_RSP_LEN (0)
+#define BLE_LL_CTRL_PAUSE_ENC_REQ_LEN (0)
+#define BLE_LL_CTRL_PAUSE_ENC_RSP_LEN (0)
+
+/*
+ * LL control unknown response
+ * -> 1 byte which contains the unknown or un-supported opcode.
+ */
+#define BLE_LL_CTRL_UNK_RSP_LEN (1)
+
+/*
+ * LL control feature req and LL control feature rsp
+ * -> 8 bytes of data containing features supported by device.
+ */
+#define BLE_LL_CTRL_FEATURE_LEN (8)
+
+/*
+ * LL control version ind
+ * -> version (1 byte):
+ * Contains the version number of the bluetooth controller specification.
+ * -> comp_id (2 bytes)
+ * Contains the company identifier of the manufacturer of the controller.
+ * -> sub_ver_num: Contains a unique value for implementation or revision of
+ * the bluetooth controller.
+ */
+struct ble_ll_version_ind
+{
+ uint8_t ble_ctrlr_ver;
+ uint16_t company_id;
+ uint16_t sub_ver_num;
+};
+
+#define BLE_LL_CTRL_VERSION_IND_LEN (5)
+
+/*
+ * LL control reject ind
+ * -> error code (1 byte): contains reason why request was rejected.
+ */
+#define BLE_LL_CTRL_REJ_IND_LEN (1)
+
+/*
+ * LL control slave feature req
+ * -> 8 bytes of data containing features supported by device.
+ */
+#define BLE_LL_CTRL_SLAVE_FEATURE_REQ_LEN (8)
+
+/* LL control connection param req and connection param rsp */
+struct ble_ll_conn_params
+{
+ uint16_t interval_min;
+ uint16_t interval_max;
+ uint16_t latency;
+ uint16_t timeout;
+ uint8_t pref_periodicity;
+ uint16_t ref_conn_event_cnt;
+ uint16_t offset0;
+ uint16_t offset1;
+ uint16_t offset2;
+ uint16_t offset3;
+ uint16_t offset4;
+ uint16_t offset5;
+};
+
+#define BLE_LL_CTRL_CONN_PARAMS_LEN (23)
+
+/* LL control reject ind ext */
+struct ble_ll_reject_ind_ext
+{
+ uint8_t reject_opcode;
+ uint8_t err_code;
+};
+
+#define BLE_LL_CTRL_REJECT_IND_EXT_LEN (2)
+
+/* LL control ping req and ping rsp (contain no data) */
+#define BLE_LL_CTRL_PING_LEN (0)
+
+/*
+ * LL control length req and length rsp
+ * -> max_rx_bytes (2 bytes): defines connMaxRxOctets. Range 27 to 251
+ * -> max_rx_time (2 bytes): defines connMaxRxTime. Range 328 to 2120 usecs.
+ * -> max_tx_bytes (2 bytes): defines connMaxTxOctets. Range 27 to 251
+ * -> max_tx_time (2 bytes): defines connMaxTxTime. Range 328 to 2120 usecs.
+ */
+struct ble_ll_len_req
+{
+ uint16_t max_rx_bytes;
+ uint16_t max_rx_time;
+ uint16_t max_tx_bytes;
+ uint16_t max_tx_time;
+};
+
+#define BLE_LL_CTRL_LENGTH_REQ_LEN (8)
+
+/* PHY request/response */
+#define BLE_LL_CTRL_PHY_REQ_LEN (2)
+#define BLE_LL_CTRL_PHY_RSP_LEN (2)
+#define BLE_LL_CTRL_PHY_UPD_IND_LEN (4)
+
+/* Min used channels */
+#define BLE_LL_CTRL_MIN_USED_CHAN_LEN (2)
+
+/* CTE REQ */
+#define BLE_LL_CTRL_CTE_REQ_LEN (1)
+
+/* CTE RSP (contains no data) */
+#define BLE_LL_CTRL_CTE_RSP_LEN (0)
+
+/* Periodic Sync Transfer IND */
+#define BLE_LL_CTRL_PERIODIC_SYNC_IND_LEN (34)
+
+/* Clock accuracy request/response */
+#define BLE_LL_CTRL_CLOCK_ACCURACY_REQ_LEN (1)
+#define BLE_LL_CTRL_CLOCK_ACCURACY_RSP_LEN (1)
+
+/* API */
+struct ble_ll_conn_sm;
+void ble_ll_ctrl_proc_start(struct ble_ll_conn_sm *connsm, int ctrl_proc);
+void ble_ll_ctrl_proc_stop(struct ble_ll_conn_sm *connsm, int ctrl_proc);
+int ble_ll_ctrl_rx_pdu(struct ble_ll_conn_sm *connsm, struct os_mbuf *om);
+void ble_ll_ctrl_chk_proc_start(struct ble_ll_conn_sm *connsm);
+void ble_ll_ctrl_terminate_start(struct ble_ll_conn_sm *connsm);
+int ble_ll_ctrl_is_terminate_ind(uint8_t hdr, uint8_t opcode);
+uint8_t ble_ll_ctrl_conn_param_reply(struct ble_ll_conn_sm *connsm,
+ uint8_t *rsp,
+ struct ble_ll_conn_params *req);
+int ble_ll_ctrl_reject_ind_send(struct ble_ll_conn_sm *connsm,
+ uint8_t rej_opcode, uint8_t err);
+int ble_ll_ctrl_start_enc_send(struct ble_ll_conn_sm *connsm);
+int ble_ll_ctrl_enc_allowed_pdu_rx(struct os_mbuf *rxpdu);
+int ble_ll_ctrl_enc_allowed_pdu_tx(struct os_mbuf_pkthdr *pkthdr);
+int ble_ll_ctrl_tx_done(struct os_mbuf *txpdu, struct ble_ll_conn_sm *connsm);
+int ble_ll_ctrl_is_start_enc_rsp(struct os_mbuf *txpdu);
+
+void ble_ll_hci_ev_datalen_chg(struct ble_ll_conn_sm *connsm);
+void ble_ll_hci_ev_rem_conn_parm_req(struct ble_ll_conn_sm *connsm,
+ struct ble_ll_conn_params *cp);
+void ble_ll_hci_ev_conn_update(struct ble_ll_conn_sm *connsm, uint8_t status);
+void ble_ll_hci_ev_rd_rem_used_feat(struct ble_ll_conn_sm *connsm,
+ uint8_t status);
+void ble_ll_hci_ev_rd_rem_ver(struct ble_ll_conn_sm *connsm, uint8_t status);
+void ble_ll_hci_ev_encrypt_chg(struct ble_ll_conn_sm *connsm, uint8_t status);
+int ble_ll_hci_ev_ltk_req(struct ble_ll_conn_sm *connsm);
+int ble_ll_hci_ev_hw_err(uint8_t hw_err);
+void ble_ll_hci_ev_databuf_overflow(void);
+void ble_ll_hci_ev_le_csa(struct ble_ll_conn_sm *connsm);
+void ble_ll_hci_ev_send_scan_req_recv(uint8_t adv_handle, const uint8_t *peer,
+ uint8_t peer_addr_type);
+void ble_ll_hci_ev_send_scan_timeout(void);
+void ble_ll_hci_ev_send_adv_set_terminated(uint8_t status, uint8_t adv_handle,
+ uint16_t conn_handle, uint8_t events);
+int ble_ll_hci_ev_phy_update(struct ble_ll_conn_sm *connsm, uint8_t status);
+void ble_ll_calc_session_key(struct ble_ll_conn_sm *connsm);
+void ble_ll_ctrl_phy_update_proc_complete(struct ble_ll_conn_sm *connsm);
+void ble_ll_ctrl_initiate_dle(struct ble_ll_conn_sm *connsm);
+void ble_ll_hci_ev_send_vendor_err(const char *file, uint32_t line);
+
+uint8_t ble_ll_ctrl_phy_tx_transition_get(uint8_t phy_mask);
+uint8_t ble_ll_ctrl_phy_from_phy_mask(uint8_t phy_mask);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_BLE_LL_CTRL_ */
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_hci.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_hci.h
new file mode 100644
index 00000000..abef8746
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_hci.h
@@ -0,0 +1,75 @@
+/*
+ * 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.
+ */
+
+#ifndef H_BLE_LL_HCI_
+#define H_BLE_LL_HCI_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "nimble/hci_common.h"
+
+/* For supported commands */
+#define BLE_LL_SUPP_CMD_LEN (42)
+extern const uint8_t g_ble_ll_supp_cmds[BLE_LL_SUPP_CMD_LEN];
+
+/* The largest event the controller will send. */
+#define BLE_LL_MAX_EVT_LEN MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE)
+
+/*
+ * This determines the number of outstanding commands allowed from the
+ * host to the controller. NOTE: you cannot change this without modifying
+ * other portions of the code as we currently use a global os event for
+ * the command; you would need to allocate a pool of these.
+ */
+#define BLE_LL_CFG_NUM_HCI_CMD_PKTS (1)
+
+typedef void (*ble_ll_hci_post_cmd_complete_cb)(void);
+
+/* Initialize LL HCI */
+void ble_ll_hci_init(void);
+
+/* Used to determine if the LE event is enabled/disabled */
+bool ble_ll_hci_is_le_event_enabled(unsigned int subev);
+
+/* Used to determine if event is enabled/disabled */
+bool ble_ll_hci_is_event_enabled(unsigned int evcode);
+
+/* Send event from controller to host */
+int ble_ll_hci_event_send(struct ble_hci_ev *hci_ev);
+
+/* Sends a command complete with a no-op opcode to host */
+void ble_ll_hci_send_noop(void);
+
+/* Checks the preferref phy masks from set default phy and set phy commands */
+int ble_ll_hci_chk_phy_masks(uint8_t all_phys, uint8_t tx_phys, uint8_t rx_phys,
+ uint8_t *txphy, uint8_t *rxphy);
+
+/* Returns true if Extended Advertising HCI commands are in use */
+bool ble_ll_hci_adv_mode_ext(void);
+
+/* Get TX power compensation rounded to integer dB */
+int8_t ble_ll_get_tx_pwr_compensation(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_BLE_LL_HCI_ */
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_resolv.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_resolv.h
new file mode 100644
index 00000000..228e0a37
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_resolv.h
@@ -0,0 +1,116 @@
+/*
+ * 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.
+ */
+
+#ifndef H_BLE_LL_RESOLV_
+#define H_BLE_LL_RESOLV_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * An entry in the resolving list.
+ * The identity address is stored in little endian format.
+ * The local rpa is stored in little endian format.
+ * The IRKs are stored in big endian format.
+ *
+ * Note:
+ * rl_local_irk and rl_peer_irk need to be word aligned
+ */
+struct ble_ll_resolv_entry
+{
+ uint8_t rl_addr_type;
+ uint8_t rl_priv_mode;
+ uint8_t rl_has_local;
+ uint8_t rl_has_peer;
+ uint8_t rl_local_irk[16];
+ uint8_t rl_peer_irk[16];
+ uint8_t rl_identity_addr[BLE_DEV_ADDR_LEN];
+ uint8_t rl_local_rpa[BLE_DEV_ADDR_LEN];
+ uint8_t rl_peer_rpa[BLE_DEV_ADDR_LEN];
+};
+
+extern struct ble_ll_resolv_entry g_ble_ll_resolv_list[];
+
+/* Clear the resolving list */
+int ble_ll_resolv_list_clr(void);
+
+/* Read the size of the resolving list */
+int ble_ll_resolv_list_read_size(uint8_t *rspbuf, uint8_t *rsplen);
+
+/* Add a device to the resolving list */
+int ble_ll_resolv_list_add(const uint8_t *cmdbuf, uint8_t len);
+
+/* Remove a device from the resolving list */
+int ble_ll_resolv_list_rmv(const uint8_t *cmdbuf, uint8_t len);
+
+/* Address resolution enable command */
+int ble_ll_resolv_enable_cmd(const uint8_t *cmdbuf, uint8_t len);
+
+int ble_ll_resolv_peer_addr_rd(const uint8_t *cmdbuf, uint8_t len,
+ uint8_t *rspbuf, uint8_t *rsplen);
+int ble_ll_resolv_local_addr_rd(const uint8_t *cmdbuf, uint8_t len,
+ uint8_t *rspbuf, uint8_t *rsplen);
+
+/* Finds 'addr' in resolving list. Doesnt check if address resolution enabled */
+struct ble_ll_resolv_entry *
+ble_ll_resolv_list_find(const uint8_t *addr, uint8_t addr_type);
+
+/* Returns true if address resolution is enabled */
+uint8_t ble_ll_resolv_enabled(void);
+
+/* Reset private address resolution */
+void ble_ll_resolv_list_reset(void);
+
+/* Generate local or peer RPA. It is up to caller to make sure required IRK
+ * is present on RL
+ */
+void ble_ll_resolv_get_priv_addr(struct ble_ll_resolv_entry *rl, int local,
+ uint8_t *addr);
+
+void ble_ll_resolv_set_peer_rpa(int index, uint8_t *rpa);
+void ble_ll_resolv_set_local_rpa(int index, uint8_t *rpa);
+
+/* Generate a resolvable private address. */
+int ble_ll_resolv_gen_rpa(uint8_t *addr, uint8_t addr_type, uint8_t *rpa,
+ int local);
+
+/* Set the resolvable private address timeout */
+int ble_ll_resolv_set_rpa_tmo(const uint8_t *cmdbuf, uint8_t len);
+
+/* Set the privacy mode */
+int ble_ll_resolve_set_priv_mode(const uint8_t *cmdbuf, uint8_t len);
+
+/* Get the RPA timeout, in seconds */
+uint32_t ble_ll_resolv_get_rpa_tmo(void);
+
+/* Resolve a resolvable private address */
+int ble_ll_resolv_rpa(const uint8_t *rpa, const uint8_t *irk);
+
+/* Try to resolve peer RPA and return index on RL if matched */
+int ble_ll_resolv_peer_rpa_any(const uint8_t *rpa);
+
+/* Initialize resolv*/
+void ble_ll_resolv_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_rfmgmt.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_rfmgmt.h
new file mode 100644
index 00000000..37b81a88
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_rfmgmt.h
@@ -0,0 +1,63 @@
+/*
+ * 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.
+ */
+
+#ifndef H_BLE_LL_RFMGMT_
+#define H_BLE_LL_RFMGMT_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void ble_ll_rfmgmt_init(void);
+
+#if MYNEWT_VAL(BLE_LL_RFMGMT_ENABLE_TIME) > 0
+
+void ble_ll_rfmgmt_reset(void);
+
+/* Notify rfmgmt that scan window has changed (only called from ble_ll_scan) */
+void ble_ll_rfmgmt_scan_changed(bool enabled, uint32_t next_window);
+
+/* Notify rfmgmt that 1st scheduled item has changed (only called from ble_ll_sched) */
+void ble_ll_rfmgmt_sched_changed(struct ble_ll_sched_item *first);
+
+/* Notify rfmgmt that RF is no longer needed by current event */
+void ble_ll_rfmgmt_release(void);
+
+/* Enables RF immediately and returns tick at which RF will be fully enabled */
+uint32_t ble_ll_rfmgmt_enable_now(void);
+
+/* Returns true only if RF is currently fully enabled (i.e. not off or enabling) */
+bool ble_ll_rfmgmt_is_enabled(void);
+
+#else
+
+static inline void ble_ll_rfmgmt_reset(void) { }
+static inline void ble_ll_rfmgmt_scan_changed(bool e, uint32_t n) { }
+static inline void ble_ll_rfmgmt_sched_changed(struct ble_ll_sched_item *f) { }
+static inline void ble_ll_rfmgmt_release(void) { }
+static inline uint32_t ble_ll_rfmgmt_enable_now(void) { return 0; }
+static inline bool ble_ll_rfmgmt_is_enabled(void) { return true; }
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_BLE_LL_RFMGMT_ */
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_scan.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_scan.h
new file mode 100644
index 00000000..139ad5e1
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_scan.h
@@ -0,0 +1,293 @@
+/*
+ * 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.
+ */
+
+#ifndef H_BLE_LL_SCAN_
+#define H_BLE_LL_SCAN_
+
+#include "controller/ble_ll_sched.h"
+#include "hal/hal_timer.h"
+#include "syscfg/syscfg.h"
+#include "nimble/nimble_npl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * SCAN_REQ
+ * -> ScanA (6 bytes)
+ * -> AdvA (6 bytes)
+ *
+ * ScanA is the scanners public (TxAdd=0) or random (TxAdd = 1) address
+ * AdvaA is the advertisers public (RxAdd=0) or random (RxAdd=1) address.
+ *
+ * Sent by the LL in the Scanning state; received by the LL in the advertising
+ * state. The advertising address is the intended recipient of this frame.
+ */
+#define BLE_SCAN_REQ_LEN (12)
+
+/*
+ * SCAN_RSP
+ * -> AdvA (6 bytes)
+ * -> ScanRspData (0 - 31 bytes)
+ *
+ * AdvaA is the advertisers public (TxAdd=0) or random (TxAdd=1) address.
+ * ScanRspData may contain any data from the advertisers host.
+ *
+ * Sent by the LL in the advertising state; received by the LL in the
+ * scanning state.
+ */
+#define BLE_SCAN_RSP_LEGACY_DATA_MAX_LEN (31)
+#define BLE_SCAN_LEGACY_MAX_PKT_LEN (37)
+
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
+#define BLE_SCAN_RSP_DATA_MAX_LEN MYNEWT_VAL(BLE_EXT_ADV_MAX_SIZE)
+
+/* For Bluetooth 5.0 we need state machine for two PHYs*/
+#define BLE_LL_SCAN_PHY_NUMBER (2)
+#else
+#define BLE_LL_SCAN_PHY_NUMBER (1)
+#define BLE_SCAN_RSP_DATA_MAX_LEN BLE_SCAN_RSP_LEGACY_DATA_MAX_LEN
+#endif
+
+#define PHY_UNCODED (0)
+#define PHY_CODED (1)
+
+#define BLE_LL_EXT_ADV_MODE_NON_CONN (0x00)
+#define BLE_LL_EXT_ADV_MODE_CONN (0x01)
+#define BLE_LL_EXT_ADV_MODE_SCAN (0x02)
+
+/* All values are stored as ticks */
+struct ble_ll_scan_timing {
+ uint32_t interval;
+ uint32_t window;
+ uint32_t start_time;
+};
+
+struct ble_ll_scan_params
+{
+ uint8_t phy;
+ uint8_t own_addr_type;
+ uint8_t scan_filt_policy;
+ uint8_t configured;
+ uint8_t scan_type;
+ uint8_t scan_chan;
+ struct ble_ll_scan_timing timing;
+};
+
+#define BLE_LL_AUX_HAS_ADVA 0x01
+#define BLE_LL_AUX_HAS_TARGETA 0x02
+#define BLE_LL_AUX_HAS_ADI 0x04
+#define BLE_LL_AUX_IS_MATCHED 0x08
+#define BLE_LL_AUX_IS_TARGETA_RESOLVED 0x10
+
+#define BLE_LL_AUX_FLAG_HCI_SENT_ANY 0x02
+#define BLE_LL_AUX_FLAG_HCI_SENT_COMPLETED 0x04
+#define BLE_LL_AUX_FLAG_HCI_SENT_TRUNCATED 0x08
+#define BLE_LL_AUX_FLAG_SCAN_COMPLETE 0x10
+#define BLE_LL_AUX_FLAG_SCAN_ERROR 0x20
+#define BLE_LL_AUX_FLAG_AUX_ADV_RECEIVED 0x40
+#define BLE_LL_AUX_FLAG_AUX_CHAIN_RECEIVED 0x80
+
+struct ble_ll_aux_data {
+ uint8_t flags;
+
+ /*
+ * Since aux_data can be accessed from ISR and LL, we have separate copies
+ * of flags to make sure that ISR does not modify flags while LL uses them.
+ * ISR updates 'flags_isr' and LL adds these to 'flags_ll' which it then
+ * uses for further processing allowing to update 'flags_isr' if another
+ * scan for given 'aux_data' is scheduled. Note that flags must not be unset
+ * while aux_data is valid.
+ */
+ uint8_t flags_isr;
+ uint8_t flags_ll;
+
+ uint8_t ref_cnt;
+ uint8_t chan;
+ uint8_t aux_phy;
+ uint8_t aux_primary_phy;
+ uint8_t mode;
+ uint8_t scanning;
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY)
+ int8_t rpa_index;
+#endif
+ uint16_t adi;
+ uint32_t offset;
+ uint8_t offset_units;
+ uint8_t adva[6];
+ uint8_t adva_type;
+ uint8_t targeta[6];
+ uint8_t targeta_type;
+ uint16_t evt_type;
+ struct ble_ll_sched_item sch;
+ struct ble_hci_ev *evt;
+ struct ble_npl_event ev;
+};
+
+struct ble_ll_scan_pdu_data {
+ uint8_t hdr_byte;
+ /* ScanA for SCAN_REQ and InitA for CONNECT_IND */
+ union {
+ uint8_t scana[BLE_DEV_ADDR_LEN];
+ uint8_t inita[BLE_DEV_ADDR_LEN];
+ };
+ uint8_t adva[BLE_DEV_ADDR_LEN];
+};
+
+struct ble_ll_scan_sm
+{
+ uint8_t scan_enabled;
+ uint8_t own_addr_type;
+ uint8_t scan_filt_dups;
+ uint8_t scan_rsp_pending;
+ uint8_t scan_rsp_cons_fails;
+ uint8_t scan_rsp_cons_ok;
+ uint8_t scan_peer_rpa[BLE_DEV_ADDR_LEN];
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY)
+ ble_npl_time_t scan_nrpa_timer;
+ uint8_t scan_nrpa[BLE_DEV_ADDR_LEN];
+#endif
+ struct ble_ll_scan_pdu_data pdu_data;
+
+ /* XXX: Shall we count backoff per phy? */
+ uint16_t upper_limit;
+ uint16_t backoff_count;
+ uint32_t scan_win_start_time;
+ struct ble_npl_event scan_sched_ev;
+ struct hal_timer scan_timer;
+ struct ble_npl_event scan_interrupted_ev;
+
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
+ struct hal_timer duration_timer;
+ struct hal_timer period_timer;
+ uint32_t duration_ticks;
+ uint32_t period_ticks;
+ uint8_t ext_scanning;
+#endif
+
+ uint8_t restart_timer_needed;
+ struct ble_ll_aux_data *cur_aux_data;
+
+ struct ble_ll_scan_params *scanp;
+ struct ble_ll_scan_params *scanp_next;
+ struct ble_ll_scan_params scanp_phys[BLE_LL_SCAN_PHY_NUMBER];
+};
+
+/* Scan types */
+#define BLE_SCAN_TYPE_PASSIVE (BLE_HCI_SCAN_TYPE_PASSIVE)
+#define BLE_SCAN_TYPE_ACTIVE (BLE_HCI_SCAN_TYPE_ACTIVE)
+#define BLE_SCAN_TYPE_INITIATE (2)
+
+/*---- HCI ----*/
+/* Set scanning parameters */
+int ble_ll_scan_set_scan_params(const uint8_t *cmdbuf, uint8_t len);
+
+/* Turn scanning on/off */
+int ble_ll_hci_scan_set_enable(const uint8_t *cmdbuf, uint8_t len);
+int ble_ll_hci_ext_scan_set_enable(const uint8_t *cmdbuf, uint8_t len);
+
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
+int ble_ll_set_ext_scan_params(const uint8_t *cmdbuf, uint8_t len);
+#endif
+
+/*--- Controller Internal API ---*/
+/* Initialize the scanner */
+void ble_ll_scan_init(void);
+
+/* Reset the scanner */
+void ble_ll_scan_reset(void);
+
+/* Called when Link Layer starts to receive a PDU and is in scanning state */
+int ble_ll_scan_rx_isr_start(uint8_t pdu_type, uint16_t *rxflags);
+
+/* Called when Link Layer has finished receiving a PDU while scanning */
+int ble_ll_scan_rx_isr_end(struct os_mbuf *rxpdu, uint8_t crcok);
+
+/* Process a scan response PDU */
+void ble_ll_scan_rx_pkt_in(uint8_t pdu_type, struct os_mbuf *om,
+ struct ble_mbuf_hdr *hdr);
+
+/* Boolean function denoting whether or not the whitelist can be changed */
+int ble_ll_scan_can_chg_whitelist(void);
+
+/* Boolean function returning true if scanning enabled */
+int ble_ll_scan_enabled(void);
+
+/* Boolean function returns true if whitelist is enabled for scanning */
+int ble_ll_scan_whitelist_enabled(void);
+
+/* Initialize the scanner when we start initiating */
+struct hci_create_conn;
+int ble_ll_scan_initiator_start(struct hci_create_conn *hcc,
+ struct ble_ll_scan_sm **sm);
+
+/* Returns storage for PDU data (for SCAN_REQ or CONNECT_IND) */
+struct ble_ll_scan_pdu_data *ble_ll_scan_get_pdu_data(void);
+
+/* Called to set the resolvable private address of the last connected peer */
+void ble_ll_scan_set_peer_rpa(uint8_t *rpa);
+
+/* Returns peer RPA of last connection made */
+uint8_t *ble_ll_scan_get_peer_rpa(void);
+
+/* Returns the local RPA used by the scanner/initiator */
+uint8_t *ble_ll_scan_get_local_rpa(void);
+
+/* Stop the scanning state machine */
+void ble_ll_scan_sm_stop(int chk_disable);
+
+/* Resume scanning */
+void ble_ll_scan_chk_resume(void);
+
+/* Called when wait for response timer expires in scanning mode */
+void ble_ll_scan_wfr_timer_exp(void);
+
+/* Called when scan could be interrupted */
+void ble_ll_scan_interrupted(struct ble_ll_scan_sm *scansm);
+
+int ble_ll_scan_adv_decode_addr(uint8_t pdu_type, uint8_t *rxbuf,
+ struct ble_mbuf_hdr *ble_hdr,
+ uint8_t **addr, uint8_t *addr_type,
+ uint8_t **inita, uint8_t *init_addr_type,
+ int *ext_mode);
+
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
+int ble_ll_scan_update_aux_data(struct ble_mbuf_hdr *ble_hdr, uint8_t *rxbuf,
+ bool *adva_present);
+
+/* Initialize the extended scanner when we start initiating */
+struct hci_ext_create_conn;
+int ble_ll_scan_ext_initiator_start(struct hci_ext_create_conn *hcc,
+ struct ble_ll_scan_sm **sm);
+
+/* Called to parse extended advertising*/
+struct ble_ll_aux_data *ble_ll_scan_aux_data_ref(struct ble_ll_aux_data *aux_scan);
+void ble_ll_scan_aux_data_unref(struct ble_ll_aux_data *aux_scan);
+void ble_ll_scan_end_adv_evt(struct ble_ll_aux_data *aux_data);
+#endif
+
+/* Called to halt currently running scan */
+void ble_ll_scan_halt(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_BLE_LL_SCAN_ */
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_sched.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_sched.h
new file mode 100644
index 00000000..a614cf09
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_sched.h
@@ -0,0 +1,216 @@
+/*
+ * 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.
+ */
+
+#ifndef H_BLE_LL_SCHED_
+#define H_BLE_LL_SCHED_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Time per BLE scheduler slot */
+#define BLE_LL_SCHED_USECS_PER_SLOT (1250)
+#define BLE_LL_SCHED_32KHZ_TICKS_PER_SLOT (41) /* 1 tick = 30.517 usecs */
+
+/*
+ * Worst case time needed for scheduled advertising item. This is the longest
+ * possible time to receive a scan request and send a scan response (with the
+ * appropriate IFS time between them). This number is calculated using the
+ * following formula: IFS + SCAN_REQ + IFS + SCAN_RSP = 150 + 176 + 150 + 376.
+ * Note: worst case time to tx adv, rx scan req and send scan rsp is 1228 usecs.
+ * This assumes maximum sized advertising PDU and scan response PDU.
+ *
+ * For connectable advertising events no scan request is allowed. In this case
+ * we just need to receive a connect request PDU: IFS + CONNECT_REQ = 150 + 352.
+ * Note: worst-case is 376 + 150 + 352 = 878 usecs
+ *
+ * NOTE: The advertising PDU transmit time is NOT included here since we know
+ * how long that will take (worst-case is 376 usecs).
+ */
+#define BLE_LL_SCHED_ADV_MAX_USECS (852)
+#define BLE_LL_SCHED_DIRECT_ADV_MAX_USECS (502)
+#define BLE_LL_SCHED_MAX_ADV_PDU_USECS (376)
+
+/*
+ * This is the offset from the start of the scheduled item until the actual
+ * tx/rx should occur, in ticks.
+ */
+extern uint8_t g_ble_ll_sched_offset_ticks;
+
+/*
+ * This is the number of slots needed to transmit and receive a maximum
+ * size PDU, including an IFS time before each. The actual time is
+ * 2120 usecs for tx/rx and 150 for IFS = 4540 usecs.
+ */
+#define BLE_LL_SCHED_MAX_TXRX_SLOT (4 * BLE_LL_SCHED_USECS_PER_SLOT)
+
+/* BLE scheduler errors */
+#define BLE_LL_SCHED_ERR_OVERLAP (1)
+
+/* Types of scheduler events */
+#define BLE_LL_SCHED_TYPE_ADV (1)
+#define BLE_LL_SCHED_TYPE_SCAN (2)
+#define BLE_LL_SCHED_TYPE_CONN (3)
+#define BLE_LL_SCHED_TYPE_AUX_SCAN (4)
+#define BLE_LL_SCHED_TYPE_DTM (5)
+#define BLE_LL_SCHED_TYPE_PERIODIC (6)
+#define BLE_LL_SCHED_TYPE_SYNC (7)
+
+/* Return values for schedule callback. */
+#define BLE_LL_SCHED_STATE_RUNNING (0)
+#define BLE_LL_SCHED_STATE_DONE (1)
+
+/* Callback function */
+struct ble_ll_sched_item;
+typedef int (*sched_cb_func)(struct ble_ll_sched_item *sch);
+typedef void (*sched_remove_cb_func)(struct ble_ll_sched_item *sch);
+/*
+ * Strict connection scheduling (for the master) is different than how
+ * connections are normally scheduled. With strict connection scheduling we
+ * introduce the concept of a "period". A period is a collection of slots. Each
+ * slot is 1.25 msecs in length. The number of slots in a period is determined
+ * by the syscfg value BLE_LL_CONN_INIT_SLOTS. A collection of periods is called
+ * an epoch. The length of an epoch is determined by the number of connections
+ * (BLE_MAX_CONNECTIONS plus BLE_LL_ADD_STRICT_SCHED_PERIODS). Connections
+ * will be scheduled at period boundaries. Any scanning/initiating/advertising
+ * will be done in unused periods, if possible.
+ */
+#if MYNEWT_VAL(BLE_LL_STRICT_CONN_SCHEDULING)
+#define BLE_LL_SCHED_PERIODS (MYNEWT_VAL(BLE_MAX_CONNECTIONS) + \
+ MYNEWT_VAL(BLE_LL_ADD_STRICT_SCHED_PERIODS))
+
+struct ble_ll_sched_obj
+{
+ uint8_t sch_num_occ_periods;
+ uint32_t sch_occ_period_mask;
+ uint32_t sch_ticks_per_period;
+ uint32_t sch_ticks_per_epoch;
+ uint32_t sch_epoch_start;
+};
+
+extern struct ble_ll_sched_obj g_ble_ll_sched_data;
+
+/*
+ * XXX: TODO:
+ * -> How do we know epoch start is up to date? Not wrapped?
+ * -> for now, only do this with no more than 32 connections.
+ * -> Do not let initiating occur if no empty sched slots
+ */
+#endif
+
+/*
+ * Schedule item
+ * sched_type: This is the type of the schedule item.
+ * enqueued: Flag denoting if item is on the scheduler list. 0: no, 1:yes
+ * remainder: # of usecs from offset till tx/rx should occur
+ * txrx_offset: Number of ticks from start time until tx/rx should occur.
+ *
+ */
+struct ble_ll_sched_item
+{
+ uint8_t sched_type;
+ uint8_t enqueued;
+ uint8_t remainder;
+ uint32_t start_time;
+ uint32_t end_time;
+ void *cb_arg;
+ sched_cb_func sched_cb;
+ TAILQ_ENTRY(ble_ll_sched_item) link;
+};
+
+/* Initialize the scheduler */
+int ble_ll_sched_init(void);
+
+/* Remove item(s) from schedule */
+int ble_ll_sched_rmv_elem(struct ble_ll_sched_item *sch);
+
+void ble_ll_sched_rmv_elem_type(uint8_t type, sched_remove_cb_func remove_cb);
+
+/* Schedule a new master connection */
+struct ble_ll_conn_sm;
+int ble_ll_sched_master_new(struct ble_ll_conn_sm *connsm,
+ struct ble_mbuf_hdr *ble_hdr, uint8_t pyld_len);
+
+/* Schedule a new slave connection */
+int ble_ll_sched_slave_new(struct ble_ll_conn_sm *connsm);
+
+struct ble_ll_adv_sm;
+typedef void ble_ll_sched_adv_new_cb(struct ble_ll_adv_sm *advsm,
+ uint32_t sch_start, void *arg);
+
+/* Schedule a new advertising event */
+int ble_ll_sched_adv_new(struct ble_ll_sched_item *sch,
+ ble_ll_sched_adv_new_cb cb, void *arg);
+
+/* Schedule periodic advertising event */
+int ble_ll_sched_periodic_adv(struct ble_ll_sched_item *sch, uint32_t *start,
+ bool after_overlap);
+
+int ble_ll_sched_sync_reschedule(struct ble_ll_sched_item *sch,
+ uint32_t anchor_point,
+ uint8_t anchor_point_usecs,
+ uint32_t window_widening, int8_t phy_mode);
+int ble_ll_sched_sync(struct ble_ll_sched_item *sch,
+ uint32_t beg_cputime, uint32_t rem_usecs, uint32_t offset,
+ int8_t phy_mode);
+
+/* Reschedule an advertising event */
+int ble_ll_sched_adv_reschedule(struct ble_ll_sched_item *sch, uint32_t *start,
+ uint32_t max_delay_ticks);
+
+/* Reschedule and advertising pdu */
+int ble_ll_sched_adv_resched_pdu(struct ble_ll_sched_item *sch);
+
+/* Reschedule a connection that had previously been scheduled or that is over */
+int ble_ll_sched_conn_reschedule(struct ble_ll_conn_sm * connsm);
+
+/**
+ * Called to determine when the next scheduled event will occur.
+ *
+ * If there are not scheduled events this function returns 0; otherwise it
+ * returns 1 and *next_event_time is set to the start time of the next event.
+ *
+ * @param next_event_time cputime at which next scheduled event will occur
+ *
+ * @return int 0: No events are scheduled 1: there is an upcoming event
+ */
+int ble_ll_sched_next_time(uint32_t *next_event_time);
+
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
+struct ble_ll_scan_sm;
+struct ble_ll_aux_data;
+int ble_ll_sched_aux_scan(struct ble_mbuf_hdr *ble_hdr,
+ struct ble_ll_scan_sm *scansm,
+ struct ble_ll_aux_data *aux_scan);
+
+int ble_ll_sched_scan_req_over_aux_ptr(uint32_t chan, uint8_t phy_mode);
+#endif
+
+/* Stop the scheduler */
+void ble_ll_sched_stop(void);
+
+#if MYNEWT_VAL(BLE_LL_DTM)
+int ble_ll_sched_dtm(struct ble_ll_sched_item *sch);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_LL_SCHED_ */
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_sync.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_sync.h
new file mode 100644
index 00000000..712af6df
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_sync.h
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ */
+
+#ifndef H_BLE_LL_SYNC_
+#define H_BLE_LL_SYNC_
+
+#include <stdint.h>
+
+#include "nimble/ble.h"
+#include "controller/ble_ll_hci.h"
+#include "controller/ble_ll_conn.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct ble_ll_sync_sm;
+
+int ble_ll_sync_create(const uint8_t *cmdbuf, uint8_t len);
+int ble_ll_sync_cancel(ble_ll_hci_post_cmd_complete_cb *post_cmd_cb);
+int ble_ll_sync_terminate(const uint8_t *cmdbuf, uint8_t len);
+int ble_ll_sync_list_add(const uint8_t *cmdbuf, uint8_t len);
+int ble_ll_sync_list_remove(const uint8_t *cmdbuf, uint8_t len);
+int ble_ll_sync_list_clear(void);
+int ble_ll_sync_list_size(uint8_t *rspbuf, uint8_t *rsplen);
+int ble_ll_sync_receive_enable(const uint8_t *cmdbuf, uint8_t len);
+int ble_ll_sync_transfer(const uint8_t *cmdbuf, uint8_t len,
+ uint8_t *rspbuf, uint8_t *rsplen);
+
+void ble_ll_sync_periodic_ind(struct ble_ll_conn_sm *connsm,
+ const uint8_t *sync_ind, bool reports_disabled,
+ uint16_t max_skip, uint32_t sync_timeout);
+void ble_ll_sync_transfer_disconnected(struct ble_ll_conn_sm *connsm);
+
+void ble_ll_sync_info_event(const uint8_t *addr, uint8_t addr_type,
+ int rpa_index, uint8_t sid,
+ struct ble_mbuf_hdr *rxhdr,
+ const uint8_t *syncinfo);
+
+int ble_ll_sync_rx_isr_start(uint8_t pdu_type, struct ble_mbuf_hdr *rxhdr);
+int ble_ll_sync_rx_isr_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr);
+void ble_ll_sync_rx_pkt_in(struct os_mbuf *rxpdu, struct ble_mbuf_hdr *hdr);
+void ble_ll_sync_wfr_timer_exp(void);
+void ble_ll_sync_halt(void);
+void ble_ll_sync_rmvd_from_sched(struct ble_ll_sync_sm *sm);
+
+uint32_t ble_ll_sync_get_event_end_time(void);
+
+bool ble_ll_sync_enabled(void);
+
+void ble_ll_sync_reset(void);
+void ble_ll_sync_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_BLE_LL_SYNC_ */
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_test.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_test.h
new file mode 100644
index 00000000..32984c6b
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_test.h
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+#ifndef H_LL_TEST_
+#define H_LL_TEST_
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int ble_ll_csa2_test_all(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_trace.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_trace.h
new file mode 100644
index 00000000..7545b570
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_trace.h
@@ -0,0 +1,96 @@
+/*
+ * 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.
+ */
+
+#ifndef H_BLE_LL_TRACE_
+#define H_BLE_LL_TRACE_
+
+#include "os/os_trace_api.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define BLE_LL_TRACE_ID_SCHED 0
+#define BLE_LL_TRACE_ID_RX_START 1
+#define BLE_LL_TRACE_ID_RX_END 2
+#define BLE_LL_TRACE_ID_WFR_EXP 3
+#define BLE_LL_TRACE_ID_CTRL_RX 4
+#define BLE_LL_TRACE_ID_CONN_EV_START 5
+#define BLE_LL_TRACE_ID_CONN_EV_END 6
+#define BLE_LL_TRACE_ID_CONN_END 7
+#define BLE_LL_TRACE_ID_CONN_TX 8
+#define BLE_LL_TRACE_ID_CONN_RX 9
+#define BLE_LL_TRACE_ID_ADV_TXDONE 10
+#define BLE_LL_TRACE_ID_ADV_HALT 11
+#define BLE_LL_TRACE_ID_AUX_REF 12
+#define BLE_LL_TRACE_ID_AUX_UNREF 13
+
+#if MYNEWT_VAL(BLE_LL_SYSVIEW)
+
+extern uint32_t ble_ll_trace_off;
+
+void ble_ll_trace_init(void);
+
+static inline void
+ble_ll_trace_u32(unsigned id, uint32_t p1)
+{
+ os_trace_api_u32(ble_ll_trace_off + id, p1);
+}
+
+static inline void
+ble_ll_trace_u32x2(unsigned id, uint32_t p1, uint32_t p2)
+{
+ os_trace_api_u32x2(ble_ll_trace_off + id, p1, p2);
+}
+
+static inline void
+ble_ll_trace_u32x3(unsigned id, uint32_t p1, uint32_t p2, uint32_t p3)
+{
+ os_trace_api_u32x3(ble_ll_trace_off + id, p1, p2, p3);
+}
+
+#else
+
+static inline void
+ble_ll_trace_init(void)
+{
+}
+
+static inline void
+ble_ll_trace_u32(unsigned id, uint32_t p1)
+{
+}
+
+static inline void
+ble_ll_trace_u32x2(unsigned id, uint32_t p1, uint32_t p2)
+{
+}
+
+static inline void
+ble_ll_trace_u32x3(unsigned id, uint32_t p1, uint32_t p2, uint32_t p3)
+{
+}
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_BLE_LL_TRACE_ */
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_utils.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_utils.h
new file mode 100644
index 00000000..24830900
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_utils.h
@@ -0,0 +1,29 @@
+/*
+ * 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 <stdint.h>
+
+uint32_t ble_ll_utils_calc_access_addr(void);
+uint8_t ble_ll_utils_remapped_channel(uint8_t remap_index, const uint8_t *chanmap);
+uint8_t ble_ll_utils_calc_dci_csa2(uint16_t event_cntr, uint16_t channel_id,
+ uint8_t num_used_chans, const uint8_t *chanmap);
+uint8_t ble_ll_utils_calc_num_used_chans(const uint8_t *chanmap);
+uint32_t ble_ll_utils_calc_window_widening(uint32_t anchor_point,
+ uint32_t last_anchor_point,
+ uint8_t master_sca);
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_whitelist.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_whitelist.h
new file mode 100644
index 00000000..2d3b6c5d
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_ll_whitelist.h
@@ -0,0 +1,52 @@
+/*
+ * 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.
+ */
+
+#ifndef H_BLE_LL_WHITELIST_
+#define H_BLE_LL_WHITELIST_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Clear the whitelist */
+int ble_ll_whitelist_clear(void);
+
+/* Read the size of the whitelist */
+int ble_ll_whitelist_read_size(uint8_t *rspbuf, uint8_t *rsplen);
+
+/* Add a device to the whitelist */
+int ble_ll_whitelist_add(const uint8_t *cmdbuf, uint8_t len);
+
+/* Remove a device fromthe whitelist */
+int ble_ll_whitelist_rmv(const uint8_t *cmdbuf, uint8_t len);
+
+/* Enable whitelisting */
+void ble_ll_whitelist_enable(void);
+
+/* Disable whitelisting */
+void ble_ll_whitelist_disable(void);
+
+/* Boolean function returning true if address matches a whitelist entry */
+int ble_ll_whitelist_match(uint8_t *addr, uint8_t addr_type, int is_ident);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_BLE_LL_WHITELIST_ */
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_phy.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_phy.h
new file mode 100644
index 00000000..cabb0adb
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_phy.h
@@ -0,0 +1,242 @@
+/*
+ * 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.
+ */
+
+#ifndef H_BLE_PHY_
+#define H_BLE_PHY_
+
+#include "nimble/hci_common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct os_mbuf;
+
+/* Channel/Frequency defintions */
+#define BLE_PHY_NUM_CHANS (40)
+#define BLE_PHY_NUM_DATA_CHANS (37)
+#define BLE_PHY_CHAN0_FREQ_MHZ (2402)
+#define BLE_PHY_DATA_CHAN0_FREQ_MHZ (2404)
+#define BLE_PHY_CHAN_SPACING_MHZ (2)
+#define BLE_PHY_NUM_ADV_CHANS (3)
+#define BLE_PHY_ADV_CHAN_START (37)
+
+/* Power */
+#define BLE_PHY_MAX_PWR_DBM (10)
+
+/* Deviation */
+#define BLE_PHY_DEV_KHZ (185)
+#define BLE_PHY_BINARY_ZERO (-BLE_PHY_DEV)
+#define BLE_PHY_BINARY_ONE (BLE_PHY_DEV)
+
+/* Max. clock drift */
+#define BLE_PHY_MAX_DRIFT_PPM (50)
+
+/* Data rate */
+#define BLE_PHY_BIT_RATE_BPS (1000000)
+
+/* Macros */
+#define BLE_IS_ADV_CHAN(chan) (chan >= BLE_PHY_ADV_CHAN_START)
+#define BLE_IS_DATA_CHAN(chan) (chan < BLE_PHY_ADV_CHAN_START)
+
+/* PHY states */
+#define BLE_PHY_STATE_IDLE (0)
+#define BLE_PHY_STATE_RX (1)
+#define BLE_PHY_STATE_TX (2)
+
+/* BLE PHY transitions */
+#define BLE_PHY_TRANSITION_NONE (0)
+#define BLE_PHY_TRANSITION_RX_TX (1)
+#define BLE_PHY_TRANSITION_TX_RX (2)
+
+/* PHY error codes */
+#define BLE_PHY_ERR_RADIO_STATE (1)
+#define BLE_PHY_ERR_INIT (2)
+#define BLE_PHY_ERR_INV_PARAM (3)
+#define BLE_PHY_ERR_NO_BUFS (4)
+#define BLE_PHY_ERR_TX_LATE (5)
+#define BLE_PHY_ERR_RX_LATE (6)
+
+/* Maximun PDU length. Includes LL header of 2 bytes and 255 bytes payload. */
+#define BLE_PHY_MAX_PDU_LEN (257)
+
+/* Wait for response timer */
+typedef void (*ble_phy_tx_end_func)(void *arg);
+
+/* Initialize the PHY */
+int ble_phy_init(void);
+
+/* Reset the PHY */
+int ble_phy_reset(void);
+
+/* Set the PHY channel */
+int ble_phy_setchan(uint8_t chan, uint32_t access_addr, uint32_t crcinit);
+
+/* Set transmit start time */
+int ble_phy_tx_set_start_time(uint32_t cputime, uint8_t rem_usecs);
+
+/* Set receive start time */
+int ble_phy_rx_set_start_time(uint32_t cputime, uint8_t rem_usecs);
+
+/* Set the transmit end callback and argument */
+void ble_phy_set_txend_cb(ble_phy_tx_end_func txend_cb, void *arg);
+
+typedef uint8_t (*ble_phy_tx_pducb_t)(uint8_t *dptr, void *pducb_arg,
+ uint8_t *hdr_byte);
+
+/* Place the PHY into transmit mode */
+int ble_phy_tx(ble_phy_tx_pducb_t pducb, void *pducb_arg, uint8_t end_trans);
+
+/* Place the PHY into receive mode */
+int ble_phy_rx(void);
+
+/* Copies the received PHY buffer into the allocated pdu */
+void ble_phy_rxpdu_copy(uint8_t *dptr, struct os_mbuf *rxpdu);
+
+/* Set the transmit power */
+int ble_phy_txpwr_set(int dbm);
+
+/* Get highest allowed power from range */
+int ble_phy_txpower_round(int dbm);
+
+/* Get the transmit power */
+int ble_phy_txpwr_get(void);
+
+/* Set RX path power compensation value rounded to integer dB */
+void ble_phy_set_rx_pwr_compensation(int8_t compensation);
+
+/* Disable the PHY */
+void ble_phy_disable(void);
+
+#define BLE_PHY_WFR_ENABLE_RX (0)
+#define BLE_PHY_WFR_ENABLE_TXRX (1)
+
+void ble_phy_wfr_enable(int txrx, uint8_t tx_phy_mode, uint32_t wfr_usecs);
+
+/* Starts rf clock */
+void ble_phy_rfclk_enable(void);
+
+/* Stops rf clock */
+void ble_phy_rfclk_disable(void);
+
+/*
+ * Used to restart reception on same channel after wfr timer expiration or
+ * frame received.
+ */
+void ble_phy_restart_rx(void);
+
+/* Gets the current state of the PHY */
+int ble_phy_state_get(void);
+
+/* Gets current state of transceiver */
+uint8_t ble_phy_xcvr_state_get(void);
+
+/* Returns 'true' if a reception has started */
+int ble_phy_rx_started(void);
+
+/*
+ * Returns the maximum supported tx/rx PDU payload size, in bytes, for data
+ * channel PDUs (this does not apply to advertising channel PDUs). Note
+ * that the data channel PDU is composed of a 2-byte header, the payload, and
+ * an optional MIC. The maximum payload is 251 bytes.
+ */
+uint8_t ble_phy_max_data_pdu_pyld(void);
+
+/* Gets the current access address */
+uint32_t ble_phy_access_addr_get(void);
+
+/* Enable encryption */
+void ble_phy_encrypt_enable(uint64_t pkt_counter, uint8_t *iv, uint8_t *key,
+ uint8_t is_master);
+
+/* Disable encryption */
+void ble_phy_encrypt_disable(void);
+
+/* Set the packet counters and dir used by LE encyption */
+void ble_phy_encrypt_set_pkt_cntr(uint64_t pkt_counter, int dir);
+
+/* Enable phy resolving list */
+void ble_phy_resolv_list_enable(void);
+
+/* Disable phy resolving list */
+void ble_phy_resolv_list_disable(void);
+
+/*
+ * PHY mode values for 1M, 2M and Coded S=8 are the same as corresponding values
+ * of PHY. This makes conversion between 'phy' and 'phy_mode' easier and it also
+ * means that default coding for Coded will be S=8, unless explicitly translated
+ * to S=2.
+ */
+#define BLE_PHY_MODE_CODED_500KBPS (0)
+#define BLE_PHY_MODE_1M (1)
+#define BLE_PHY_MODE_2M (2)
+#define BLE_PHY_MODE_CODED_125KBPS (3)
+
+/* The number of different modes */
+#define BLE_PHY_NUM_MODE (4)
+
+/* PHY numbers (compatible with HCI) */
+#define BLE_PHY_1M (BLE_HCI_LE_PHY_1M)
+#define BLE_PHY_2M (BLE_HCI_LE_PHY_2M)
+#define BLE_PHY_CODED (BLE_HCI_LE_PHY_CODED)
+
+/* PHY bitmasks (compatible with HCI) */
+#define BLE_PHY_MASK_1M (BLE_HCI_LE_PHY_1M_PREF_MASK)
+#define BLE_PHY_MASK_2M (BLE_HCI_LE_PHY_2M_PREF_MASK)
+#define BLE_PHY_MASK_CODED (BLE_HCI_LE_PHY_CODED_PREF_MASK)
+
+#if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) || MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY))
+uint32_t ble_phy_mode_pdu_start_off(int phy);
+void ble_phy_mode_set(uint8_t tx_phy_mode, uint8_t rx_phy_mode);
+#else
+#define ble_phy_mode_pdu_start_off(phy) (40)
+
+#endif
+
+int ble_phy_get_cur_phy(void);
+static inline int ble_ll_phy_to_phy_mode(int phy, int phy_options)
+{
+ int phy_mode;
+
+ /*
+ * 'phy' value can be used as 'phy_mode' value unless S=2 coding is explicitly
+ * required. By default we'll use S=2 for Coded.
+ */
+ phy_mode = phy;
+
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY)
+ if (phy == BLE_PHY_CODED && phy_options == BLE_HCI_LE_PHY_CODED_S2_PREF) {
+ phy_mode = BLE_PHY_MODE_CODED_500KBPS;
+ }
+#endif
+
+ return phy_mode;
+}
+
+#if MYNEWT_VAL(BLE_LL_DTM)
+void ble_phy_enable_dtm(void);
+void ble_phy_disable_dtm(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_BLE_PHY_ */
diff --git a/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_phy_trace.h b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_phy_trace.h
new file mode 100644
index 00000000..64e55118
--- /dev/null
+++ b/src/libs/mynewt-nimble/nimble/controller/include/controller/ble_phy_trace.h
@@ -0,0 +1,96 @@
+/*
+ * 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.
+ */
+
+#ifndef H_BLE_PHY_TRACE_
+#define H_BLE_PHY_TRACE_
+
+#include "os/os_trace_api.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define BLE_PHY_TRACE_ID_START_TX 0
+#define BLE_PHY_TRACE_ID_START_RX 1
+#define BLE_PHY_TRACE_ID_DISABLE 2
+
+#if MYNEWT_VAL(BLE_PHY_SYSVIEW)
+
+extern uint32_t ble_phy_trace_off;
+
+void ble_phy_trace_init(void);
+
+static inline void
+ble_phy_trace_void(unsigned id)
+{
+ os_trace_api_void(ble_phy_trace_off + id);
+}
+
+static inline void
+ble_phy_trace_u32(unsigned id, uint32_t p1)
+{
+ os_trace_api_u32(ble_phy_trace_off + id, p1);
+}
+
+static inline void
+ble_phy_trace_u32x2(unsigned id, uint32_t p1, uint32_t p2)
+{
+ os_trace_api_u32x2(ble_phy_trace_off + id, p1, p2);
+}
+
+static inline void
+ble_phy_trace_u32x3(unsigned id, uint32_t p1, uint32_t p2, uint32_t p3)
+{
+ os_trace_api_u32x3(ble_phy_trace_off + id, p1, p2, p3);
+}
+
+#else
+
+static inline void
+ble_phy_trace_init(void)
+{
+}
+
+static inline void
+ble_phy_trace_void(unsigned id)
+{
+}
+
+static inline void
+ble_phy_trace_u32(unsigned id, uint32_t p1)
+{
+}
+
+static inline void
+ble_phy_trace_u32x2(unsigned id, uint32_t p1, uint32_t p2)
+{
+}
+
+static inline void
+ble_phy_trace_u32x3(unsigned id, uint32_t p1, uint32_t p2, uint32_t p3)
+{
+}
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_BLE_PHY_TRACE_ */