From ecec42e41b754f5848125a3ea3ce3ef591290360 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 14 Jan 2022 18:00:02 +0100 Subject: [PATCH] NimBLE update to v1.3.5 --- lib/libesp32_div/NimBLE-Arduino/CHANGELOG.md | 16 +- lib/libesp32_div/NimBLE-Arduino/library.json | 2 +- .../NimBLE-Arduino/library.properties | 2 +- .../src/{nimble => }/CODING_STANDARDS.md | 0 .../NimBLE-Arduino/src/{nimble => }/NOTICE | 3 +- .../NimBLE-Arduino/src/NimBLE2904.cpp | 8 +- .../NimBLE-Arduino/src/NimBLE2904.h | 8 +- .../NimBLE-Arduino/src/NimBLEAddress.cpp | 2 +- .../NimBLE-Arduino/src/NimBLEAddress.h | 7 +- .../src/NimBLEAdvertisedDevice.cpp | 8 +- .../src/NimBLEAdvertisedDevice.h | 13 +- .../NimBLE-Arduino/src/NimBLEAdvertising.cpp | 21 +- .../NimBLE-Arduino/src/NimBLEAdvertising.h | 13 +- .../NimBLE-Arduino/src/NimBLEBeacon.cpp | 2 +- .../src/NimBLECharacteristic.cpp | 35 +- .../NimBLE-Arduino/src/NimBLECharacteristic.h | 14 +- .../NimBLE-Arduino/src/NimBLEClient.cpp | 62 +- .../NimBLE-Arduino/src/NimBLEClient.h | 9 +- .../NimBLE-Arduino/src/NimBLEDescriptor.cpp | 24 +- .../NimBLE-Arduino/src/NimBLEDescriptor.h | 8 +- .../NimBLE-Arduino/src/NimBLEDevice.cpp | 197 +- .../NimBLE-Arduino/src/NimBLEDevice.h | 21 +- .../NimBLE-Arduino/src/NimBLEEddystoneTLM.cpp | 16 +- .../NimBLE-Arduino/src/NimBLEEddystoneTLM.h | 1 - .../NimBLE-Arduino/src/NimBLEEddystoneURL.cpp | 2 +- .../NimBLE-Arduino/src/NimBLEHIDDevice.cpp | 9 +- .../NimBLE-Arduino/src/NimBLEHIDDevice.h | 9 +- .../NimBLE-Arduino/src/NimBLELog.h | 94 +- .../src/NimBLERemoteCharacteristic.cpp | 50 +- .../src/NimBLERemoteCharacteristic.h | 8 +- .../src/NimBLERemoteDescriptor.cpp | 29 +- .../src/NimBLERemoteDescriptor.h | 7 +- .../src/NimBLERemoteService.cpp | 15 +- .../NimBLE-Arduino/src/NimBLERemoteService.h | 7 +- .../NimBLE-Arduino/src/NimBLEScan.cpp | 14 +- .../NimBLE-Arduino/src/NimBLEScan.h | 11 +- .../NimBLE-Arduino/src/NimBLESecurity.cpp | 2 +- .../NimBLE-Arduino/src/NimBLESecurity.h | 8 +- .../NimBLE-Arduino/src/NimBLEServer.cpp | 53 +- .../NimBLE-Arduino/src/NimBLEServer.h | 12 +- .../NimBLE-Arduino/src/NimBLEService.cpp | 25 +- .../NimBLE-Arduino/src/NimBLEService.h | 14 +- .../NimBLE-Arduino/src/NimBLEUUID.cpp | 3 +- .../NimBLE-Arduino/src/NimBLEUUID.h | 8 +- .../NimBLE-Arduino/src/NimBLEUtils.cpp | 11 +- .../NimBLE-Arduino/src/NimBLEUtils.h | 7 +- .../NimBLE-Arduino/src/{nimble => }/README.md | 16 +- .../src/{nimble => }/RELEASE_NOTES.md | 20 +- .../NimBLE-Arduino/src/console/console.h | 21 + .../esp-hci/src/esp_nimble_hci.c | 30 +- .../NimBLE-Arduino/src/esp_compiler.h | 33 + .../port/include => }/esp_nimble_cfg.h | 0 .../esp-hci/include => }/esp_nimble_hci.h | 4 +- .../port/include => }/esp_nimble_mem.h | 0 .../src/{nimble => }/ext/tinycrypt/AUTHORS | 0 .../src/{nimble => }/ext/tinycrypt/LICENSE | 0 .../src/{nimble => }/ext/tinycrypt/README | 0 .../src/{nimble => }/ext/tinycrypt/VERSION | 0 .../ext/tinycrypt/documentation/tinycrypt.rst | 0 .../ext/tinycrypt/src/aes_decrypt.c | 6 +- .../ext/tinycrypt/src/aes_encrypt.c | 6 +- .../{nimble => }/ext/tinycrypt/src/cbc_mode.c | 6 +- .../{nimble => }/ext/tinycrypt/src/ccm_mode.c | 6 +- .../ext/tinycrypt/src/cmac_mode.c | 8 +- .../{nimble => }/ext/tinycrypt/src/ctr_mode.c | 6 +- .../{nimble => }/ext/tinycrypt/src/ctr_prng.c | 6 +- .../src/{nimble => }/ext/tinycrypt/src/ecc.c | 4 +- .../{nimble => }/ext/tinycrypt/src/ecc_dh.c | 6 +- .../{nimble => }/ext/tinycrypt/src/ecc_dsa.c | 6 +- .../ext/tinycrypt/src/ecc_platform_specific.c | 0 .../src/{nimble => }/ext/tinycrypt/src/hmac.c | 6 +- .../ext/tinycrypt/src/hmac_prng.c | 8 +- .../{nimble => }/ext/tinycrypt/src/sha256.c | 6 +- .../{nimble => }/ext/tinycrypt/src/utils.c | 4 +- .../nimble/include => }/hal/hal_timer.h | 2 +- .../nimble/host/include => }/host/ble_att.h | 2 +- .../host/include => }/host/ble_eddystone.h | 0 .../nimble/host/include => }/host/ble_gap.h | 22 +- .../nimble/host/include => }/host/ble_gatt.h | 4 +- .../nimble/host/include => }/host/ble_hs.h | 34 +- .../host/include => }/host/ble_hs_adv.h | 2 +- .../host/include => }/host/ble_hs_hci.h | 0 .../nimble/host/include => }/host/ble_hs_id.h | 2 +- .../host/include => }/host/ble_hs_log.h | 4 +- .../host/include => }/host/ble_hs_mbuf.h | 0 .../host/include => }/host/ble_hs_pvcy.h | 2 +- .../host/include => }/host/ble_hs_stop.h | 0 .../host/include => }/host/ble_ibeacon.h | 0 .../nimble/host/include => }/host/ble_l2cap.h | 2 +- .../host/include => }/host/ble_monitor.h | 2 +- .../nimble/host/include => }/host/ble_sm.h | 2 +- .../nimble/host/include => }/host/ble_store.h | 2 +- .../nimble/host/include => }/host/ble_uuid.h | 0 .../host/util/include => }/host/util/util.h | 0 .../porting/nimble/include => }/log/log.h | 0 .../nimble/include => }/log_common/ignore.h | 0 .../include => }/log_common/log_common.h | 2 +- .../nimble/include => }/logcfg/logcfg.h | 5 +- .../porting/nimble/include => }/mem/mem.h | 0 .../host/mesh/include => }/mesh/access.h | 0 .../host/mesh/include => }/mesh/cfg_cli.h | 0 .../host/mesh/include => }/mesh/cfg_srv.h | 0 .../nimble/host/mesh/include => }/mesh/glue.h | 35 +- .../host/mesh/include => }/mesh/health_cli.h | 0 .../host/mesh/include => }/mesh/health_srv.h | 0 .../nimble/host/mesh/include => }/mesh/main.h | 0 .../nimble/host/mesh/include => }/mesh/mesh.h | 4 +- .../host/mesh/include => }/mesh/model_cli.h | 0 .../host/mesh/include => }/mesh/model_srv.h | 0 .../host/mesh/include => }/mesh/porting.h | 0 .../host/mesh/include => }/mesh/proxy.h | 0 .../host/mesh/include => }/mesh/slist.h | 0 .../host/mesh/include => }/mesh/testing.h | 0 .../nimble/include => }/modlog/modlog.h | 60 +- .../NimBLE-Arduino/src/nimble/LICENSE | 217 - .../nimble/{nimble/include/nimble => }/ble.h | 4 +- .../include/nimble => }/ble_hci_trans.h | 2 +- .../src/nimble/console/console.h | 16 - .../esp_port/esp-hci/include/esp_compiler.h | 51 - .../{nimble/include/nimble => }/hci_common.h | 0 .../{nimble => }/host/mesh/src/access.c | 11 +- .../{nimble => }/host/mesh/src/access.h | 2 +- .../nimble/{nimble => }/host/mesh/src/adv.c | 23 +- .../nimble/{nimble => }/host/mesh/src/adv.h | 2 +- .../{nimble => }/host/mesh/src/atomic.h | 0 .../{nimble => }/host/mesh/src/beacon.c | 9 +- .../{nimble => }/host/mesh/src/beacon.h | 2 +- .../src/nimble/host/mesh/src/ble_att_priv.h | 307 + .../host => host/mesh}/src/ble_gatt_priv.h | 6 +- .../nimble/host/mesh/src/ble_hs_conn_priv.h | 128 + .../nimble/host/mesh/src/ble_l2cap_coc_priv.h | 85 + .../src/nimble/host/mesh/src/ble_l2cap_priv.h | 125 + .../nimble/host/mesh/src/ble_l2cap_sig_priv.h | 124 + .../{nimble => }/host/mesh/src/cfg_cli.c | 7 +- .../{nimble => }/host/mesh/src/cfg_srv.c | 7 +- .../{nimble => }/host/mesh/src/crypto.c | 16 +- .../{nimble => }/host/mesh/src/crypto.h | 2 +- .../{nimble => }/host/mesh/src/foundation.h | 0 .../{nimble => }/host/mesh/src/friend.c | 11 +- .../{nimble => }/host/mesh/src/friend.h | 2 +- .../nimble/{nimble => }/host/mesh/src/glue.c | 10 +- .../{nimble => }/host/mesh/src/health_cli.c | 9 +- .../{nimble => }/host/mesh/src/health_srv.c | 7 +- .../{nimble => }/host/mesh/src/light_model.c | 9 +- .../{nimble => }/host/mesh/src/light_model.h | 4 +- .../nimble/{nimble => }/host/mesh/src/lpn.c | 7 +- .../nimble/{nimble => }/host/mesh/src/lpn.h | 2 +- .../nimble/{nimble => }/host/mesh/src/mesh.c | 11 +- .../{nimble => }/host/mesh/src/mesh_priv.h | 0 .../{nimble => }/host/mesh/src/model_cli.c | 10 +- .../{nimble => }/host/mesh/src/model_srv.c | 9 +- .../nimble/{nimble => }/host/mesh/src/net.c | 38 +- .../nimble/{nimble => }/host/mesh/src/net.h | 4 +- .../nimble/{nimble => }/host/mesh/src/nodes.c | 7 +- .../nimble/{nimble => }/host/mesh/src/nodes.h | 0 .../nimble/{nimble => }/host/mesh/src/prov.c | 7 +- .../nimble/{nimble => }/host/mesh/src/prov.h | 6 +- .../nimble/{nimble => }/host/mesh/src/proxy.c | 13 +- .../nimble/{nimble => }/host/mesh/src/proxy.h | 2 +- .../{nimble => }/host/mesh/src/settings.c | 9 +- .../{nimble => }/host/mesh/src/settings.h | 0 .../nimble/{nimble => }/host/mesh/src/shell.c | 4 +- .../nimble/{nimble => }/host/mesh/src/shell.h | 0 .../mesh/src}/src/ble_att_cmd_priv.h | 2 +- .../host => host/mesh/src}/src/ble_att_priv.h | 8 +- .../host => host/mesh/src}/src/ble_gap_priv.h | 6 +- .../nimble/host/mesh/src/src/ble_gatt_priv.h | 199 + .../mesh/src}/src/ble_hs_adv_priv.h | 0 .../mesh/src}/src/ble_hs_atomic_priv.h | 0 .../mesh/src}/src/ble_hs_conn_priv.h | 0 .../mesh/src}/src/ble_hs_flow_priv.h | 0 .../mesh/src}/src/ble_hs_hci_priv.h | 2 +- .../mesh/src}/src/ble_hs_id_priv.h | 0 .../mesh/src}/src/ble_hs_mbuf_priv.h | 0 .../mesh/src}/src/ble_hs_periodic_sync_priv.h | 2 +- .../host => host/mesh/src}/src/ble_hs_priv.h | 8 +- .../mesh/src}/src/ble_hs_pvcy_priv.h | 0 .../mesh/src}/src/ble_hs_resolv_priv.h | 0 .../mesh/src}/src/ble_hs_startup_priv.h | 0 .../mesh/src}/src/ble_l2cap_coc_priv.h | 8 +- .../mesh/src}/src/ble_l2cap_priv.h | 8 +- .../mesh/src}/src/ble_l2cap_sig_priv.h | 2 +- .../mesh/src}/src/ble_monitor_priv.h | 0 .../host => host/mesh/src}/src/ble_sm_priv.h | 6 +- .../mesh/src}/src/ble_uuid_priv.h | 2 +- .../src/nimble/host/mesh/src/testing.c | 200 + .../src/nimble/host/mesh/src/testing.h | 23 + .../{nimble => }/host/mesh/src/transport.c | 7 +- .../{nimble => }/host/mesh/src/transport.h | 4 +- .../host/services/ans/src/ble_svc_ans.c | 10 +- .../host/services/bas/src/ble_svc_bas.c | 10 +- .../host/services/gap/src/ble_svc_gap.c | 8 +- .../host/services/gatt/src/ble_svc_gatt.c | 6 +- .../host/services/ias/src/ble_svc_ias.c | 6 +- .../host/services/ipss/src/ble_svc_ipss.c | 6 +- .../host/services/lls/src/ble_svc_lls.c | 6 +- .../host/services/tps/src/ble_hs_hci_priv.h | 124 + .../host/services/tps/src/ble_svc_tps.c | 10 +- .../nimble/{nimble => }/host/src/ble_att.c | 0 .../{nimble => }/host/src/ble_att_clt.c | 6 +- .../{nimble => }/host/src/ble_att_cmd.c | 8 +- .../src/nimble/host/src/ble_att_cmd_priv.h | 449 ++ .../src/nimble/host/src/ble_att_priv.h | 301 + .../{nimble => }/host/src/ble_att_svr.c | 19 +- .../{nimble => }/host/src/ble_eddystone.c | 6 +- .../nimble/{nimble => }/host/src/ble_gap.c | 16 +- .../src/nimble/host/src/ble_gap_priv.h | 154 + .../src/nimble/host/src/ble_gatt_priv.h | 199 + .../nimble/{nimble => }/host/src/ble_gattc.c | 8 +- .../nimble/{nimble => }/host/src/ble_gatts.c | 31 +- .../{nimble => }/host/src/ble_gatts_lcl.c | 6 +- .../src/nimble/{nimble => }/host/src/ble_hs.c | 22 +- .../nimble/{nimble => }/host/src/ble_hs_adv.c | 4 +- .../src/ble_hs_adv_priv.h} | 25 +- .../{nimble => }/host/src/ble_hs_atomic.c | 0 .../src/nimble/host/src/ble_hs_atomic_priv.h | 41 + .../nimble/{nimble => }/host/src/ble_hs_cfg.c | 4 +- .../{nimble => }/host/src/ble_hs_conn.c | 6 +- .../src/nimble/host/src/ble_hs_conn_priv.h | 148 + .../{nimble => }/host/src/ble_hs_flow.c | 4 +- .../src/ble_hs_flow_priv.h} | 11 +- .../nimble/{nimble => }/host/src/ble_hs_hci.c | 8 +- .../{nimble => }/host/src/ble_hs_hci_cmd.c | 59 +- .../{nimble => }/host/src/ble_hs_hci_evt.c | 10 +- .../src/nimble/host/src/ble_hs_hci_priv.h | 124 + .../{nimble => }/host/src/ble_hs_hci_util.c | 4 +- .../nimble/{nimble => }/host/src/ble_hs_id.c | 2 +- .../src/nimble/host/src/ble_hs_id_priv.h | 45 + .../nimble/{nimble => }/host/src/ble_hs_log.c | 4 +- .../{nimble => }/host/src/ble_hs_mbuf.c | 2 +- .../src/nimble/host/src/ble_hs_mbuf_priv.h | 38 + .../{nimble => }/host/src/ble_hs_misc.c | 2 +- .../{nimble => }/host/src/ble_hs_mqueue.c | 0 .../host/src/ble_hs_periodic_sync.c | 6 +- .../host/src/ble_hs_periodic_sync_priv.h | 55 + .../src/nimble/host/src/ble_hs_priv.h | 157 + .../{nimble => }/host/src/ble_hs_pvcy.c | 4 +- .../src/nimble/host/src/ble_hs_pvcy_priv.h | 46 + .../{nimble => }/host/src/ble_hs_resolv.c | 10 +- .../src/nimble/host/src/ble_hs_resolv_priv.h | 111 + .../{nimble => }/host/src/ble_hs_shutdown.c | 2 +- .../{nimble => }/host/src/ble_hs_startup.c | 4 +- .../src/ble_hs_startup_priv.h} | 8 +- .../{nimble => }/host/src/ble_hs_stop.c | 8 +- .../{nimble => }/host/src/ble_ibeacon.c | 2 +- .../nimble/{nimble => }/host/src/ble_l2cap.c | 8 +- .../{nimble => }/host/src/ble_l2cap_coc.c | 2 +- .../src/nimble/host/src/ble_l2cap_coc_priv.h | 106 + .../src/nimble/host/src/ble_l2cap_priv.h | 144 + .../{nimble => }/host/src/ble_l2cap_sig.c | 4 +- .../{nimble => }/host/src/ble_l2cap_sig_cmd.c | 0 .../src/nimble/host/src/ble_l2cap_sig_priv.h | 184 + .../{nimble => }/host/src/ble_monitor.c | 8 +- .../src/nimble/host/src/ble_monitor_priv.h | 100 + .../src/nimble/{nimble => }/host/src/ble_sm.c | 6 +- .../nimble/{nimble => }/host/src/ble_sm_alg.c | 16 +- .../nimble/{nimble => }/host/src/ble_sm_cmd.c | 6 +- .../{nimble => }/host/src/ble_sm_lgcy.c | 6 +- .../src/nimble/host/src/ble_sm_priv.h | 428 ++ .../nimble/{nimble => }/host/src/ble_sm_sc.c | 4 +- .../nimble/{nimble => }/host/src/ble_store.c | 2 +- .../{nimble => }/host/src/ble_store_util.c | 2 +- .../nimble/{nimble => }/host/src/ble_uuid.c | 6 +- .../src/nimble/host/src/ble_uuid_priv.h | 45 + .../host/store/config/src/ble_store_config.c | 8 +- .../store/config/src/ble_store_config_priv.h | 0 .../host/store/config/src/ble_store_nvs.c | 11 +- .../nimble/host/store/ram/src/ble_store_ram.c | 497 ++ .../nimble/{nimble => }/host/util/src/addr.c | 6 +- .../controller/include/controller/ble_hw.h | 116 - .../controller/include/controller/ble_ll.h | 584 -- .../include/controller/ble_ll_adv.h | 209 - .../include/controller/ble_ll_conn.h | 425 -- .../include/controller/ble_ll_ctrl.h | 313 - .../include/controller/ble_ll_hci.h | 75 - .../include/controller/ble_ll_resolv.h | 116 - .../include/controller/ble_ll_rfmgmt.h | 63 - .../include/controller/ble_ll_scan.h | 293 - .../include/controller/ble_ll_sched.h | 216 - .../include/controller/ble_ll_sync.h | 74 - .../include/controller/ble_ll_trace.h | 96 - .../include/controller/ble_ll_whitelist.h | 52 - .../controller/include/controller/ble_phy.h | 242 - .../include/controller/ble_phy_trace.h | 96 - .../src/nimble/nimble/controller/pkg.yml | 38 - .../src/nimble/nimble/controller/src/ble_ll.c | 1720 ------ .../nimble/nimble/controller/src/ble_ll_adv.c | 5143 ----------------- .../nimble/controller/src/ble_ll_conn.c | 4279 -------------- .../nimble/controller/src/ble_ll_conn_hci.c | 1898 ------ .../nimble/controller/src/ble_ll_conn_priv.h | 226 - .../nimble/controller/src/ble_ll_ctrl.c | 2747 --------- .../nimble/nimble/controller/src/ble_ll_dtm.c | 728 --- .../nimble/controller/src/ble_ll_dtm_priv.h | 40 - .../nimble/nimble/controller/src/ble_ll_hci.c | 1519 ----- .../nimble/controller/src/ble_ll_hci_ev.c | 526 -- .../nimble/controller/src/ble_ll_priv.h | 51 - .../nimble/controller/src/ble_ll_rand.c | 188 - .../nimble/controller/src/ble_ll_resolv.c | 755 --- .../nimble/controller/src/ble_ll_rfmgmt.c | 348 -- .../nimble/controller/src/ble_ll_scan.c | 3981 ------------- .../nimble/controller/src/ble_ll_sched.c | 1838 ------ .../nimble/controller/src/ble_ll_supp_cmd.c | 461 -- .../nimble/controller/src/ble_ll_sync.c | 2248 ------- .../nimble/controller/src/ble_ll_trace.c | 56 - .../nimble/controller/src/ble_ll_utils.c | 303 - .../nimble/controller/src/ble_ll_whitelist.c | 297 - .../src/nimble/nimble/controller/syscfg.yml | 434 -- .../nimble/drivers/nrf51/include/ble/xcvr.h | 51 - .../src/nimble/nimble/drivers/nrf51/pkg.yml | 31 - .../nimble/nimble/drivers/nrf51/src/ble_hw.c | 491 -- .../nimble/nimble/drivers/nrf51/src/ble_phy.c | 1527 ----- .../nimble/drivers/nrf52/include/ble/xcvr.h | 55 - .../src/nimble/nimble/drivers/nrf52/pkg.yml | 31 - .../nimble/nimble/drivers/nrf52/src/ble_hw.c | 491 -- .../nimble/nimble/drivers/nrf52/src/ble_phy.c | 2120 ------- .../nimble/drivers/nrf52/src/ble_phy_trace.c | 47 - .../nimble/nimble/drivers/nrf52/syscfg.yml | 75 - .../src/nimble/nimble/host/mesh/pkg.yml | 49 - .../src/nimble/nimble/host/mesh/syscfg.yml | 661 --- .../src/nimble/nimble/host/pkg.yml | 55 - .../src/nimble/nimble/host/pts/README.txt | 8 - .../src/nimble/nimble/host/pts/pts-gap.txt | 367 -- .../src/nimble/nimble/host/pts/pts-gatt.txt | 508 -- .../src/nimble/nimble/host/pts/pts-l2cap.txt | 304 - .../src/nimble/nimble/host/pts/pts-sm.txt | 310 - .../host/pts/tpg/94654-20170317-085122560.tpg | 1026 ---- .../host/pts/tpg/94654-20170317-085441153.pts | 289 - .../nimble/nimble/host/services/ans/pkg.yml | 34 - .../nimble/host/services/ans/syscfg.yml | 30 - .../nimble/nimble/host/services/bas/pkg.yml | 34 - .../nimble/host/services/bas/syscfg.yml | 34 - .../dis/include/services/dis/ble_svc_dis.h | 113 - .../nimble/nimble/host/services/dis/pkg.yml | 34 - .../host/services/dis/src/ble_svc_dis.c | 331 -- .../nimble/host/services/dis/syscfg.yml | 109 - .../nimble/nimble/host/services/gap/pkg.yml | 34 - .../nimble/host/services/gap/syscfg.yml | 83 - .../nimble/nimble/host/services/gatt/pkg.yml | 34 - .../nimble/host/services/gatt/syscfg.yml | 24 - .../nimble/nimble/host/services/ias/pkg.yml | 34 - .../nimble/host/services/ias/syscfg.yml | 23 - .../nimble/nimble/host/services/ipss/pkg.yml | 35 - .../nimble/host/services/ipss/syscfg.yml | 24 - .../nimble/nimble/host/services/lls/pkg.yml | 34 - .../nimble/host/services/lls/syscfg.yml | 22 - .../nimble/nimble/host/services/tps/pkg.yml | 34 - .../nimble/host/services/tps/syscfg.yml | 23 - .../nimble/nimble/host/store/config/pkg.yml | 38 - .../store/config/src/ble_store_config_conf.c | 296 - .../nimble/host/store/config/syscfg.yml | 27 - .../src/nimble/nimble/host/syscfg.yml | 471 -- .../nimble/nimble/host/tools/log2smtest.rb | 1029 ---- .../src/nimble/nimble/host/util/pkg.yml | 29 - .../src/nimble/nimble/host/util/syscfg.yml | 19 - .../NimBLE-Arduino/src/nimble/nimble/pkg.yml | 30 - .../src/nimble/nimble/syscfg.yml | 83 - .../src/nimble/nimble/transport/pkg.yml | 45 - .../src/nimble/nimble/transport/ram/pkg.yml | 36 - .../nimble/transport/ram/src/ble_hci_ram.c | 241 - .../nimble/nimble/transport/ram/syscfg.yml | 48 - .../src/nimble/nimble/transport/syscfg.yml | 68 - .../{nimble/include/nimble => }/nimble_npl.h | 5 +- .../include/nimble => }/nimble_npl_os.h | 50 +- .../{nimble/include/nimble => }/nimble_opt.h | 2 +- .../include/nimble => }/nimble_opt_auto.h | 2 +- .../nimble/include/nimble => }/nimble_port.h | 9 +- .../nimble => }/nimble_port_freertos.h | 6 +- .../include/nimble => }/npl_freertos.h | 8 +- .../NimBLE-Arduino/src/nimconfig.h | 18 +- .../porting/nimble/include => }/os/endian.h | 0 .../porting/nimble/include => }/os/os.h | 14 +- .../nimble/include => }/os/os_cputime.h | 6 +- .../porting/nimble/include => }/os/os_error.h | 2 +- .../porting/nimble/include => }/os/os_mbuf.h | 2 +- .../nimble/include => }/os/os_mempool.h | 4 +- .../nimble/include => }/os/os_trace_api.h | 0 .../porting/nimble/include => }/os/queue.h | 0 .../porting/nimble/include => }/os/util.h | 0 .../esp_port => }/port/src/esp_nimble_mem.c | 4 +- .../nimble/include/nimble/nimble_port.h | 48 + .../{nimble => }/porting/nimble/src/endian.c | 2 +- .../porting/nimble/src/hal_timer.c | 11 +- .../src/{nimble => }/porting/nimble/src/mem.c | 25 +- .../porting/nimble/src/nimble_port.c | 22 +- .../porting/nimble/src/os_cputime.c | 6 +- .../porting/nimble/src/os_cputime_pwr2.c | 2 +- .../{nimble => }/porting/nimble/src/os_mbuf.c | 2 +- .../porting/nimble/src/os_mempool.c | 2 +- .../porting/nimble/src/os_msys_init.c | 19 +- .../npl/freertos/src/nimble_port_freertos.c | 40 +- .../npl/freertos/src/npl_os_freertos.c | 205 +- .../include => }/services/ans/ble_svc_ans.h | 0 .../include => }/services/bas/ble_svc_bas.h | 0 .../include => }/services/gap/ble_svc_gap.h | 0 .../include => }/services/gatt/ble_svc_gatt.h | 0 .../include => }/services/ias/ble_svc_ias.h | 0 .../include => }/services/ipss/ble_svc_ipss.h | 0 .../include => }/services/lls/ble_svc_lls.h | 0 .../include => }/services/tps/ble_svc_tps.h | 0 .../NimBLE-Arduino/src/src/ble_hs_hci_priv.h | 124 + .../NimBLE-Arduino/src/src/ble_sm_priv.h | 428 ++ .../porting/nimble/include => }/stats/stats.h | 0 .../store/config/ble_store_config.h | 0 .../src/store/ram/ble_store_ram.h | 39 + .../nimble/include => }/syscfg/syscfg.h | 6 +- .../nimble/include => }/sysflash/sysflash.h | 0 .../nimble/include => }/sysinit/sysinit.h | 0 .../NimBLE-Arduino/src/tinycrypt/AUTHORS | 15 + .../NimBLE-Arduino/src/tinycrypt/LICENSE | 61 + .../NimBLE-Arduino/src/tinycrypt/README | 71 + .../NimBLE-Arduino/src/tinycrypt/VERSION | 1 + .../tinycrypt/include => }/tinycrypt/aes.h | 0 .../include => }/tinycrypt/cbc_mode.h | 2 +- .../include => }/tinycrypt/ccm_mode.h | 2 +- .../include => }/tinycrypt/cmac_mode.h | 2 +- .../include => }/tinycrypt/constants.h | 0 .../include => }/tinycrypt/ctr_mode.h | 4 +- .../include => }/tinycrypt/ctr_prng.h | 2 +- .../src/tinycrypt/documentation/tinycrypt.rst | 352 ++ .../tinycrypt/include => }/tinycrypt/ecc.h | 0 .../tinycrypt/include => }/tinycrypt/ecc_dh.h | 2 +- .../include => }/tinycrypt/ecc_dsa.h | 2 +- .../tinycrypt/ecc_platform_specific.h | 0 .../tinycrypt/include => }/tinycrypt/hmac.h | 2 +- .../include => }/tinycrypt/hmac_prng.h | 4 +- .../tinycrypt/include => }/tinycrypt/sha256.h | 0 .../tinycrypt/include => }/tinycrypt/utils.h | 0 427 files changed, 6914 insertions(+), 46658 deletions(-) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/CODING_STANDARDS.md (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/NOTICE (61%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/README.md (90%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/RELEASE_NOTES.md (56%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/console/console.h rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/esp_port => }/esp-hci/src/esp_nimble_hci.c (96%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/esp_compiler.h rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/esp_port/port/include => }/esp_nimble_cfg.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/esp_port/esp-hci/include => }/esp_nimble_hci.h (98%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/esp_port/port/include => }/esp_nimble_mem.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/AUTHORS (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/LICENSE (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/README (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/VERSION (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/documentation/tinycrypt.rst (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/src/aes_decrypt.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/src/aes_encrypt.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/src/cbc_mode.c (96%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/src/ccm_mode.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/src/cmac_mode.c (97%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/src/ctr_mode.c (95%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/src/ctr_prng.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/src/ecc.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/src/ecc_dh.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/src/ecc_dsa.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/src/ecc_platform_specific.c (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/src/hmac.c (97%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/src/hmac_prng.c (97%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/src/sha256.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/ext/tinycrypt/src/utils.c (96%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/hal/hal_timer.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_att.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_eddystone.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_gap.h (98%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_gatt.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_hs.h (96%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_hs_adv.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_hs_hci.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_hs_id.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_hs_log.h (92%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_hs_mbuf.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_hs_pvcy.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_hs_stop.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_ibeacon.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_l2cap.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_monitor.h (95%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_sm.h (98%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_store.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/include => }/host/ble_uuid.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/util/include => }/host/util/util.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/log/log.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/log_common/ignore.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/log_common/log_common.h (97%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/logcfg/logcfg.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/mem/mem.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/mesh/include => }/mesh/access.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/mesh/include => }/mesh/cfg_cli.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/mesh/include => }/mesh/cfg_srv.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/mesh/include => }/mesh/glue.h (95%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/mesh/include => }/mesh/health_cli.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/mesh/include => }/mesh/health_srv.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/mesh/include => }/mesh/main.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/mesh/include => }/mesh/mesh.h (78%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/mesh/include => }/mesh/model_cli.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/mesh/include => }/mesh/model_srv.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/mesh/include => }/mesh/porting.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/mesh/include => }/mesh/proxy.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/mesh/include => }/mesh/slist.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/mesh/include => }/mesh/testing.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/modlog/modlog.h (79%) delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/LICENSE rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/include/nimble => }/ble.h (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/include/nimble => }/ble_hci_trans.h (99%) delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/console/console.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/esp-hci/include/esp_compiler.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/include/nimble => }/hci_common.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/access.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/access.h (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/adv.c (94%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/adv.h (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/atomic.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/beacon.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/beacon.h (89%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_att_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh}/src/ble_gatt_priv.h (97%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_hs_conn_priv.h create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_l2cap_coc_priv.h create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_l2cap_priv.h create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_l2cap_sig_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/cfg_cli.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/cfg_srv.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/crypto.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/crypto.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/foundation.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/friend.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/friend.h (97%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/glue.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/health_cli.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/health_srv.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/light_model.c (87%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/light_model.h (87%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/lpn.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/lpn.h (97%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/mesh.c (96%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/mesh_priv.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/model_cli.c (97%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/model_srv.c (97%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/net.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/net.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/nodes.c (96%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/nodes.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/prov.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/prov.h (85%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/proxy.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/proxy.h (97%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/settings.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/settings.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/shell.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/shell.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_att_cmd_priv.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_att_priv.h (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_gap_priv.h (97%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_gatt_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_hs_adv_priv.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_hs_atomic_priv.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_hs_conn_priv.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_hs_flow_priv.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_hs_hci_priv.h (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_hs_id_priv.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_hs_mbuf_priv.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_hs_periodic_sync_priv.h (97%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_hs_priv.h (95%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_hs_pvcy_priv.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_hs_resolv_priv.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_hs_startup_priv.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_l2cap_coc_priv.h (93%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_l2cap_priv.h (95%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_l2cap_sig_priv.h (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_monitor_priv.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_sm_priv.h (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/host => host/mesh/src}/src/ble_uuid_priv.h (96%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/testing.c create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/testing.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/transport.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/mesh/src/transport.h (96%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/services/ans/src/ble_svc_ans.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/services/bas/src/ble_svc_bas.c (92%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/services/gap/src/ble_svc_gap.c (97%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/services/gatt/src/ble_svc_gatt.c (95%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/services/ias/src/ble_svc_ias.c (96%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/services/ipss/src/ble_svc_ipss.c (89%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/services/lls/src/ble_svc_lls.c (97%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/tps/src/ble_hs_hci_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/services/tps/src/ble_svc_tps.c (91%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_att.c (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_att_clt.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_att_cmd.c (98%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_cmd_priv.h create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_att_svr.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_eddystone.c (97%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_gap.c (99%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gap_priv.h create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gatt_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_gattc.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_gatts.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_gatts_lcl.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs.c (97%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_adv.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/controller/include/controller/ble_ll_utils.h => host/src/ble_hs_adv_priv.h} (58%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_atomic.c (100%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_atomic_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_cfg.c (92%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_conn.c (98%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_conn_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_flow.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/transport/ram/include/transport/ram/ble_hci_ram.h => host/src/ble_hs_flow_priv.h} (80%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_hci.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_hci_cmd.c (79%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_hci_evt.c (99%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_hci_util.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_id.c (99%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_id_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_log.c (92%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_mbuf.c (98%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_mbuf_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_misc.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_mqueue.c (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_periodic_sync.c (95%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_periodic_sync_priv.h create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_pvcy.c (98%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_pvcy_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_resolv.c (98%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_resolv_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_shutdown.c (97%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_startup.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/controller/include/controller/ble_ll_test.h => host/src/ble_hs_startup_priv.h} (90%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_hs_stop.c (97%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_ibeacon.c (97%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_l2cap.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_l2cap_coc.c (99%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_coc_priv.h create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_l2cap_sig.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_l2cap_sig_cmd.c (100%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_sig_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_monitor.c (98%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_monitor_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_sm.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_sm_alg.c (97%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_sm_cmd.c (92%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_sm_lgcy.c (97%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_sm_sc.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_store.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_store_util.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/src/ble_uuid.c (97%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_uuid_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/store/config/src/ble_store_config.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/store/config/src/ble_store_config_priv.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/store/config/src/ble_store_nvs.c (98%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/host/store/ram/src/ble_store_ram.c rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble => }/host/util/src/addr.c (94%) delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_hw.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_adv.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_conn.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_ctrl.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_hci.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_resolv.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_rfmgmt.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_scan.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_sched.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_sync.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_trace.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_whitelist.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_phy.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_phy_trace.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_adv.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_conn.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_conn_hci.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_conn_priv.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_ctrl.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_dtm.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_dtm_priv.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_hci.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_hci_ev.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_priv.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_rand.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_resolv.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_rfmgmt.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_scan.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_sched.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_supp_cmd.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_sync.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_trace.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_utils.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_whitelist.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/include/ble/xcvr.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/src/ble_hw.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/src/ble_phy.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/include/ble/xcvr.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/src/ble_hw.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/src/ble_phy.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/src/ble_phy_trace.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/README.txt delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-gap.txt delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-gatt.txt delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-l2cap.txt delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-sm.txt delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/tpg/94654-20170317-085122560.tpg delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/tpg/94654-20170317-085441153.pts delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ans/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ans/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/bas/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/bas/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/include/services/dis/ble_svc_dis.h delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/src/ble_svc_dis.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gap/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gap/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gatt/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gatt/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ias/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ias/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ipss/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ipss/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/lls/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/lls/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/tps/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/tps/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/src/ble_store_config_conf.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/tools/log2smtest.rb delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/util/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/util/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/ram/pkg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/ram/src/ble_hci_ram.c delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/ram/syscfg.yml delete mode 100644 lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/syscfg.yml rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/include/nimble => }/nimble_npl.h (97%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{porting/npl/freertos/include/nimble => }/nimble_npl_os.h (89%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/include/nimble => }/nimble_opt.h (96%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{nimble/include/nimble => }/nimble_opt_auto.h (98%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{porting/nimble/include/nimble => }/nimble_port.h (88%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{porting/npl/freertos/include/nimble => }/nimble_port_freertos.h (85%) rename lib/libesp32_div/NimBLE-Arduino/src/nimble/{porting/npl/freertos/include/nimble => }/npl_freertos.h (91%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/os/endian.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/os/os.h (89%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/os/os_cputime.h (98%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/os/os_error.h (98%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/os/os_mbuf.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/os/os_mempool.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/os/os_trace_api.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/os/queue.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/os/util.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/esp_port => }/port/src/esp_nimble_mem.c (96%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/include/nimble/nimble_port.h rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/porting/nimble/src/endian.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/porting/nimble/src/hal_timer.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/porting/nimble/src/mem.c (96%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/porting/nimble/src/nimble_port.c (90%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/porting/nimble/src/os_cputime.c (96%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/porting/nimble/src/os_cputime_pwr2.c (98%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/porting/nimble/src/os_mbuf.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/porting/nimble/src/os_mempool.c (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/porting/nimble/src/os_msys_init.c (90%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/porting/npl/freertos/src/nimble_port_freertos.c (61%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble => }/porting/npl/freertos/src/npl_os_freertos.c (67%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/services/ans/include => }/services/ans/ble_svc_ans.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/services/bas/include => }/services/bas/ble_svc_bas.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/services/gap/include => }/services/gap/ble_svc_gap.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/services/gatt/include => }/services/gatt/ble_svc_gatt.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/services/ias/include => }/services/ias/ble_svc_ias.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/services/ipss/include => }/services/ipss/ble_svc_ipss.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/services/lls/include => }/services/lls/ble_svc_lls.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/services/tps/include => }/services/tps/ble_svc_tps.h (100%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/src/ble_hs_hci_priv.h create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/src/ble_sm_priv.h rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/stats/stats.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/nimble/host/store/config/include => }/store/config/ble_store_config.h (100%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/store/ram/ble_store_ram.h rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/syscfg/syscfg.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/sysflash/sysflash.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/porting/nimble/include => }/sysinit/sysinit.h (100%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/AUTHORS create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/LICENSE create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/README create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/VERSION rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/ext/tinycrypt/include => }/tinycrypt/aes.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/ext/tinycrypt/include => }/tinycrypt/cbc_mode.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/ext/tinycrypt/include => }/tinycrypt/ccm_mode.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/ext/tinycrypt/include => }/tinycrypt/cmac_mode.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/ext/tinycrypt/include => }/tinycrypt/constants.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/ext/tinycrypt/include => }/tinycrypt/ctr_mode.h (98%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/ext/tinycrypt/include => }/tinycrypt/ctr_prng.h (99%) create mode 100644 lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/documentation/tinycrypt.rst rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/ext/tinycrypt/include => }/tinycrypt/ecc.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/ext/tinycrypt/include => }/tinycrypt/ecc_dh.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/ext/tinycrypt/include => }/tinycrypt/ecc_dsa.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/ext/tinycrypt/include => }/tinycrypt/ecc_platform_specific.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/ext/tinycrypt/include => }/tinycrypt/hmac.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/ext/tinycrypt/include => }/tinycrypt/hmac_prng.h (99%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/ext/tinycrypt/include => }/tinycrypt/sha256.h (100%) rename lib/libesp32_div/NimBLE-Arduino/src/{nimble/ext/tinycrypt/include => }/tinycrypt/utils.h (100%) diff --git a/lib/libesp32_div/NimBLE-Arduino/CHANGELOG.md b/lib/libesp32_div/NimBLE-Arduino/CHANGELOG.md index b833a03dc..b80c3c93b 100644 --- a/lib/libesp32_div/NimBLE-Arduino/CHANGELOG.md +++ b/lib/libesp32_div/NimBLE-Arduino/CHANGELOG.md @@ -1,6 +1,20 @@ # Changelog -All notable changes to this project will be documented in this file. +All notable changes to this project will be documented in this file. + +## [1.3.5] - 2022-01-14 + +### Added +- CONFIG_NIMBLE_CPP_DEBUG_LEVEL macro in nimconfig.h to allow setting the log level separately from the Arduino core log level. + +### Fixed +- Memory leak when initializing/deinitializing the BLE stack caused by new FreeRTOS timers be created on each initialization. + +## [1.3.4] - 2022-01-09 + +### Fixed +- Workaround for latest Arduino-esp32 core that causes tasks not to block when required, which caused functions to return prematurely resulting in exceptions/crashing. +- The wrong length value was being used to set the values read from peer attributes. This has been corrected to use the proper value size. ## [1.3.3] - 2021-11-24 diff --git a/lib/libesp32_div/NimBLE-Arduino/library.json b/lib/libesp32_div/NimBLE-Arduino/library.json index fd9dd44cf..e501aed59 100644 --- a/lib/libesp32_div/NimBLE-Arduino/library.json +++ b/lib/libesp32_div/NimBLE-Arduino/library.json @@ -2,7 +2,7 @@ "name": "NimBLE-Arduino", "keywords": "esp32, bluetooth", "description": "Bluetooth low energy (BLE) library for arduino-esp32 based on NimBLE", - "version": "1.3.3", + "version": "1.3.5", "frameworks": "arduino", "platforms": "espressif32" } diff --git a/lib/libesp32_div/NimBLE-Arduino/library.properties b/lib/libesp32_div/NimBLE-Arduino/library.properties index 11abace65..cbea51f6a 100644 --- a/lib/libesp32_div/NimBLE-Arduino/library.properties +++ b/lib/libesp32_div/NimBLE-Arduino/library.properties @@ -1,5 +1,5 @@ name=NimBLE-Arduino -version=1.3.3 +version=1.3.5 author=h2zero maintainer=h2zero sentence=Bluetooth low energy (BLE) library for arduino-esp32 based on NimBLE. diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/CODING_STANDARDS.md b/lib/libesp32_div/NimBLE-Arduino/src/CODING_STANDARDS.md similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/CODING_STANDARDS.md rename to lib/libesp32_div/NimBLE-Arduino/src/CODING_STANDARDS.md diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/NOTICE b/lib/libesp32_div/NimBLE-Arduino/src/NOTICE similarity index 61% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/NOTICE rename to lib/libesp32_div/NimBLE-Arduino/src/NOTICE index 02fe5929d..fc24c6abc 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/NOTICE +++ b/lib/libesp32_div/NimBLE-Arduino/src/NOTICE @@ -1,6 +1,5 @@ Apache Mynewt NimBLE -Copyright 2015-2020 The Apache Software Foundation -Modifications Copyright 2017-2020 Espressif Systems (Shanghai) CO., LTD. +Copyright 2015-2018 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (http://www.apache.org/). diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLE2904.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLE2904.cpp index 282eff55f..80318b5b8 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLE2904.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLE2904.cpp @@ -16,8 +16,11 @@ * See also: * https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml */ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) + #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) #include "NimBLE2904.h" @@ -83,4 +86,5 @@ void NimBLE2904::setUnit(uint16_t unit) { setValue((uint8_t*) &m_data, sizeof(m_data)); } // setUnit -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_PERIPHERAL */ +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLE2904.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLE2904.h index 29dde51e8..d8800dd2f 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLE2904.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLE2904.h @@ -14,8 +14,11 @@ #ifndef MAIN_NIMBLE2904_H_ #define MAIN_NIMBLE2904_H_ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) + #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) #include "NimBLEDescriptor.h" @@ -79,5 +82,6 @@ private: BLE2904_Data m_data; }; // BLE2904 -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_PERIPHERAL */ +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#endif /* CONFIG_BT_ENABLED */ #endif /* MAIN_NIMBLE2904_H_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAddress.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAddress.cpp index b8df5ac83..e1d3e548b 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAddress.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAddress.cpp @@ -11,7 +11,7 @@ * Created on: Jul 2, 2017 * Author: kolban */ -#include "nimconfig.h" +#include "sdkconfig.h" #if defined(CONFIG_BT_ENABLED) #include diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAddress.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAddress.h index a6e10a09c..50f9231fe 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAddress.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAddress.h @@ -14,15 +14,10 @@ #ifndef COMPONENTS_NIMBLEADDRESS_H_ #define COMPONENTS_NIMBLEADDRESS_H_ -#include "nimconfig.h" +#include "sdkconfig.h" #if defined(CONFIG_BT_ENABLED) -#if defined(CONFIG_NIMBLE_CPP_IDF) #include "nimble/ble.h" -#else -#include "nimble/nimble/include/nimble/ble.h" -#endif - /**** FIX COMPILATION ****/ #undef min #undef max diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertisedDevice.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertisedDevice.cpp index 01dd75d41..ecfd49814 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertisedDevice.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertisedDevice.cpp @@ -11,9 +11,11 @@ * Created on: Jul 3, 2017 * Author: kolban */ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER) +#if defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER) #include "NimBLEDevice.h" #include "NimBLEAdvertisedDevice.h" @@ -781,5 +783,7 @@ size_t NimBLEAdvertisedDevice::getPayloadLength() { return m_payload.size(); } // getPayloadLength -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL */ + +#endif // #if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#endif /* CONFIG_BT_ENABLED */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertisedDevice.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertisedDevice.h index 39410e665..7d378ed0f 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertisedDevice.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertisedDevice.h @@ -14,22 +14,20 @@ #ifndef COMPONENTS_NIMBLEADVERTISEDDEVICE_H_ #define COMPONENTS_NIMBLEADVERTISEDDEVICE_H_ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) + #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER) +#if defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER) #include "NimBLEAddress.h" #include "NimBLEScan.h" #include "NimBLEUUID.h" -#if defined(CONFIG_NIMBLE_CPP_IDF) #include "host/ble_hs_adv.h" -#else -#include "nimble/nimble/host/include/host/ble_hs_adv.h" -#endif #include #include -#include class NimBLEScan; @@ -173,5 +171,6 @@ public: virtual void onResult(NimBLEAdvertisedDevice* advertisedDevice) = 0; }; -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_OBSERVER */ +#endif // #if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#endif /* CONFIG_BT_ENABLED */ #endif /* COMPONENTS_NIMBLEADVERTISEDDEVICE_H_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertising.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertising.cpp index a804130f8..3112efff0 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertising.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertising.cpp @@ -13,14 +13,13 @@ * Author: kolban * */ -#include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_BROADCASTER) +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) + +#include "nimconfig.h" +#if defined(CONFIG_BT_NIMBLE_ROLE_BROADCASTER) -#if defined(CONFIG_NIMBLE_CPP_IDF) #include "services/gap/ble_svc_gap.h" -#else -#include "nimble/nimble/host/services/gap/include/services/gap/ble_svc_gap.h" -#endif #include "NimBLEAdvertising.h" #include "NimBLEDevice.h" #include "NimBLEServer.h" @@ -69,7 +68,6 @@ void NimBLEAdvertising::reset() { m_advDataSet = false; // Set this to non-zero to prevent auto start if host reset before started by app. m_duration = BLE_HS_FOREVER; - m_advCompCB = nullptr; } // reset @@ -655,8 +653,12 @@ bool NimBLEAdvertising::start(uint32_t duration, void (*advCompleteCB)(NimBLEAdv break; } + if(rc != 0) { + return false; + } + NIMBLE_LOGD(LOG_TAG, "<< Advertising start"); - return (rc == 0); + return true; } // start @@ -1026,4 +1028,5 @@ std::string NimBLEAdvertisementData::getPayload() { return m_payload; } // getPayload -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_BROADCASTER */ +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#endif /* CONFIG_BT_ENABLED */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertising.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertising.h index 63a21d846..17a866561 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertising.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEAdvertising.h @@ -14,15 +14,13 @@ #ifndef MAIN_BLEADVERTISING_H_ #define MAIN_BLEADVERTISING_H_ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) + #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_BROADCASTER) +#if defined(CONFIG_BT_NIMBLE_ROLE_BROADCASTER) -#if defined(CONFIG_NIMBLE_CPP_IDF) #include "host/ble_gap.h" -#else -#include "nimble/nimble/host/include/host/ble_gap.h" -#endif - /**** FIX COMPILATION ****/ #undef min #undef max @@ -134,5 +132,6 @@ private: std::vector m_uri; }; -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_BROADCASTER */ +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#endif /* CONFIG_BT_ENABLED */ #endif /* MAIN_BLEADVERTISING_H_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEBeacon.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEBeacon.cpp index 996893ab1..8c4574bc2 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEBeacon.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEBeacon.cpp @@ -11,7 +11,7 @@ * Created on: Jan 4, 2018 * Author: kolban */ -#include "nimconfig.h" +#include "sdkconfig.h" #if defined(CONFIG_BT_ENABLED) #include diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLECharacteristic.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLECharacteristic.cpp index cc87483b7..e81fdbcda 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLECharacteristic.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLECharacteristic.cpp @@ -9,9 +9,11 @@ * Created on: Jun 22, 2017 * Author: kolban */ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) #include "NimBLECharacteristic.h" #include "NimBLE2904.h" @@ -49,6 +51,7 @@ NimBLECharacteristic::NimBLECharacteristic(const NimBLEUUID &uuid, uint16_t prop m_pCallbacks = &defaultCallback; m_pService = pService; m_value = ""; + m_valMux = portMUX_INITIALIZER_UNLOCKED; m_timestamp = 0; m_removed = 0; } // NimBLECharacteristic @@ -234,12 +237,12 @@ NimBLEUUID NimBLECharacteristic::getUUID() { * @return A std::string containing the current characteristic value. */ std::string NimBLECharacteristic::getValue(time_t *timestamp) { - ble_npl_hw_enter_critical(); + portENTER_CRITICAL(&m_valMux); std::string retVal = m_value; if(timestamp != nullptr) { *timestamp = m_timestamp; } - ble_npl_hw_exit_critical(0); + portEXIT_CRITICAL(&m_valMux); return retVal; } // getValue @@ -250,9 +253,10 @@ std::string NimBLECharacteristic::getValue(time_t *timestamp) { * @return The length of the current characteristic data. */ size_t NimBLECharacteristic::getDataLength() { - ble_npl_hw_enter_critical(); + portENTER_CRITICAL(&m_valMux); size_t len = m_value.length(); - ble_npl_hw_exit_critical(0); + portEXIT_CRITICAL(&m_valMux); + return len; } @@ -285,10 +289,11 @@ int NimBLECharacteristic::handleGapEvent(uint16_t conn_handle, uint16_t attr_han pCharacteristic->m_pCallbacks->onRead(pCharacteristic, &desc); } - ble_npl_hw_enter_critical(); + portENTER_CRITICAL(&pCharacteristic->m_valMux); rc = os_mbuf_append(ctxt->om, (uint8_t*)pCharacteristic->m_value.data(), pCharacteristic->m_value.length()); - ble_npl_hw_exit_critical(0); + portEXIT_CRITICAL(&pCharacteristic->m_valMux); + return rc == 0 ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES; } @@ -427,7 +432,7 @@ void NimBLECharacteristic::notify(bool is_notification) { int rc = 0; for (auto &it : m_subscribedVec) { - uint16_t _mtu = getService()->getServer()->getPeerMTU(it.first) - 3; + uint16_t _mtu = getService()->getServer()->getPeerMTU(it.first); // check if connected and subscribed if(_mtu == 0 || it.second == 0) { @@ -443,8 +448,8 @@ void NimBLECharacteristic::notify(bool is_notification) { } } - if (length > _mtu) { - NIMBLE_LOGW(LOG_TAG, "- Truncating to %d bytes (maximum notify size)", _mtu); + if (length > _mtu - 3) { + NIMBLE_LOGW(LOG_TAG, "- Truncating to %d bytes (maximum notify size)", _mtu - 3); } if(is_notification && (!(it.second & NIMBLE_SUB_NOTIFY))) { @@ -511,7 +516,7 @@ NimBLECharacteristicCallbacks* NimBLECharacteristic::getCallbacks() { * @param [in] length The length of the data in bytes. */ void NimBLECharacteristic::setValue(const uint8_t* data, size_t length) { -#if CONFIG_LOG_DEFAULT_LEVEL > 3 || (ARDUINO_ARCH_ESP32 && CORE_DEBUG_LEVEL >= 4) +#if CONFIG_NIMBLE_CPP_DEBUG_LEVEL >= 4 char* pHex = NimBLEUtils::buildHexData(nullptr, data, length); NIMBLE_LOGD(LOG_TAG, ">> setValue: length=%d, data=%s, characteristic UUID=%s", length, pHex, getUUID().toString().c_str()); free(pHex); @@ -523,10 +528,10 @@ void NimBLECharacteristic::setValue(const uint8_t* data, size_t length) { } time_t t = time(nullptr); - ble_npl_hw_enter_critical(); + portENTER_CRITICAL(&m_valMux); m_value = std::string((char*)data, length); m_timestamp = t; - ble_npl_hw_exit_critical(0); + portEXIT_CRITICAL(&m_valMux); NIMBLE_LOGD(LOG_TAG, "<< setValue"); } // setValue @@ -636,4 +641,6 @@ void NimBLECharacteristicCallbacks::onSubscribe(NimBLECharacteristic* pCharacter NIMBLE_LOGD("NimBLECharacteristicCallbacks", "onSubscribe: default"); } -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_PERIPHERAL */ + +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#endif /* CONFIG_BT_ENABLED */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLECharacteristic.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLECharacteristic.h index 9edfb54b3..6008d127f 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLECharacteristic.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLECharacteristic.h @@ -13,15 +13,13 @@ #ifndef MAIN_NIMBLECHARACTERISTIC_H_ #define MAIN_NIMBLECHARACTERISTIC_H_ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) + #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) -#if defined(CONFIG_NIMBLE_CPP_IDF) #include "host/ble_hs.h" -#else -#include "nimble/nimble/host/include/host/ble_hs.h" -#endif - /**** FIX COMPILATION ****/ #undef min #undef max @@ -153,6 +151,7 @@ private: NimBLEService* m_pService; std::string m_value; std::vector m_dscVec; + portMUX_TYPE m_valMux; time_t m_timestamp; uint8_t m_removed; @@ -196,5 +195,6 @@ public: virtual void onSubscribe(NimBLECharacteristic* pCharacteristic, ble_gap_conn_desc* desc, uint16_t subValue); }; -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_PERIPHERAL */ +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#endif /* CONFIG_BT_ENABLED */ #endif /*MAIN_NIMBLECHARACTERISTIC_H_*/ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEClient.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEClient.cpp index 9f4e08fdb..49cda6649 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEClient.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEClient.cpp @@ -11,8 +11,11 @@ * Author: kolban */ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) + #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) #include "NimBLEClient.h" #include "NimBLEDevice.h" @@ -21,11 +24,8 @@ #include #include -#if defined(CONFIG_NIMBLE_CPP_IDF) #include "nimble/nimble_port.h" -#else -#include "nimble/porting/nimble/include/nimble/nimble_port.h" -#endif + static const char* LOG_TAG = "NimBLEClient"; static NimBLEClientCallbacks defaultCallbacks; @@ -74,7 +74,6 @@ NimBLEClient::NimBLEClient(const NimBLEAddress &peerAddress) : m_peerAddress(pee m_pConnParams.min_ce_len = BLE_GAP_INITIAL_CONN_MIN_CE_LEN; // Minimum length of connection event in 0.625ms units m_pConnParams.max_ce_len = BLE_GAP_INITIAL_CONN_MAX_CE_LEN; // Maximum length of connection event in 0.625ms units - memset(&m_dcTimer, 0, sizeof(m_dcTimer)); ble_npl_callout_init(&m_dcTimer, nimble_port_get_dflt_eventq(), NimBLEClient::dcTimerCb, this); } // NimBLEClient @@ -207,7 +206,8 @@ bool NimBLEClient::connect(const NimBLEAddress &address, bool deleteAttibutes) { m_peerAddress = address; } - ble_task_data_t taskData = {this, xTaskGetCurrentTaskHandle(), 0, nullptr}; + TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); + ble_task_data_t taskData = {this, cur_task, 0, nullptr}; m_pTaskData = &taskData; int rc = 0; @@ -260,6 +260,10 @@ bool NimBLEClient::connect(const NimBLEAddress &address, bool deleteAttibutes) { return false; } +#ifdef ulTaskNotifyValueClear + // Clear the task notification value to ensure we block + ulTaskNotifyValueClear(cur_task, ULONG_MAX); +#endif // Wait for the connect timeout time +1 second for the connection to complete if(ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(m_connectTimeout + 1000)) == pdFALSE) { m_pTaskData = nullptr; @@ -310,7 +314,8 @@ bool NimBLEClient::connect(const NimBLEAddress &address, bool deleteAttibutes) { * @return True on success. */ bool NimBLEClient::secureConnection() { - ble_task_data_t taskData = {this, xTaskGetCurrentTaskHandle(), 0, nullptr}; + TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); + ble_task_data_t taskData = {this, cur_task, 0, nullptr}; int retryCount = 1; @@ -324,6 +329,10 @@ bool NimBLEClient::secureConnection() { return false; } +#ifdef ulTaskNotifyValueClear + // Clear the task notification value to ensure we block + ulTaskNotifyValueClear(cur_task, ULONG_MAX); +#endif ulTaskNotifyTake(pdTRUE, portMAX_DELAY); } while (taskData.rc == (BLE_HS_ERR_HCI_BASE + BLE_ERR_PINKEY_MISSING) && retryCount--); @@ -444,28 +453,6 @@ void NimBLEClient::updateConnParams(uint16_t minInterval, uint16_t maxInterval, } // updateConnParams -/** - * @brief Request an update of the data packet length. - * * Can only be used after a connection has been established. - * @details Sends a data length update request to the server the client is connected to. - * The Data Length Extension (DLE) allows to increase the Data Channel Payload from 27 bytes to up to 251 bytes. - * The server needs to support the Bluetooth 4.2 specifications, to be capable of DLE. - * @param [in] tx_octets The preferred number of payload octets to use (Range 0x001B-0x00FB). - */ -void NimBLEClient::setDataLen(uint16_t tx_octets) { -#ifdef CONFIG_NIMBLE_CPP_IDF // not yet available in IDF, Sept 9 2021 - return; -#else - uint16_t tx_time = (tx_octets + 14) * 8; - - int rc = ble_gap_set_data_len(m_conn_id, tx_octets, tx_time); - if(rc != 0) { - NIMBLE_LOGE(LOG_TAG, "Set data length error: %d, %s", rc, NimBLEUtils::returnCodeToString(rc)); - } -#endif -} // setDataLen - - /** * @brief Get detailed information about the current peer connection. */ @@ -670,7 +657,8 @@ bool NimBLEClient::retrieveServices(const NimBLEUUID *uuid_filter) { } int rc = 0; - ble_task_data_t taskData = {this, xTaskGetCurrentTaskHandle(), 0, nullptr}; + TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); + ble_task_data_t taskData = {this, cur_task, 0, nullptr}; if(uuid_filter == nullptr) { rc = ble_gattc_disc_all_svcs(m_conn_id, NimBLEClient::serviceDiscoveredCB, &taskData); @@ -685,6 +673,11 @@ bool NimBLEClient::retrieveServices(const NimBLEUUID *uuid_filter) { return false; } +#ifdef ulTaskNotifyValueClear + // Clear the task notification value to ensure we block + ulTaskNotifyValueClear(cur_task, ULONG_MAX); +#endif + // wait until we have all the services ulTaskNotifyTake(pdTRUE, portMAX_DELAY); m_lastErr = taskData.rc; @@ -958,11 +951,11 @@ uint16_t NimBLEClient::getMTU() { (*characteristic)->toString().c_str()); time_t t = time(nullptr); - ble_npl_hw_enter_critical(); + portENTER_CRITICAL(&(*characteristic)->m_valMux); (*characteristic)->m_value = std::string((char *)event->notify_rx.om->om_data, event->notify_rx.om->om_len); (*characteristic)->m_timestamp = t; - ble_npl_hw_exit_critical(0); + portEXIT_CRITICAL(&(*characteristic)->m_valMux); if ((*characteristic)->m_notifyCallback != nullptr) { NIMBLE_LOGD(LOG_TAG, "Invoking callback for notification on characteristic %s", @@ -1212,4 +1205,5 @@ bool NimBLEClientCallbacks::onConfirmPIN(uint32_t pin){ return true; } -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL */ +#endif // #if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#endif // CONFIG_BT_ENABLED diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEClient.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEClient.h index 37700b7c4..8bb3119dc 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEClient.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEClient.h @@ -14,8 +14,11 @@ #ifndef MAIN_NIMBLECLIENT_H_ #define MAIN_NIMBLECLIENT_H_ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) + #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#if defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) #include "NimBLEAddress.h" #include "NimBLEUUID.h" @@ -68,7 +71,6 @@ public: uint16_t scanInterval=16, uint16_t scanWindow=16); void updateConnParams(uint16_t minInterval, uint16_t maxInterval, uint16_t latency, uint16_t timeout); - void setDataLen(uint16_t tx_octets); void discoverAttributes(); NimBLEConnInfo getConnInfo(); int getLastError(); @@ -158,5 +160,6 @@ public: virtual bool onConfirmPIN(uint32_t pin); }; -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL */ +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#endif // CONFIG_BT_ENABLED #endif /* MAIN_NIMBLECLIENT_H_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDescriptor.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDescriptor.cpp index 5b0db1a64..f94676607 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDescriptor.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDescriptor.cpp @@ -11,9 +11,11 @@ * Created on: Jun 22, 2017 * Author: kolban */ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) #include "NimBLEService.h" #include "NimBLEDescriptor.h" @@ -49,6 +51,7 @@ NimBLEDescriptor::NimBLEDescriptor(NimBLEUUID uuid, uint16_t properties, uint16_ m_pCharacteristic = pCharacteristic; m_pCallbacks = &defaultCallbacks; // No initial callback. m_value.attr_value = (uint8_t*) calloc(max_len,1); // Allocate storage for the value. + m_valMux = portMUX_INITIALIZER_UNLOCKED; m_properties = 0; m_removed = 0; @@ -142,9 +145,6 @@ NimBLECharacteristic* NimBLEDescriptor::getCharacteristic() { int NimBLEDescriptor::handleGapEvent(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { - (void)conn_handle; - (void)attr_handle; - const ble_uuid_t *uuid; int rc; NimBLEDescriptor* pDescriptor = (NimBLEDescriptor*)arg; @@ -161,10 +161,9 @@ int NimBLEDescriptor::handleGapEvent(uint16_t conn_handle, uint16_t attr_handle, if(ctxt->om->om_pkthdr_len > 8) { pDescriptor->m_pCallbacks->onRead(pDescriptor); } - - ble_npl_hw_enter_critical(); + portENTER_CRITICAL(&pDescriptor->m_valMux); rc = os_mbuf_append(ctxt->om, pDescriptor->getValue(), pDescriptor->getLength()); - ble_npl_hw_exit_critical(0); + portEXIT_CRITICAL(&pDescriptor->m_valMux); return rc == 0 ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES; } @@ -235,12 +234,10 @@ void NimBLEDescriptor::setValue(const uint8_t* data, size_t length) { NIMBLE_LOGE(LOG_TAG, "Size %d too large, must be no bigger than %d", length, m_value.attr_max_len); return; } - - ble_npl_hw_enter_critical(); + portENTER_CRITICAL(&m_valMux); m_value.attr_len = length; memcpy(m_value.attr_value, data, length); - ble_npl_hw_exit_critical(0); - + portEXIT_CRITICAL(&m_valMux); } // setValue @@ -280,7 +277,6 @@ NimBLEDescriptorCallbacks::~NimBLEDescriptorCallbacks() {} * @param [in] pDescriptor The descriptor that is the source of the event. */ void NimBLEDescriptorCallbacks::onRead(NimBLEDescriptor* pDescriptor) { - (void)pDescriptor; NIMBLE_LOGD("NimBLEDescriptorCallbacks", "onRead: default"); } // onRead @@ -290,8 +286,8 @@ void NimBLEDescriptorCallbacks::onRead(NimBLEDescriptor* pDescriptor) { * @param [in] pDescriptor The descriptor that is the source of the event. */ void NimBLEDescriptorCallbacks::onWrite(NimBLEDescriptor* pDescriptor) { - (void)pDescriptor; NIMBLE_LOGD("NimBLEDescriptorCallbacks", "onWrite: default"); } // onWrite -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_PERIPHERAL */ +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#endif /* CONFIG_BT_ENABLED */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDescriptor.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDescriptor.h index fe6c73303..5dc0ce89b 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDescriptor.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDescriptor.h @@ -14,9 +14,11 @@ #ifndef MAIN_NIMBLEDESCRIPTOR_H_ #define MAIN_NIMBLEDESCRIPTOR_H_ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) #include "NimBLECharacteristic.h" #include "NimBLEUUID.h" @@ -90,6 +92,7 @@ private: NimBLECharacteristic* m_pCharacteristic; uint8_t m_properties; attr_value_t m_value; + portMUX_TYPE m_valMux; uint8_t m_removed; }; // NimBLEDescriptor @@ -110,5 +113,6 @@ public: #include "NimBLE2904.h" -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_PERIPHERAL */ +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#endif /* CONFIG_BT_ENABLED */ #endif /* MAIN_NIMBLEDESCRIPTOR_H_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDevice.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDevice.cpp index 0302cb8a8..bc253659a 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDevice.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDevice.cpp @@ -11,45 +11,27 @@ * Created on: Mar 16, 2017 * Author: kolban */ - -#include "nimconfig.h" +#include "sdkconfig.h" #if defined(CONFIG_BT_ENABLED) +#include "nimconfig.h" #include "NimBLEDevice.h" #include "NimBLEUtils.h" -#ifdef ESP_PLATFORM -# include "esp_err.h" -# include "esp_bt.h" -# include "nvs_flash.h" -# if defined(CONFIG_NIMBLE_CPP_IDF) -# include "esp_nimble_hci.h" -# include "nimble/nimble_port.h" -# include "nimble/nimble_port_freertos.h" -# include "host/ble_hs.h" -# include "host/ble_hs_pvcy.h" -# include "host/util/util.h" -# include "services/gap/ble_svc_gap.h" -# include "services/gatt/ble_svc_gatt.h" -# else -# include "nimble/esp_port/esp-hci/include/esp_nimble_hci.h" -# endif -#else -# include "nimble/nimble/controller/include/controller/ble_phy.h" -#endif +#include "esp_err.h" +#include "esp_bt.h" +#include "nvs_flash.h" +#include "esp_nimble_hci.h" +#include "nimble/nimble_port.h" +#include "nimble/nimble_port_freertos.h" +#include "host/ble_hs.h" +#include "host/ble_hs_pvcy.h" +#include "host/util/util.h" +#include "services/gap/ble_svc_gap.h" +#include "services/gatt/ble_svc_gatt.h" -#ifndef CONFIG_NIMBLE_CPP_IDF -# include "nimble/porting/nimble/include/nimble/nimble_port.h" -# include "nimble/porting/npl/freertos/include/nimble/nimble_port_freertos.h" -# include "nimble/nimble/host/include/host/ble_hs.h" -# include "nimble/nimble/host/include/host/ble_hs_pvcy.h" -# include "nimble/nimble/host/util/include/host/util/util.h" -# include "nimble/nimble/host/services/gap/include/services/gap/ble_svc_gap.h" -# include "nimble/nimble/host/services/gatt/include/services/gatt/ble_svc_gatt.h" -#endif - -#if defined(ESP_PLATFORM) && defined(CONFIG_ENABLE_ARDUINO_DEPENDS) -# include "esp32-hal-bt.h" +#ifdef CONFIG_ENABLE_ARDUINO_DEPENDS +#include "esp32-hal-bt.h" #endif #include "NimBLELog.h" @@ -81,10 +63,9 @@ std::list NimBLEDevice::m_ignoreList; std::vector NimBLEDevice::m_whiteList; NimBLESecurityCallbacks* NimBLEDevice::m_securityCallbacks = nullptr; uint8_t NimBLEDevice::m_own_addr_type = BLE_OWN_ADDR_PUBLIC; -#ifdef ESP_PLATFORM uint16_t NimBLEDevice::m_scanDuplicateSize = CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE; uint8_t NimBLEDevice::m_scanFilterMode = CONFIG_BTDM_SCAN_DUPL_TYPE; -#endif + /** * @brief Create a new instance of a server. @@ -149,8 +130,7 @@ void NimBLEDevice::stopAdvertising() { * try and release/delete it. */ #if defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER) -/* STATIC */ -NimBLEScan* NimBLEDevice::getScan() { +/* STATIC */ NimBLEScan* NimBLEDevice::getScan() { if (m_pScan == nullptr) { m_pScan = new NimBLEScan(); } @@ -167,8 +147,7 @@ NimBLEScan* NimBLEDevice::getScan() { * @return A reference to the new client object. */ #if defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) -/* STATIC */ -NimBLEClient* NimBLEDevice::createClient(NimBLEAddress peerAddress) { +/* STATIC */ NimBLEClient* NimBLEDevice::createClient(NimBLEAddress peerAddress) { if(m_cList.size() >= NIMBLE_MAX_CONNECTIONS) { NIMBLE_LOGW(LOG_TAG,"Number of clients exceeds Max connections. Cur=%d Max=%d", m_cList.size(), NIMBLE_MAX_CONNECTIONS); @@ -186,8 +165,7 @@ NimBLEClient* NimBLEDevice::createClient(NimBLEAddress peerAddress) { * Checks if it is connected or trying to connect and disconnects/stops it first. * @param [in] pClient A pointer to the client object. */ -/* STATIC */ -bool NimBLEDevice::deleteClient(NimBLEClient* pClient) { +/* STATIC */ bool NimBLEDevice::deleteClient(NimBLEClient* pClient) { if(pClient == nullptr) { return false; } @@ -231,8 +209,7 @@ bool NimBLEDevice::deleteClient(NimBLEClient* pClient) { * @brief Get the list of created client objects. * @return A pointer to the list of clients. */ -/* STATIC */ -std::list* NimBLEDevice::getClientList() { +/* STATIC */std::list* NimBLEDevice::getClientList() { return &m_cList; } // getClientList @@ -241,8 +218,7 @@ std::list* NimBLEDevice::getClientList() { * @brief Get the number of created client objects. * @return Number of client objects created. */ -/* STATIC */ -size_t NimBLEDevice::getClientListSize() { +/* STATIC */size_t NimBLEDevice::getClientListSize() { return m_cList.size(); } // getClientList @@ -252,8 +228,7 @@ size_t NimBLEDevice::getClientListSize() { * @param [in] conn_id The client connection ID to search for. * @return A pointer to the client object with the spcified connection ID. */ -/* STATIC */ -NimBLEClient* NimBLEDevice::getClientByID(uint16_t conn_id) { +/* STATIC */NimBLEClient* NimBLEDevice::getClientByID(uint16_t conn_id) { for(auto it = m_cList.cbegin(); it != m_cList.cend(); ++it) { if((*it)->getConnId() == conn_id) { return (*it); @@ -269,8 +244,7 @@ NimBLEClient* NimBLEDevice::getClientByID(uint16_t conn_id) { * @param [in] peer_addr The address of the peer to search for. * @return A pointer to the client object with the peer address. */ -/* STATIC */ -NimBLEClient* NimBLEDevice::getClientByPeerAddress(const NimBLEAddress &peer_addr) { +/* STATIC */NimBLEClient* NimBLEDevice::getClientByPeerAddress(const NimBLEAddress &peer_addr) { for(auto it = m_cList.cbegin(); it != m_cList.cend(); ++it) { if((*it)->getPeerAddress().equals(peer_addr)) { return (*it); @@ -284,8 +258,7 @@ NimBLEClient* NimBLEDevice::getClientByPeerAddress(const NimBLEAddress &peer_add * @brief Finds the first disconnected client in the list. * @return A pointer to the first client object that is not connected to a peer. */ -/* STATIC */ -NimBLEClient* NimBLEDevice::getDisconnectedClient() { +/* STATIC */NimBLEClient* NimBLEDevice::getDisconnectedClient() { for(auto it = m_cList.cbegin(); it != m_cList.cend(); ++it) { if(!(*it)->isConnected()) { return (*it); @@ -296,7 +269,7 @@ NimBLEClient* NimBLEDevice::getDisconnectedClient() { #endif // #if defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) -#ifdef ESP_PLATFORM + /** * @brief Set the transmission power. * @param [in] powerLevel The power level to set, can be one of: @@ -322,15 +295,12 @@ NimBLEClient* NimBLEDevice::getDisconnectedClient() { * * ESP_BLE_PWR_TYPE_SCAN = 10, For scan * * ESP_BLE_PWR_TYPE_DEFAULT = 11, For default, if not set other, it will use default value */ -/* STATIC */ -void NimBLEDevice::setPower(esp_power_level_t powerLevel, esp_ble_power_type_t powerType) { +/* STATIC */ void NimBLEDevice::setPower(esp_power_level_t powerLevel, esp_ble_power_type_t powerType) { NIMBLE_LOGD(LOG_TAG, ">> setPower: %d (type: %d)", powerLevel, powerType); - esp_err_t errRc = esp_ble_tx_power_set(powerType, powerLevel); if (errRc != ESP_OK) { NIMBLE_LOGE(LOG_TAG, "esp_ble_tx_power_set: rc=%d", errRc); } - NIMBLE_LOGD(LOG_TAG, "<< setPower"); } // setPower @@ -352,8 +322,9 @@ void NimBLEDevice::setPower(esp_power_level_t powerLevel, esp_ble_power_type_t p * * ESP_BLE_PWR_TYPE_DEFAULT = 11, For default, if not set other, it will use default value * @return the power level currently used by the type specified. */ -/* STATIC */ -int NimBLEDevice::getPower(esp_ble_power_type_t powerType) { + +/* STATIC */ int NimBLEDevice::getPower(esp_ble_power_type_t powerType) { + switch(esp_ble_tx_power_get(powerType)) { case ESP_PWR_LVL_N12: return -12; @@ -376,25 +347,13 @@ int NimBLEDevice::getPower(esp_ble_power_type_t powerType) { } } // getPower -#else - -void NimBLEDevice::setPower(int dbm) { - ble_phy_txpwr_set(dbm); -} - - -int NimBLEDevice::getPower() { - return ble_phy_txpwr_get(); -} -#endif /** * @brief Get our device address. * @return A NimBLEAddress object of our public address if we have one, * if not then our current random address. */ -/* STATIC*/ -NimBLEAddress NimBLEDevice::getAddress() { +/* STATIC*/ NimBLEAddress NimBLEDevice::getAddress() { ble_addr_t addr = {BLE_ADDR_PUBLIC, 0}; if(BLE_HS_ENOADDR == ble_hs_id_copy_addr(BLE_ADDR_PUBLIC, addr.val, NULL)) { @@ -411,8 +370,7 @@ NimBLEAddress NimBLEDevice::getAddress() { * @brief Return a string representation of the address of this device. * @return A string representation of this device address. */ -/* STATIC */ -std::string NimBLEDevice::toString() { +/* STATIC */ std::string NimBLEDevice::toString() { return getAddress().toString(); } // toString @@ -422,8 +380,7 @@ std::string NimBLEDevice::toString() { * @param [in] mtu Value to set local mtu: * * This should be larger than 23 and lower or equal to BLE_ATT_MTU_MAX = 527. */ -/* STATIC */ -int NimBLEDevice::setMTU(uint16_t mtu) { +/* STATIC */int NimBLEDevice::setMTU(uint16_t mtu) { NIMBLE_LOGD(LOG_TAG, ">> setLocalMTU: %d", mtu); int rc = ble_att_set_preferred_mtu(mtu); @@ -441,13 +398,11 @@ int NimBLEDevice::setMTU(uint16_t mtu) { * @brief Get local MTU value set. * @return The current preferred MTU setting. */ -/* STATIC */ -uint16_t NimBLEDevice::getMTU() { +/* STATIC */uint16_t NimBLEDevice::getMTU() { return ble_att_preferred_mtu(); } -#ifdef ESP_PLATFORM /** * @brief Set the duplicate filter cache size for filtering scanned devices. * @param [in] cacheSize The number of advertisements filtered before the cache is reset.\n @@ -493,7 +448,6 @@ void NimBLEDevice::setScanFilterMode(uint8_t mode) { m_scanFilterMode = mode; } -#endif #if defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) || defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) /** @@ -516,7 +470,7 @@ int NimBLEDevice::getNumBonds() { /** * @brief Deletes all bonding information. */ -/*STATIC*/ + /*STATIC*/ void NimBLEDevice::deleteAllBonds() { ble_store_clear(); } @@ -596,7 +550,6 @@ NimBLEAddress NimBLEDevice::getBondedAddress(int index) { * @param [in] address The address to check for in the whitelist. * @returns true if the address is in the whitelist. */ -/*STATIC*/ bool NimBLEDevice::onWhiteList(const NimBLEAddress & address) { for (auto &it : m_whiteList) { if (it == address) { @@ -613,7 +566,6 @@ bool NimBLEDevice::onWhiteList(const NimBLEAddress & address) { * @param [in] address The address to add to the whitelist. * @returns true if successful. */ -/*STATIC*/ bool NimBLEDevice::whiteListAdd(const NimBLEAddress & address) { if (NimBLEDevice::onWhiteList(address)) { return true; @@ -645,7 +597,6 @@ bool NimBLEDevice::whiteListAdd(const NimBLEAddress & address) { * @param [in] address The address to remove from the whitelist. * @returns true if successful. */ -/*STATIC*/ bool NimBLEDevice::whiteListRemove(const NimBLEAddress & address) { if (!NimBLEDevice::onWhiteList(address)) { return true; @@ -685,7 +636,6 @@ bool NimBLEDevice::whiteListRemove(const NimBLEAddress & address) { * @brief Gets the count of addresses in the whitelist. * @returns The number of addresses in the whitelist. */ -/*STATIC*/ size_t NimBLEDevice::getWhiteListCount() { return m_whiteList.size(); } @@ -696,7 +646,6 @@ size_t NimBLEDevice::getWhiteListCount() { * @param [in] index The vector index to retrieve the address from. * @returns the NimBLEAddress at the whitelist index or nullptr if not found. */ -/*STATIC*/ NimBLEAddress NimBLEDevice::getWhiteListAddress(size_t index) { if (index > m_whiteList.size()) { NIMBLE_LOGE(LOG_TAG, "Invalid index; %u", index); @@ -710,8 +659,7 @@ NimBLEAddress NimBLEDevice::getWhiteListAddress(size_t index) { * @brief Host reset, we pass the message so we don't make calls until resynced. * @param [in] reason The reason code for the reset. */ -/* STATIC */ -void NimBLEDevice::onReset(int reason) +/* STATIC */ void NimBLEDevice::onReset(int reason) { if(!m_synced) { return; @@ -735,8 +683,7 @@ void NimBLEDevice::onReset(int reason) /** * @brief Host resynced with controller, all clear to make calls to the stack. */ -/* STATIC */ -void NimBLEDevice::onSync(void) +/* STATIC */ void NimBLEDevice::onSync(void) { NIMBLE_LOGI(LOG_TAG, "NimBle host synced."); // This check is needed due to potentially being called multiple times in succession @@ -749,14 +696,6 @@ void NimBLEDevice::onSync(void) int rc = ble_hs_util_ensure_addr(0); assert(rc == 0); -#ifndef ESP_PLATFORM - rc = ble_hs_id_infer_auto(m_own_addr_type, &m_own_addr_type); - if (rc != 0) { - NIMBLE_LOGE(LOG_TAG, "error determining address type; rc=%d", rc); - return; - } -#endif - // Yield for houskeeping before returning to operations. // Occasionally triggers exception without. taskYIELD(); @@ -782,11 +721,9 @@ void NimBLEDevice::onSync(void) /** * @brief The main host task. */ -/* STATIC */ -void NimBLEDevice::host_task(void *param) +/* STATIC */ void NimBLEDevice::host_task(void *param) { NIMBLE_LOGI(LOG_TAG, "BLE Host Task Started"); - /* This function will return only when nimble_port_stop() is executed */ nimble_port_run(); @@ -798,11 +735,9 @@ void NimBLEDevice::host_task(void *param) * @brief Initialize the %BLE environment. * @param [in] deviceName The device name of the device. */ -/* STATIC */ -void NimBLEDevice::init(const std::string &deviceName) { +/* STATIC */ void NimBLEDevice::init(const std::string &deviceName) { if(!initialized){ int rc=0; -#ifdef ESP_PLATFORM esp_err_t errRc = ESP_OK; #ifdef CONFIG_ENABLE_ARDUINO_DEPENDS @@ -834,7 +769,6 @@ void NimBLEDevice::init(const std::string &deviceName) { ESP_ERROR_CHECK(esp_bt_controller_init(&bt_cfg)); ESP_ERROR_CHECK(esp_bt_controller_enable(ESP_BT_MODE_BLE)); ESP_ERROR_CHECK(esp_nimble_hci_init()); -#endif nimble_port_init(); // Setup callbacks for host events @@ -859,10 +793,9 @@ void NimBLEDevice::init(const std::string &deviceName) { nimble_port_freertos_init(NimBLEDevice::host_task); } - // Wait for host and controller to sync before returning and accepting new tasks while(!m_synced){ - taskYIELD(); + vTaskDelay(1 / portTICK_PERIOD_MS); } initialized = true; // Set the initialization flag to ensure we are only initialized once. @@ -874,17 +807,16 @@ void NimBLEDevice::init(const std::string &deviceName) { * @param [in] clearAll If true, deletes all server/advertising/scan/client objects after deinitializing. * @note If clearAll is true when called, any references to the created objects become invalid. */ -/* STATIC */ -void NimBLEDevice::deinit(bool clearAll) { +/* STATIC */ void NimBLEDevice::deinit(bool clearAll) { int ret = nimble_port_stop(); if (ret == 0) { nimble_port_deinit(); -#ifdef ESP_PLATFORM + ret = esp_nimble_hci_and_controller_deinit(); if (ret != ESP_OK) { NIMBLE_LOGE(LOG_TAG, "esp_nimble_hci_and_controller_deinit() failed with error: %d", ret); } -#endif + initialized = false; m_synced = false; @@ -931,7 +863,6 @@ void NimBLEDevice::deinit(bool clearAll) { * @brief Check if the initialization is complete. * @return true if initialized. */ -/*STATIC*/ bool NimBLEDevice::getInitialized() { return initialized; } // getInitialized @@ -943,8 +874,7 @@ bool NimBLEDevice::getInitialized() { * @param mitm If true we are capable of man in the middle protection, false if not. * @param sc If true we will perform secure connection pairing, false we will use legacy pairing. */ -/*STATIC*/ -void NimBLEDevice::setSecurityAuth(bool bonding, bool mitm, bool sc) { +/*STATIC*/ void NimBLEDevice::setSecurityAuth(bool bonding, bool mitm, bool sc) { NIMBLE_LOGD(LOG_TAG, "Setting bonding: %d, mitm: %d, sc: %d",bonding,mitm,sc); ble_hs_cfg.sm_bonding = bonding; ble_hs_cfg.sm_mitm = mitm; @@ -961,8 +891,7 @@ void NimBLEDevice::setSecurityAuth(bool bonding, bool mitm, bool sc) { * * 0x08 BLE_SM_PAIR_AUTHREQ_SC * * 0x10 BLE_SM_PAIR_AUTHREQ_KEYPRESS - not yet supported. */ -/*STATIC*/ -void NimBLEDevice::setSecurityAuth(uint8_t auth_req) { +/*STATIC*/void NimBLEDevice::setSecurityAuth(uint8_t auth_req) { NimBLEDevice::setSecurityAuth((auth_req & BLE_SM_PAIR_AUTHREQ_BOND)>0, (auth_req & BLE_SM_PAIR_AUTHREQ_MITM)>0, (auth_req & BLE_SM_PAIR_AUTHREQ_SC)>0); @@ -978,8 +907,7 @@ void NimBLEDevice::setSecurityAuth(uint8_t auth_req) { * * 0x03 BLE_HS_IO_NO_INPUT_OUTPUT NoInputNoOutput IO capability * * 0x04 BLE_HS_IO_KEYBOARD_DISPLAY KeyboardDisplay Only IO capability */ -/*STATIC*/ -void NimBLEDevice::setSecurityIOCap(uint8_t iocap) { +/*STATIC*/ void NimBLEDevice::setSecurityIOCap(uint8_t iocap) { ble_hs_cfg.sm_io_cap = iocap; } // setSecurityIOCap @@ -993,8 +921,7 @@ void NimBLEDevice::setSecurityIOCap(uint8_t iocap) { * * 0x04: BLE_SM_PAIR_KEY_DIST_SIGN * * 0x08: BLE_SM_PAIR_KEY_DIST_LINK */ -/*STATIC*/ -void NimBLEDevice::setSecurityInitKey(uint8_t init_key) { +/*STATIC*/void NimBLEDevice::setSecurityInitKey(uint8_t init_key) { ble_hs_cfg.sm_our_key_dist = init_key; } // setsSecurityInitKey @@ -1008,8 +935,7 @@ void NimBLEDevice::setSecurityInitKey(uint8_t init_key) { * * 0x04: BLE_SM_PAIR_KEY_DIST_SIGN * * 0x08: BLE_SM_PAIR_KEY_DIST_LINK */ -/*STATIC*/ -void NimBLEDevice::setSecurityRespKey(uint8_t resp_key) { +/*STATIC*/void NimBLEDevice::setSecurityRespKey(uint8_t resp_key) { ble_hs_cfg.sm_their_key_dist = resp_key; } // setsSecurityRespKey @@ -1018,8 +944,7 @@ void NimBLEDevice::setSecurityRespKey(uint8_t resp_key) { * @brief Set the passkey the server will ask for when pairing. * @param [in] pin The passkey to use. */ -/*STATIC*/ -void NimBLEDevice::setSecurityPasskey(uint32_t pin) { +/*STATIC*/void NimBLEDevice::setSecurityPasskey(uint32_t pin) { m_passkey = pin; } // setSecurityPasskey @@ -1028,8 +953,7 @@ void NimBLEDevice::setSecurityPasskey(uint32_t pin) { * @brief Get the current passkey used for pairing. * @return The current passkey. */ -/*STATIC*/ -uint32_t NimBLEDevice::getSecurityPasskey() { +/*STATIC*/uint32_t NimBLEDevice::getSecurityPasskey() { return m_passkey; } // getSecurityPasskey @@ -1039,13 +963,11 @@ uint32_t NimBLEDevice::getSecurityPasskey() { * @param [in] callbacks Pointer to NimBLESecurityCallbacks class * @deprecated For backward compatibility, New code should use client/server callback methods. */ -/*STATIC*/ void NimBLEDevice::setSecurityCallbacks(NimBLESecurityCallbacks* callbacks) { NimBLEDevice::m_securityCallbacks = callbacks; } // setSecurityCallbacks -#ifdef ESP_PLATFORM /** * @brief Set the own address type. * @param [in] own_addr_type Own Bluetooth Device address type.\n @@ -1056,7 +978,6 @@ void NimBLEDevice::setSecurityCallbacks(NimBLESecurityCallbacks* callbacks) { * * 0x03: BLE_OWN_ADDR_RPA_RANDOM_DEFAULT * @param [in] useNRPA If true, and address type is random, uses a non-resolvable random address. */ -/*STATIC*/ void NimBLEDevice::setOwnAddrType(uint8_t own_addr_type, bool useNRPA) { m_own_addr_type = own_addr_type; switch (own_addr_type) { @@ -1080,15 +1001,18 @@ void NimBLEDevice::setOwnAddrType(uint8_t own_addr_type, bool useNRPA) { break; } } // setOwnAddrType -#endif + /** * @brief Start the connection securing and authorization for this connection. * @param conn_id The connection id of the peer device. * @returns NimBLE stack return code, 0 = success. */ -/* STATIC */ -int NimBLEDevice::startSecurity(uint16_t conn_id) { +/* STATIC */int NimBLEDevice::startSecurity(uint16_t conn_id) { + /* if(m_securityCallbacks != nullptr) { + m_securityCallbacks->onSecurityRequest(); + } + */ int rc = ble_gap_security_initiate(conn_id); if(rc != 0){ NIMBLE_LOGE(LOG_TAG, "ble_gap_security_initiate: rc=%d %s", rc, NimBLEUtils::returnCodeToString(rc)); @@ -1103,8 +1027,7 @@ int NimBLEDevice::startSecurity(uint16_t conn_id) { * @param [in] address The address to look for. * @return True if ignoring. */ -/*STATIC*/ -bool NimBLEDevice::isIgnored(const NimBLEAddress &address) { +/*STATIC*/ bool NimBLEDevice::isIgnored(const NimBLEAddress &address) { for(auto &it : m_ignoreList) { if(it.equals(address)){ return true; @@ -1119,8 +1042,7 @@ bool NimBLEDevice::isIgnored(const NimBLEAddress &address) { * @brief Add a device to the ignore list. * @param [in] address The address of the device we want to ignore. */ -/*STATIC*/ -void NimBLEDevice::addIgnored(const NimBLEAddress &address) { +/*STATIC*/ void NimBLEDevice::addIgnored(const NimBLEAddress &address) { m_ignoreList.push_back(address); } @@ -1129,8 +1051,7 @@ void NimBLEDevice::addIgnored(const NimBLEAddress &address) { * @brief Remove a device from the ignore list. * @param [in] address The address of the device we want to remove from the list. */ -/*STATIC*/ -void NimBLEDevice::removeIgnored(const NimBLEAddress &address) { +/*STATIC*/void NimBLEDevice::removeIgnored(const NimBLEAddress &address) { for(auto it = m_ignoreList.begin(); it != m_ignoreList.end(); ++it) { if((*it).equals(address)){ m_ignoreList.erase(it); @@ -1144,7 +1065,6 @@ void NimBLEDevice::removeIgnored(const NimBLEAddress &address) { * @brief Set a custom callback for gap events. * @param [in] handler The function to call when gap events occur. */ -/*STATIC*/ void NimBLEDevice::setCustomGapHandler(gap_event_handler handler) { m_customGapHandler = handler; int rc = ble_gap_event_listener_register(&m_listener, m_customGapHandler, NULL); @@ -1156,4 +1076,5 @@ void NimBLEDevice::setCustomGapHandler(gap_event_handler handler) { } } // setCustomGapHandler + #endif // CONFIG_BT_ENABLED diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDevice.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDevice.h index 94ad29478..08a042fc2 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDevice.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEDevice.h @@ -14,9 +14,10 @@ #ifndef MAIN_NIMBLEDEVICE_H_ #define MAIN_NIMBLEDEVICE_H_ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) #if defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER) #include "NimBLEScan.h" @@ -38,9 +39,7 @@ #include "NimBLESecurity.h" #include "NimBLEAddress.h" -#ifdef ESP_PLATFORM -# include "esp_bt.h" -#endif +#include "esp_bt.h" #include #include @@ -111,17 +110,8 @@ public: static NimBLEServer* getServer(); #endif -#ifdef ESP_PLATFORM static void setPower(esp_power_level_t powerLevel, esp_ble_power_type_t powerType=ESP_BLE_PWR_TYPE_DEFAULT); static int getPower(esp_ble_power_type_t powerType=ESP_BLE_PWR_TYPE_DEFAULT); - static void setOwnAddrType(uint8_t own_addr_type, bool useNRPA=false); - static void setScanDuplicateCacheSize(uint16_t cacheSize); - static void setScanFilterMode(uint8_t type); -#else - static void setPower(int dbm); - static int getPower(); -#endif - static void setCustomGapHandler(gap_event_handler handler); static void setSecurityAuth(bool bonding, bool mitm, bool sc); static void setSecurityAuth(uint8_t auth_req); @@ -131,12 +121,15 @@ public: static void setSecurityPasskey(uint32_t pin); static uint32_t getSecurityPasskey(); static void setSecurityCallbacks(NimBLESecurityCallbacks* pCallbacks); + static void setOwnAddrType(uint8_t own_addr_type, bool useNRPA=false); static int startSecurity(uint16_t conn_id); static int setMTU(uint16_t mtu); static uint16_t getMTU(); static bool isIgnored(const NimBLEAddress &address); static void addIgnored(const NimBLEAddress &address); static void removeIgnored(const NimBLEAddress &address); + static void setScanDuplicateCacheSize(uint16_t cacheSize); + static void setScanFilterMode(uint8_t type); #if defined(CONFIG_BT_NIMBLE_ROLE_BROADCASTER) static NimBLEAdvertising* getAdvertising(); @@ -206,10 +199,8 @@ private: static ble_gap_event_listener m_listener; static gap_event_handler m_customGapHandler; static uint8_t m_own_addr_type; -#ifdef ESP_PLATFORM static uint16_t m_scanDuplicateSize; static uint8_t m_scanFilterMode; -#endif static std::vector m_whiteList; }; diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEEddystoneTLM.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEEddystoneTLM.cpp index 255131c02..a07294265 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEEddystoneTLM.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEEddystoneTLM.cpp @@ -11,14 +11,12 @@ * Created on: Mar 12, 2018 * Author: pcbreflux */ - -#include "nimconfig.h" +#include "sdkconfig.h" #if defined(CONFIG_BT_ENABLED) #include "NimBLEEddystoneTLM.h" #include "NimBLELog.h" -#include #include #define ENDIAN_CHANGE_U16(x) ((((x)&0xFF00)>>8) + (((x)&0xFF)<<8)) @@ -126,30 +124,30 @@ std::string NimBLEEddystoneTLM::toString() { out += " C\n"; out += "Adv. Count "; - snprintf(val, sizeof(val), "%" PRIu32, ENDIAN_CHANGE_U32(m_eddystoneData.advCount)); + snprintf(val, sizeof(val), "%d", ENDIAN_CHANGE_U32(m_eddystoneData.advCount)); out += val; out += "\n"; out += "Time in seconds "; - snprintf(val, sizeof(val), "%" PRIu32, rawsec/10); + snprintf(val, sizeof(val), "%d", rawsec/10); out += val; out += "\n"; out += "Time "; - snprintf(val, sizeof(val), "%04" PRIu32, rawsec / 864000); + snprintf(val, sizeof(val), "%04d", rawsec / 864000); out += val; out += "."; - snprintf(val, sizeof(val), "%02" PRIu32, (rawsec / 36000) % 24); + snprintf(val, sizeof(val), "%02d", (rawsec / 36000) % 24); out += val; out += ":"; - snprintf(val, sizeof(val), "%02" PRIu32, (rawsec / 600) % 60); + snprintf(val, sizeof(val), "%02d", (rawsec / 600) % 60); out += val; out += ":"; - snprintf(val, sizeof(val), "%02" PRIu32, (rawsec / 10) % 60); + snprintf(val, sizeof(val), "%02d", (rawsec / 10) % 60); out += val; out += "\n"; diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEEddystoneTLM.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEEddystoneTLM.h index 265c81b45..eb1cb0721 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEEddystoneTLM.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEEddystoneTLM.h @@ -14,7 +14,6 @@ #ifndef _NimBLEEddystoneTLM_H_ #define _NimBLEEddystoneTLM_H_ - #include "NimBLEUUID.h" #include diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEEddystoneURL.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEEddystoneURL.cpp index 424df958e..7c3194c28 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEEddystoneURL.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEEddystoneURL.cpp @@ -11,7 +11,7 @@ * Created on: Mar 12, 2018 * Author: pcbreflux */ -#include "nimconfig.h" +#include "sdkconfig.h" #if defined(CONFIG_BT_ENABLED) #include "NimBLEEddystoneURL.h" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEHIDDevice.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEHIDDevice.cpp index 78c8fea3c..37d0f52f5 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEHIDDevice.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEHIDDevice.cpp @@ -11,9 +11,11 @@ * Created on: Jan 03, 2018 * Author: chegewara */ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) #include "NimBLEHIDDevice.h" #include "NimBLE2904.h" @@ -27,7 +29,7 @@ NimBLEHIDDevice::NimBLEHIDDevice(NimBLEServer* server) { * Here we create mandatory services described in bluetooth specification */ m_deviceInfoService = server->createService(NimBLEUUID((uint16_t) 0x180a)); - m_hidService = server->createService(NimBLEUUID((uint16_t) 0x1812)); + m_hidService = server->createService(NimBLEUUID((uint16_t) 0x1812), 40); m_batteryService = server->createService(NimBLEUUID((uint16_t) 0x180f)); /* @@ -245,4 +247,5 @@ NimBLEService* NimBLEHIDDevice::batteryService() { return m_batteryService; } -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_PERIPHERAL */ +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#endif // #if defined(CONFIG_BT_ENABLED) diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEHIDDevice.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEHIDDevice.h index ef2ed7395..6ed7c2bde 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEHIDDevice.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEHIDDevice.h @@ -15,8 +15,11 @@ #ifndef _BLEHIDDEVICE_H_ #define _BLEHIDDEVICE_H_ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) + #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_BROADCASTER) +#if defined(CONFIG_BT_NIMBLE_ROLE_BROADCASTER) #include "NimBLECharacteristic.h" #include "NimBLEService.h" @@ -81,6 +84,6 @@ private: NimBLECharacteristic* m_protocolModeCharacteristic; //0x2a4e NimBLECharacteristic* m_batteryLevelCharacteristic; //0x2a19 }; - -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_BROADCASTER */ +#endif // CONFIG_BT_NIMBLE_ROLE_BROADCASTER +#endif // CONFIG_BT_ENABLED #endif /* _BLEHIDDEVICE_H_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLELog.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLELog.h index 0cedca940..b76f1dc2d 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLELog.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLELog.h @@ -12,7 +12,49 @@ #if defined(CONFIG_BT_ENABLED) -#if defined(CONFIG_NIMBLE_CPP_IDF) // using esp-idf +#ifdef ARDUINO_ARCH_ESP32 +#include "syscfg/syscfg.h" +#include "modlog/modlog.h" + +// If Arduino is being used, strip out the colors and ignore log printing below ui setting. +// Note: because CONFIG_LOG_DEFAULT_LEVEL is set at ERROR in Arduino we must use MODLOG_DFLT(ERROR +// otherwise no messages will be printed above that level. + +#ifndef CONFIG_NIMBLE_CPP_DEBUG_LEVEL + #ifdef CORE_DEBUG_LEVEL + #define CONFIG_NIMBLE_CPP_DEBUG_LEVEL CORE_DEBUG_LEVEL + #else + #define CONFIG_NIMBLE_CPP_DEBUG_LEVEL 0 + #endif +#endif + +#if CONFIG_NIMBLE_CPP_DEBUG_LEVEL >= 4 +#define NIMBLE_LOGD( tag, format, ... ) MODLOG_DFLT(ERROR, "D %s: "#format"\n",tag,##__VA_ARGS__) +#else +#define NIMBLE_LOGD( tag, format, ... ) (void)tag +#endif + +#if CONFIG_NIMBLE_CPP_DEBUG_LEVEL >= 3 +#define NIMBLE_LOGI( tag, format, ... ) MODLOG_DFLT(ERROR, "I %s: "#format"\n",tag,##__VA_ARGS__) +#else +#define NIMBLE_LOGI( tag, format, ... ) (void)tag +#endif + +#if CONFIG_NIMBLE_CPP_DEBUG_LEVEL >= 2 +#define NIMBLE_LOGW( tag, format, ... ) MODLOG_DFLT(ERROR, "W %s: "#format"\n",tag,##__VA_ARGS__) +#else +#define NIMBLE_LOGW( tag, format, ... ) (void)tag +#endif + +#if CONFIG_NIMBLE_CPP_DEBUG_LEVEL >= 1 +#define NIMBLE_LOGE( tag, format, ... ) MODLOG_DFLT(ERROR, "E %s: "#format"\n",tag,##__VA_ARGS__) +#else +#define NIMBLE_LOGE( tag, format, ... ) (void)tag +#endif + +#define NIMBLE_LOGC( tag, format, ... ) MODLOG_DFLT(CRITICAL, "CRIT %s: "#format"\n",tag,##__VA_ARGS__) + +#else #include "esp_log.h" @@ -22,51 +64,7 @@ #define NIMBLE_LOGD(tag, format, ...) ESP_LOGD(tag, format, ##__VA_ARGS__) #define NIMBLE_LOGC(tag, format, ...) ESP_LOGE(tag, format, ##__VA_ARGS__) -#else // using Arduino +#endif /*ARDUINO_ARCH_ESP32*/ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/console/console.h" - -// If Arduino is being used, strip out the colors and ignore log printing below ui setting. -// Note: because CONFIG_LOG_DEFAULT_LEVEL is set at ERROR in Arduino we must use MODLOG_DFLT(ERROR -// otherwise no messages will be printed above that level. - -#ifndef NIMBLE_CPP_DEBUG_LEVEL - #if defined(ARDUINO_ARCH_ESP32) && defined(CORE_DEBUG_LEVEL) - #define NIMBLE_CPP_DEBUG_LEVEL CORE_DEBUG_LEVEL - #else - #define NIMBLE_CPP_DEBUG_LEVEL 0 - #endif -#endif - -#if NIMBLE_CPP_DEBUG_LEVEL >= 4 -#define NIMBLE_LOGD( tag, format, ... ) console_printf("D %s: "#format"\n",tag,##__VA_ARGS__) -#else -#define NIMBLE_LOGD( tag, format, ... ) (void)tag -#endif - -#if NIMBLE_CPP_DEBUG_LEVEL >= 3 -#define NIMBLE_LOGI( tag, format, ... ) console_printf("I %s: "#format"\n",tag,##__VA_ARGS__) -#else -#define NIMBLE_LOGI( tag, format, ... ) (void)tag -#endif - -#if NIMBLE_CPP_DEBUG_LEVEL >= 2 -#define NIMBLE_LOGW( tag, format, ... ) console_printf("W %s: "#format"\n",tag,##__VA_ARGS__) -#else -#define NIMBLE_LOGW( tag, format, ... ) (void)tag -#endif - -#if NIMBLE_CPP_DEBUG_LEVEL >= 1 -#define NIMBLE_LOGE( tag, format, ... ) console_printf("E %s: "#format"\n",tag,##__VA_ARGS__) -#define NIMBLE_LOGC( tag, format, ... ) console_printf("CRIT %s: "#format"\n",tag,##__VA_ARGS__) -#else -#define NIMBLE_LOGE( tag, format, ... ) (void)tag -#define NIMBLE_LOGC( tag, format, ... ) (void)tag -#endif - - - -#endif /* CONFIG_NIMBLE_CPP_IDF */ -#endif /* CONFIG_BT_ENABLED */ -#endif /* MAIN_NIMBLELOG_H_ */ +#endif /*CONFIG_BT_ENABLED*/ +#endif /*MAIN_NIMBLELOG_H_*/ \ No newline at end of file diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteCharacteristic.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteCharacteristic.cpp index de5040672..3b7e1ccfc 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteCharacteristic.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteCharacteristic.cpp @@ -12,8 +12,11 @@ * Author: kolban */ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) + #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) #include "NimBLERemoteCharacteristic.h" #include "NimBLEUtils.h" @@ -57,6 +60,7 @@ static const char* LOG_TAG = "NimBLERemoteCharacteristic"; m_pRemoteService = pRemoteService; m_notifyCallback = nullptr; m_timestamp = 0; + m_valMux = portMUX_INITIALIZER_UNLOCKED; NIMBLE_LOGD(LOG_TAG, "<< NimBLERemoteCharacteristic(): %s", m_uuid.toString().c_str()); } // NimBLERemoteCharacteristic @@ -237,7 +241,8 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(const NimBLEUUID *uuid_filt } int rc = 0; - ble_task_data_t taskData = {this, xTaskGetCurrentTaskHandle(), 0, nullptr}; + TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); + ble_task_data_t taskData = {this, cur_task, 0, nullptr}; // If we don't know the end handle of this characteristic retrieve the next one in the service // The end handle is the next characteristic definition handle -1. @@ -252,6 +257,10 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(const NimBLEUUID *uuid_filt return false; } +#ifdef ulTaskNotifyValueClear + // Clear the task notification value to ensure we block + ulTaskNotifyValueClear(cur_task, ULONG_MAX); +#endif ulTaskNotifyTake(pdTRUE, portMAX_DELAY); if (taskData.rc != 0) { @@ -273,6 +282,10 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(const NimBLEUUID *uuid_filt return false; } +#ifdef ulTaskNotifyValueClear + // Clear the task notification value to ensure we block + ulTaskNotifyValueClear(cur_task, ULONG_MAX); +#endif ulTaskNotifyTake(pdTRUE, portMAX_DELAY); if (taskData.rc != 0) { @@ -404,12 +417,12 @@ NimBLEUUID NimBLERemoteCharacteristic::getUUID() { * @return The value of the remote characteristic. */ std::string NimBLERemoteCharacteristic::getValue(time_t *timestamp) { - ble_npl_hw_enter_critical(); + portENTER_CRITICAL(&m_valMux); std::string value = m_value; if(timestamp != nullptr) { *timestamp = m_timestamp; } - ble_npl_hw_exit_critical(0); + portEXIT_CRITICAL(&m_valMux); return value; } @@ -473,7 +486,8 @@ std::string NimBLERemoteCharacteristic::readValue(time_t *timestamp) { int rc = 0; int retryCount = 1; - ble_task_data_t taskData = {this, xTaskGetCurrentTaskHandle(),0, &value}; + TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); + ble_task_data_t taskData = {this, cur_task, 0, &value}; do { rc = ble_gattc_read_long(pClient->getConnId(), m_handle, 0, @@ -485,6 +499,10 @@ std::string NimBLERemoteCharacteristic::readValue(time_t *timestamp) { return value; } +#ifdef ulTaskNotifyValueClear + // Clear the task notification value to ensure we block + ulTaskNotifyValueClear(cur_task, ULONG_MAX); +#endif ulTaskNotifyTake(pdTRUE, portMAX_DELAY); rc = taskData.rc; @@ -511,13 +529,13 @@ std::string NimBLERemoteCharacteristic::readValue(time_t *timestamp) { } while(rc != 0 && retryCount--); time_t t = time(nullptr); - ble_npl_hw_enter_critical(); + portENTER_CRITICAL(&m_valMux); m_value = value; m_timestamp = t; if(timestamp != nullptr) { *timestamp = m_timestamp; } - ble_npl_hw_exit_critical(0); + portEXIT_CRITICAL(&m_valMux); NIMBLE_LOGD(LOG_TAG, "<< readValue length: %d rc=%d", value.length(), rc); return value; @@ -547,11 +565,12 @@ int NimBLERemoteCharacteristic::onReadCB(uint16_t conn_handle, if(rc == 0) { if(attr) { - if(((*strBuf).length() + attr->om->om_len) > BLE_ATT_ATTR_MAX_LEN) { + uint32_t data_len = OS_MBUF_PKTLEN(attr->om); + if(((*strBuf).length() + data_len) > BLE_ATT_ATTR_MAX_LEN) { rc = BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN; } else { - NIMBLE_LOGD(LOG_TAG, "Got %d bytes", attr->om->om_len); - (*strBuf) += std::string((char*) attr->om->om_data, attr->om->om_len); + NIMBLE_LOGD(LOG_TAG, "Got %d bytes", data_len); + (*strBuf) += std::string((char*) attr->om->om_data, data_len); return 0; } } @@ -741,7 +760,8 @@ bool NimBLERemoteCharacteristic::writeValue(const uint8_t* data, size_t length, return (rc==0); } - ble_task_data_t taskData = {this, xTaskGetCurrentTaskHandle(), 0, nullptr}; + TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); + ble_task_data_t taskData = {this, cur_task, 0, nullptr}; do { if(length > mtu) { @@ -761,6 +781,10 @@ bool NimBLERemoteCharacteristic::writeValue(const uint8_t* data, size_t length, return false; } +#ifdef ulTaskNotifyValueClear + // Clear the task notification value to ensure we block + ulTaskNotifyValueClear(cur_task, ULONG_MAX); +#endif ulTaskNotifyTake(pdTRUE, portMAX_DELAY); rc = taskData.rc; @@ -815,4 +839,6 @@ int NimBLERemoteCharacteristic::onWriteCB(uint16_t conn_handle, return 0; } -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL */ + +#endif // #if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#endif /* CONFIG_BT_ENABLED */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteCharacteristic.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteCharacteristic.h index 41ae816d4..39e6d40fa 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteCharacteristic.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteCharacteristic.h @@ -14,9 +14,11 @@ #ifndef COMPONENTS_NIMBLEREMOTECHARACTERISTIC_H_ #define COMPONENTS_NIMBLEREMOTECHARACTERISTIC_H_ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) #include "NimBLERemoteService.h" #include "NimBLERemoteDescriptor.h" @@ -159,10 +161,12 @@ private: std::string m_value; notify_callback m_notifyCallback; time_t m_timestamp; + portMUX_TYPE m_valMux; // We maintain a vector of descriptors owned by this characteristic. std::vector m_descriptorVector; }; // NimBLERemoteCharacteristic -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL */ +#endif // #if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#endif /* CONFIG_BT_ENABLED */ #endif /* COMPONENTS_NIMBLEREMOTECHARACTERISTIC_H_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteDescriptor.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteDescriptor.cpp index 44b559000..887dab667 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteDescriptor.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteDescriptor.cpp @@ -11,9 +11,11 @@ * Created on: Jul 8, 2017 * Author: kolban */ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) #include "NimBLERemoteDescriptor.h" #include "NimBLEUtils.h" @@ -137,7 +139,8 @@ std::string NimBLERemoteDescriptor::readValue() { int rc = 0; int retryCount = 1; - ble_task_data_t taskData = {this, xTaskGetCurrentTaskHandle(),0, &value}; + TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); + ble_task_data_t taskData = {this, cur_task, 0, &value}; do { rc = ble_gattc_read_long(pClient->getConnId(), m_handle, 0, @@ -149,6 +152,10 @@ std::string NimBLERemoteDescriptor::readValue() { return value; } +#ifdef ulTaskNotifyValueClear + // Clear the task notification value to ensure we block + ulTaskNotifyValueClear(cur_task, ULONG_MAX); +#endif ulTaskNotifyTake(pdTRUE, portMAX_DELAY); rc = taskData.rc; @@ -186,7 +193,6 @@ int NimBLERemoteDescriptor::onReadCB(uint16_t conn_handle, const struct ble_gatt_error *error, struct ble_gatt_attr *attr, void *arg) { - (void)attr; ble_task_data_t *pTaskData = (ble_task_data_t*)arg; NimBLERemoteDescriptor* desc = (NimBLERemoteDescriptor*)pTaskData->pATT; uint16_t conn_id = desc->getRemoteCharacteristic()->getRemoteService()->getClient()->getConnId(); @@ -202,11 +208,12 @@ int NimBLERemoteDescriptor::onReadCB(uint16_t conn_handle, if(rc == 0) { if(attr) { - if(((*strBuf).length() + attr->om->om_len) > BLE_ATT_ATTR_MAX_LEN) { + uint32_t data_len = OS_MBUF_PKTLEN(attr->om); + if(((*strBuf).length() + data_len) > BLE_ATT_ATTR_MAX_LEN) { rc = BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN; } else { - NIMBLE_LOGD(LOG_TAG, "Got %d bytes", attr->om->om_len); - (*strBuf) += std::string((char*) attr->om->om_data, attr->om->om_len); + NIMBLE_LOGD(LOG_TAG, "Got %d bytes", data_len); + (*strBuf) += std::string((char*) attr->om->om_data, data_len); return 0; } } @@ -288,7 +295,8 @@ bool NimBLERemoteDescriptor::writeValue(const uint8_t* data, size_t length, bool return (rc == 0); } - ble_task_data_t taskData = {this, xTaskGetCurrentTaskHandle(), 0, nullptr}; + TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); + ble_task_data_t taskData = {this, cur_task, 0, nullptr}; do { if(length > mtu) { @@ -309,6 +317,10 @@ bool NimBLERemoteDescriptor::writeValue(const uint8_t* data, size_t length, bool return false; } +#ifdef ulTaskNotifyValueClear + // Clear the task notification value to ensure we block + ulTaskNotifyValueClear(cur_task, ULONG_MAX); +#endif ulTaskNotifyTake(pdTRUE, portMAX_DELAY); rc = taskData.rc; @@ -349,4 +361,5 @@ bool NimBLERemoteDescriptor::writeValue(const std::string &newValue, bool respon return writeValue((uint8_t*) newValue.data(), newValue.length(), response); } // writeValue -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL */ +#endif // #if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#endif /* CONFIG_BT_ENABLED */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteDescriptor.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteDescriptor.h index 13e83516d..b52738ef7 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteDescriptor.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteDescriptor.h @@ -14,9 +14,11 @@ #ifndef COMPONENTS_NIMBLEREMOTEDESCRIPTOR_H_ #define COMPONENTS_NIMBLEREMOTEDESCRIPTOR_H_ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) #include "NimBLERemoteCharacteristic.h" @@ -79,5 +81,6 @@ private: NimBLERemoteCharacteristic* m_pRemoteCharacteristic; }; -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL */ +#endif // #if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#endif /* CONFIG_BT_ENABLED */ #endif /* COMPONENTS_NIMBLEREMOTEDESCRIPTOR_H_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteService.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteService.cpp index b8ae4fce5..6557369df 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteService.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteService.cpp @@ -11,9 +11,11 @@ * Created on: Jul 8, 2017 * Author: kolban */ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) #include "NimBLERemoteService.h" #include "NimBLEUtils.h" @@ -196,7 +198,8 @@ bool NimBLERemoteService::retrieveCharacteristics(const NimBLEUUID *uuid_filter) NIMBLE_LOGD(LOG_TAG, ">> retrieveCharacteristics() for service: %s", getUUID().toString().c_str()); int rc = 0; - ble_task_data_t taskData = {this, xTaskGetCurrentTaskHandle(), 0, nullptr}; + TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); + ble_task_data_t taskData = {this, cur_task, 0, nullptr}; if(uuid_filter == nullptr) { rc = ble_gattc_disc_all_chrs(m_pClient->getConnId(), @@ -218,6 +221,10 @@ bool NimBLERemoteService::retrieveCharacteristics(const NimBLEUUID *uuid_filter) return false; } +#ifdef ulTaskNotifyValueClear + // Clear the task notification value to ensure we block + ulTaskNotifyValueClear(cur_task, ULONG_MAX); +#endif ulTaskNotifyTake(pdTRUE, portMAX_DELAY); if(taskData.rc == 0){ @@ -384,4 +391,6 @@ std::string NimBLERemoteService::toString() { return res; } // toString -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL */ + +#endif // #if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#endif /* CONFIG_BT_ENABLED */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteService.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteService.h index 0443cfd99..751c9effb 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteService.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLERemoteService.h @@ -14,9 +14,11 @@ #ifndef COMPONENTS_NIMBLEREMOTESERVICE_H_ #define COMPONENTS_NIMBLEREMOTESERVICE_H_ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) #include "NimBLEClient.h" #include "NimBLEUUID.h" @@ -81,5 +83,6 @@ private: uint16_t m_endHandle; }; // NimBLERemoteService -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL */ +#endif // #if defined( CONFIG_BT_NIMBLE_ROLE_CENTRAL) +#endif /* CONFIG_BT_ENABLED */ #endif /* COMPONENTS_NIMBLEREMOTESERVICE_H_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEScan.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEScan.cpp index d9dcb7de4..10c946a7e 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEScan.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEScan.cpp @@ -11,9 +11,11 @@ * Created on: Jul 1, 2017 * Author: kolban */ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER) +#if defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER) #include "NimBLEScan.h" #include "NimBLEDevice.h" @@ -356,10 +358,15 @@ NimBLEScanResults NimBLEScan::start(uint32_t duration, bool is_continue) { NIMBLE_LOGW(LOG_TAG, "Blocking scan called with duration = forever"); } - ble_task_data_t taskData = {nullptr, xTaskGetCurrentTaskHandle(),0, nullptr}; + TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); + ble_task_data_t taskData = {nullptr, cur_task, 0, nullptr}; m_pTaskData = &taskData; if(start(duration, nullptr, is_continue)) { +#ifdef ulTaskNotifyValueClear + // Clear the task notification value to ensure we block + ulTaskNotifyValueClear(cur_task, ULONG_MAX); +#endif ulTaskNotifyTake(pdTRUE, portMAX_DELAY); } @@ -532,4 +539,5 @@ NimBLEAdvertisedDevice *NimBLEScanResults::getDevice(const NimBLEAddress &addres return nullptr; } -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_OBSERVER */ +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER) +#endif /* CONFIG_BT_ENABLED */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEScan.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEScan.h index 76a114276..49d67c8ec 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEScan.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEScan.h @@ -13,18 +13,16 @@ */ #ifndef COMPONENTS_NIMBLE_SCAN_H_ #define COMPONENTS_NIMBLE_SCAN_H_ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER) +#if defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER) #include "NimBLEAdvertisedDevice.h" #include "NimBLEUtils.h" -#if defined(CONFIG_NIMBLE_CPP_IDF) #include "host/ble_gap.h" -#else -#include "nimble/nimble/host/include/host/ble_gap.h" -#endif #include @@ -99,5 +97,6 @@ private: uint8_t m_maxResults; }; -#endif /* CONFIG_BT_ENABLED CONFIG_BT_NIMBLE_ROLE_OBSERVER */ +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER) +#endif /* CONFIG_BT_ENABLED */ #endif /* COMPONENTS_NIMBLE_SCAN_H_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLESecurity.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLESecurity.cpp index df6d192b4..aa0629698 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLESecurity.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLESecurity.cpp @@ -12,7 +12,7 @@ * Author: chegewara */ -#include "nimconfig.h" +#include "sdkconfig.h" #if defined(CONFIG_BT_ENABLED) #include "NimBLESecurity.h" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLESecurity.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLESecurity.h index 157577d7b..5a7619f45 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLESecurity.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLESecurity.h @@ -14,16 +14,10 @@ #ifndef COMPONENTS_NIMBLESECURITY_H_ #define COMPONENTS_NIMBLESECURITY_H_ - -#include "nimconfig.h" +#include "sdkconfig.h" #if defined(CONFIG_BT_ENABLED) -#if defined(CONFIG_NIMBLE_CPP_IDF) #include "host/ble_gap.h" -#else -#include "nimble/nimble/host/include/host/ble_gap.h" -#endif - /**** FIX COMPILATION ****/ #undef min #undef max diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEServer.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEServer.cpp index e31c81b45..7206a1508 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEServer.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEServer.cpp @@ -12,20 +12,19 @@ * Author: kolban */ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) + #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) #include "NimBLEServer.h" #include "NimBLEDevice.h" #include "NimBLELog.h" -#if defined(CONFIG_NIMBLE_CPP_IDF) #include "services/gap/ble_svc_gap.h" #include "services/gatt/ble_svc_gatt.h" -#else -#include "nimble/nimble/host/services/gap/include/services/gap/ble_svc_gap.h" -#include "nimble/nimble/host/services/gatt/include/services/gatt/ble_svc_gatt.h" -#endif + static const char* LOG_TAG = "NimBLEServer"; static NimBLEServerCallbacks defaultCallbacks; @@ -80,17 +79,18 @@ NimBLEService* NimBLEServer::createService(const char* uuid) { * to provide inst_id value different for each service. * @return A reference to the new service object. */ -NimBLEService* NimBLEServer::createService(const NimBLEUUID &uuid) { +NimBLEService* NimBLEServer::createService(const NimBLEUUID &uuid, uint32_t numHandles, uint8_t inst_id) { NIMBLE_LOGD(LOG_TAG, ">> createService - %s", uuid.toString().c_str()); - + // TODO: add functionality to use inst_id for multiple services with same uuid + (void)inst_id; // Check that a service with the supplied UUID does not already exist. if(getServiceByUUID(uuid) != nullptr) { NIMBLE_LOGW(LOG_TAG, "Warning creating a duplicate service UUID: %s", std::string(uuid).c_str()); } - NimBLEService* pService = new NimBLEService(uuid); - m_svcVec.push_back(pService); + NimBLEService* pService = new NimBLEService(uuid, numHandles, this); + m_svcVec.push_back(pService); // Save a reference to this service being on this server. serviceChanged(); NIMBLE_LOGD(LOG_TAG, "<< createService"); @@ -181,7 +181,7 @@ void NimBLEServer::start() { abort(); } -#if CONFIG_LOG_DEFAULT_LEVEL > 3 || (ARDUINO_ARCH_ESP32 && CORE_DEBUG_LEVEL >= 4) +#if CONFIG_NIMBLE_CPP_DEBUG_LEVEL >= 4 ble_gatts_show_local(); #endif /*** Future use *** @@ -734,7 +734,7 @@ void NimBLEServer::startAdvertising() { */ void NimBLEServer::stopAdvertising() { NimBLEDevice::stopAdvertising(); -} // stopAdvertising +} // startAdvertising /** @@ -772,30 +772,7 @@ void NimBLEServer::updateConnParams(uint16_t conn_handle, if(rc != 0) { NIMBLE_LOGE(LOG_TAG, "Update params error: %d, %s", rc, NimBLEUtils::returnCodeToString(rc)); } -} // updateConnParams - - -/** - * @brief Request an update of the data packet length. - * * Can only be used after a connection has been established. - * @details Sends a data length update request to the peer. - * The Data Length Extension (DLE) allows to increase the Data Channel Payload from 27 bytes to up to 251 bytes. - * The peer needs to support the Bluetooth 4.2 specifications, to be capable of DLE. - * @param [in] conn_handle The connection handle of the peer to send the request to. - * @param [in] tx_octets The preferred number of payload octets to use (Range 0x001B-0x00FB). - */ -void NimBLEServer::setDataLen(uint16_t conn_handle, uint16_t tx_octets) { -#ifdef CONFIG_NIMBLE_CPP_IDF // not yet available in IDF, Sept 9 2021 - return; -#else - uint16_t tx_time = (tx_octets + 14) * 8; - - int rc = ble_gap_set_data_len(conn_handle, tx_octets, tx_time); - if(rc != 0) { - NIMBLE_LOGE(LOG_TAG, "Set data length error: %d, %s", rc, NimBLEUtils::returnCodeToString(rc)); - } -#endif -} // setDataLen +}// updateConnParams bool NimBLEServer::setIndicateWait(uint16_t conn_handle) { @@ -865,4 +842,6 @@ bool NimBLEServerCallbacks::onConfirmPIN(uint32_t pin){ return true; } -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_PERIPHERAL */ + +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#endif // CONFIG_BT_ENABLED diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEServer.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEServer.h index 5054b844e..ebcf39f23 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEServer.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEServer.h @@ -14,9 +14,11 @@ #ifndef MAIN_NIMBLESERVER_H_ #define MAIN_NIMBLESERVER_H_ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) #define NIMBLE_ATT_REMOVE_HIDE 1 #define NIMBLE_ATT_REMOVE_DELETE 2 @@ -41,7 +43,8 @@ class NimBLEServer { public: size_t getConnectedCount(); NimBLEService* createService(const char* uuid); - NimBLEService* createService(const NimBLEUUID &uuid); + NimBLEService* createService(const NimBLEUUID &uuid, uint32_t numHandles=15, + uint8_t inst_id=0); void removeService(NimBLEService* service, bool deleteSvc = false); void addService(NimBLEService* service); NimBLEAdvertising* getAdvertising(); @@ -58,7 +61,6 @@ public: void updateConnParams(uint16_t conn_handle, uint16_t minInterval, uint16_t maxInterval, uint16_t latency, uint16_t timeout); - void setDataLen(uint16_t conn_handle, uint16_t tx_octets); uint16_t getPeerMTU(uint16_t conn_id); std::vector getPeerDevices(); NimBLEConnInfo getPeerInfo(size_t index); @@ -166,5 +168,7 @@ public: virtual bool onConfirmPIN(uint32_t pin); }; // NimBLEServerCallbacks -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_PERIPHERAL */ + +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#endif /* CONFIG_BT_ENABLED */ #endif /* MAIN_NIMBLESERVER_H_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEService.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEService.cpp index 18e15bcbd..9c43e900c 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEService.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEService.cpp @@ -14,10 +14,12 @@ // A service is identified by a UUID. A service is also the container for one or more characteristics. -#include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) + +#include "nimconfig.h" +#if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) -#include "NimBLEDevice.h" #include "NimBLEService.h" #include "NimBLEUtils.h" #include "NimBLELog.h" @@ -32,19 +34,25 @@ static const char* LOG_TAG = "NimBLEService"; // Tag for logging. /** * @brief Construct an instance of the NimBLEService * @param [in] uuid The UUID of the service. + * @param [in] numHandles The maximum number of handles associated with the service. + * @param [in] pServer A pointer to the server instance that this service belongs to. */ -NimBLEService::NimBLEService(const char* uuid) -: NimBLEService(NimBLEUUID(uuid)) { +NimBLEService::NimBLEService(const char* uuid, uint16_t numHandles, NimBLEServer* pServer) +: NimBLEService(NimBLEUUID(uuid), numHandles, pServer) { } /** * @brief Construct an instance of the BLEService * @param [in] uuid The UUID of the service. + * @param [in] numHandles The maximum number of handles associated with the service. + * @param [in] pServer A pointer to the server instance that this service belongs to. */ -NimBLEService::NimBLEService(const NimBLEUUID &uuid) { +NimBLEService::NimBLEService(const NimBLEUUID &uuid, uint16_t numHandles, NimBLEServer* pServer) { m_uuid = uuid; m_handle = NULL_HANDLE; + m_pServer = pServer; + m_numHandles = numHandles; m_pSvcDef = nullptr; m_removed = 0; @@ -421,7 +429,8 @@ std::string NimBLEService::toString() { * @return The BLEServer associated with this service. */ NimBLEServer* NimBLEService::getServer() { - return NimBLEDevice::getServer(); + return m_pServer; }// getServer -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_PERIPHERAL */ +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#endif // CONFIG_BT_ENABLED diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEService.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEService.h index fbdd2e1bd..ebf913d32 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEService.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEService.h @@ -14,9 +14,11 @@ #ifndef MAIN_NIMBLESERVICE_H_ #define MAIN_NIMBLESERVICE_H_ +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) #include "nimconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) #include "NimBLEServer.h" #include "NimBLECharacteristic.h" @@ -34,8 +36,8 @@ class NimBLECharacteristic; class NimBLEService { public: - NimBLEService(const char* uuid); - NimBLEService(const NimBLEUUID &uuid); + NimBLEService(const char* uuid, uint16_t numHandles, NimBLEServer* pServer); + NimBLEService(const NimBLEUUID &uuid, uint16_t numHandles, NimBLEServer* pServer); ~NimBLEService(); NimBLEServer* getServer(); @@ -74,12 +76,16 @@ private: friend class NimBLEDevice; uint16_t m_handle; + NimBLEServer* m_pServer; NimBLEUUID m_uuid; + uint16_t m_numHandles; ble_gatt_svc_def* m_pSvcDef; uint8_t m_removed; std::vector m_chrVec; }; // NimBLEService -#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_PERIPHERAL */ + +#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) +#endif // CONFIG_BT_ENABLED #endif /* MAIN_NIMBLESERVICE_H_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUUID.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUUID.cpp index 4234650d8..9338d7d00 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUUID.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUUID.cpp @@ -11,8 +11,7 @@ * Created on: Jun 21, 2017 * Author: kolban */ - -#include "nimconfig.h" +#include "sdkconfig.h" #if defined(CONFIG_BT_ENABLED) #include "NimBLEUtils.h" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUUID.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUUID.h index 724db19fd..982f9c36d 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUUID.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUUID.h @@ -14,16 +14,10 @@ #ifndef COMPONENTS_NIMBLEUUID_H_ #define COMPONENTS_NIMBLEUUID_H_ - -#include "nimconfig.h" +#include "sdkconfig.h" #if defined(CONFIG_BT_ENABLED) -#if defined(CONFIG_NIMBLE_CPP_IDF) #include "host/ble_uuid.h" -#else -#include "nimble/nimble/host/include/host/ble_uuid.h" -#endif - /**** FIX COMPILATION ****/ #undef min #undef max diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUtils.cpp b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUtils.cpp index c6bd823ff..7a1f55b41 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUtils.cpp +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUtils.cpp @@ -6,13 +6,12 @@ * */ -#include "nimconfig.h" +#include "sdkconfig.h" #if defined(CONFIG_BT_ENABLED) #include "NimBLEUtils.h" #include "NimBLELog.h" - -#include +#include "nimconfig.h" static const char* LOG_TAG = "NimBLEUtils"; @@ -343,7 +342,6 @@ const char* NimBLEUtils::returnCodeToString(int rc) { return "Unknown"; } #else // #if defined(CONFIG_NIMBLE_CPP_ENABLE_RETURN_CODE_TEXT) - (void)rc; return ""; #endif // #if defined(CONFIG_NIMBLE_CPP_ENABLE_RETURN_CODE_TEXT) } @@ -371,7 +369,6 @@ const char* NimBLEUtils::advTypeToString(uint8_t advType) { return "Unknown flag"; } #else // #if defined(CONFIG_NIMBLE_CPP_ENABLE_ADVERTISMENT_TYPE_TEXT) - (void)advType; return ""; #endif // #if defined(CONFIG_NIMBLE_CPP_ENABLE_ADVERTISMENT_TYPE_TEXT) } // adFlagsToString @@ -419,11 +416,8 @@ char* NimBLEUtils::buildHexData(uint8_t* target, const uint8_t* source, uint8_t * @param [in] arg Unused. */ void NimBLEUtils::dumpGapEvent(ble_gap_event *event, void *arg){ - (void)arg; #if defined(CONFIG_NIMBLE_CPP_ENABLE_GAP_EVENT_CODE_TEXT) NIMBLE_LOGD(LOG_TAG, "Received a GAP event: %s", gapEventToString(event->type)); -#else - (void)event; #endif } @@ -510,7 +504,6 @@ const char* NimBLEUtils::gapEventToString(uint8_t eventType) { return "Unknown event type"; } #else // #if defined(CONFIG_NIMBLE_CPP_ENABLE_GAP_EVENT_CODE_TEXT) - (void)eventType; return ""; #endif // #if defined(CONFIG_NIMBLE_CPP_ENABLE_GAP_EVENT_CODE_TEXT) } // gapEventToString diff --git a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUtils.h b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUtils.h index 2fe4b3c41..acbc93e72 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUtils.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/NimBLEUtils.h @@ -8,15 +8,10 @@ #ifndef COMPONENTS_NIMBLEUTILS_H_ #define COMPONENTS_NIMBLEUTILS_H_ - -#include "nimconfig.h" +#include "sdkconfig.h" #if defined(CONFIG_BT_ENABLED) -#if defined(CONFIG_NIMBLE_CPP_IDF) #include "host/ble_gap.h" -#else -#include "nimble/nimble/host/include/host/ble_gap.h" -#endif /**** FIX COMPILATION ****/ #undef min diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/README.md b/lib/libesp32_div/NimBLE-Arduino/src/README.md similarity index 90% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/README.md rename to lib/libesp32_div/NimBLE-Arduino/src/README.md index 37103be08..bbd17fc85 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/README.md +++ b/lib/libesp32_div/NimBLE-Arduino/src/README.md @@ -23,7 +23,7 @@ ## Overview -Apache NimBLE is an open-source Bluetooth 5.1 stack (both Host & Controller) +Apache NimBLE is an open-source Bluetooth 5.0 stack (both Host & Controller) that completely replaces the proprietary SoftDevice on Nordic chipsets. It is part of [Apache Mynewt project](https://github.com/apache/mynewt-core). @@ -33,6 +33,7 @@ Features highlight: - Support for up to 32 simultaneous connections. - Legacy and SC (secure connections) SMP support (pairing and bonding). - Advertising Extensions. + - Periodic Advertising. - Coded (aka Long Range) and 2M PHYs. - Bluetooth Mesh. @@ -83,24 +84,27 @@ There are also some sample applications that show how to Apache Mynewt NimBLE stack. These sample applications are located in the `apps/` directory of Apache Mynewt [repo](https://github.com/apache/mynewt-core). Some examples: -* [blecent](https://github.com/apache/mynewt-nimble/tree/master/apps/blecent): +* [blecent](https://github.com/apache/mynewt-core/tree/master/apps/blecent): A basic central device with no user interface. This application scans for a peripheral that supports the alert notification service (ANS). Upon discovering such a peripheral, blecent connects and performs a characteristic read, characteristic write, and notification subscription. -* [blehci](https://github.com/apache/mynewt-nimble/tree/master/apps/blehci): +* [blehci](https://github.com/apache/mynewt-core/tree/master/apps/blehci): Implements a BLE controller-only application. A separate host-only implementation, such as Linux's BlueZ, can interface with this application via HCI over UART. -* [bleprph](https://github.com/apache/mynewt-nimble/tree/master/apps/bleprph): An +* [bleprph](https://github.com/apache/mynewt-core/tree/master/apps/bleprph): An implementation of a minimal BLE peripheral. -* [btshell](https://github.com/apache/mynewt-nimble/tree/master/apps/btshell): A +* [btshell](https://github.com/apache/mynewt-core/tree/master/apps/btshell): A shell-like application allowing to configure and use most of NimBLE functionality from command line. * [bleuart](https://github.com/apache/mynewt-core/tree/master/apps/bleuart): Implements a simple BLE peripheral that supports the Nordic UART / Serial Port Emulation service (https://developer.nordicsemi.com/nRF5_SDK/nRF51_SDK_v8.x.x/doc/8.0.0/s110/html/a00072.html). +* [test](https://github.com/apache/mynewt-core/tree/master/apps/test): Test + project which can be compiled either with the simulator, or on a per-architecture basis. + Test will run all the package's unit tests. # Getting Help @@ -109,7 +113,7 @@ want to talk to a human about what you're working on, you can contact us via the [developers mailing list](mailto:dev@mynewt.apache.org). Although not a formal channel, you can also find a number of core developers -on the #mynewt channel on Freenode IRC or #general channel on [Mynewt Slack](https://mynewt.slack.com/join/shared_invite/enQtNjA1MTg0NzgyNzg3LTcyMmZiOGQzOGMxM2U4ODFmMTIwNjNmYTE5Y2UwYjQwZWIxNTE0MTUzY2JmMTEzOWFjYWZkNGM0YmM4MzAxNWQ) +on the #mynewt channel on Freenode IRC or #general channel on [Mynewt Slack](https://join.slack.com/mynewt/shared_invite/MTkwMTg1ODM1NTg5LTE0OTYxNzQ4NzQtZTU1YmNhYjhkMg) Also, be sure to checkout the [Frequently Asked Questions](https://mynewt.apache.org/faq/answers) for some help troubleshooting first. diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/RELEASE_NOTES.md b/lib/libesp32_div/NimBLE-Arduino/src/RELEASE_NOTES.md similarity index 56% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/RELEASE_NOTES.md rename to lib/libesp32_div/NimBLE-Arduino/src/RELEASE_NOTES.md index 3bdd31ad0..cda8fe2e4 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/RELEASE_NOTES.md +++ b/lib/libesp32_div/NimBLE-Arduino/src/RELEASE_NOTES.md @@ -1,32 +1,26 @@ # RELEASE NOTES -18 March 2020 - Apache NimBLE v1.3.0 +16 July 2019 - Apache NimBLE v1.2.0 For full release notes, please visit the [Apache Mynewt Wiki](https://cwiki.apache.org/confluence/display/MYNEWT/Release+Notes). -Apache NimBLE is an open-source Bluetooth 5.1 stack (both Host & Controller) that completely +Apache NimBLE is an open-source Bluetooth 5.0 stack (both Host & Controller) that completely replaces the proprietary SoftDevice on Nordic chipsets. New features in this version of NimBLE include: -* Support for Bluetooth Core Specification 5.1 -* New blestress test application -* Dialog DA1469x CMAC driver -* Support for LE Secure Connections out-of-band (OOB) association model -* Support for automated generation of syscfg for ports +* Perdiodic Advertising support with up to 1650 bytes of data (scanner and advertiser) +* Support for scan request notification in GAP API +* Updated host qualification ID * Qualification related bugfixes +* GAP API doxygen documentation update * BLE Mesh improvements - fixes and resync with latest Zephyr code * RIOT OS port fixes and improvements * btshell sample application improvements * improvements for bttester application * Controller duplicates filtering improvements -* Multi PHY support improvements -* Memory and CPU usage optimizations -* Use of packed structs for HCI (code size reduction) -* Linux sample improvements -* PTS test instructions updates -* Clock managements improvements in controller +* Memory and CPU usage optimizations in controller If working on next-generation RTOS and Bluetooth protocol stack sounds exciting to you, get in touch, by sending a mail to the Apache Mynewt diff --git a/lib/libesp32_div/NimBLE-Arduino/src/console/console.h b/lib/libesp32_div/NimBLE-Arduino/src/console/console.h new file mode 100644 index 000000000..96f965159 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/console/console.h @@ -0,0 +1,21 @@ +// Copyright 2019 Espressif Systems (Shanghai) PTE LTD +// +//Licensed 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 _CONSOLE_H +#define _CONSOLE_H + +#include + +#define console_printf printf + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/esp-hci/src/esp_nimble_hci.c b/lib/libesp32_div/NimBLE-Arduino/src/esp-hci/src/esp_nimble_hci.c similarity index 96% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/esp-hci/src/esp_nimble_hci.c rename to lib/libesp32_div/NimBLE-Arduino/src/esp-hci/src/esp_nimble_hci.c index f4df29a65..2963e15b3 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/esp-hci/src/esp_nimble_hci.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/esp-hci/src/esp_nimble_hci.c @@ -19,19 +19,17 @@ * under the License. */ -#ifdef ESP_PLATFORM - #include -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "nimble/nimble/include/nimble/hci_common.h" -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "nimble/porting/nimble/include/nimble/nimble_port.h" -#include "nimble/porting/npl/freertos/include/nimble/nimble_port_freertos.h" -#include "../include/esp_nimble_hci.h" -#include "../../port/include/esp_nimble_mem.h" -#include -#include -#include "../include/esp_compiler.h" +#include "sysinit/sysinit.h" +#include "nimble/hci_common.h" +#include "host/ble_hs.h" +#include "nimble/nimble_port.h" +#include "nimble/nimble_port_freertos.h" +#include "esp_nimble_hci.h" +#include "esp_nimble_mem.h" +#include "esp_bt.h" +#include "freertos/semphr.h" +#include "esp_compiler.h" /* IPC is used to improve performance when calls come from a processor not running the NimBLE stack */ /* but does not exist for solo */ #ifndef CONFIG_FREERTOS_UNICORE @@ -312,6 +310,7 @@ static struct os_mbuf *ble_hci_trans_acl_buf_alloc(void) static void ble_hci_rx_acl(uint8_t *data, uint16_t len) { struct os_mbuf *m; + int rc; int sr; if (len < BLE_HCI_DATA_HDR_SZ || len > MYNEWT_VAL(BLE_ACL_BUF_SIZE)) { return; @@ -320,9 +319,11 @@ static void ble_hci_rx_acl(uint8_t *data, uint16_t len) m = ble_hci_trans_acl_buf_alloc(); if (!m) { + ESP_LOGE(TAG, "%s failed to allocate ACL buffers; increase ACL_BUF_COUNT", __func__); return; } - if (os_mbuf_append(m, data, len)) { + if ((rc = os_mbuf_append(m, data, len)) != 0) { + ESP_LOGE(TAG, "%s failed to os_mbuf_append; rc = %d", __func__, rc); os_mbuf_free_chain(m); return; } @@ -530,6 +531,7 @@ esp_err_t esp_nimble_hci_and_controller_init(void) if ((ret = esp_bt_controller_enable(ESP_BT_MODE_BLE)) != ESP_OK) { return ret; } + return esp_nimble_hci_init(); } @@ -591,5 +593,3 @@ esp_err_t esp_nimble_hci_and_controller_deinit(void) return ESP_OK; } - -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/esp_compiler.h b/lib/libesp32_div/NimBLE-Arduino/src/esp_compiler.h new file mode 100644 index 000000000..94ec29c23 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/esp_compiler.h @@ -0,0 +1,33 @@ +// Copyright 2016-2019 Espressif Systems (Shanghai) PTE LTD +// +// Licensed 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 __ESP_COMPILER_H +#define __ESP_COMPILER_H + +/* + * The likely and unlikely macro pairs: + * These macros are useful to place when application + * knows the majority ocurrence of a decision paths, + * placing one of these macros can hint the compiler + * to reorder instructions producing more optimized + * code. + */ +#if (CONFIG_COMPILER_OPTIMIZATION_PERF) +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#else +#define likely(x) (x) +#define unlikely(x) (x) +#endif + +#endif \ No newline at end of file diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/port/include/esp_nimble_cfg.h b/lib/libesp32_div/NimBLE-Arduino/src/esp_nimble_cfg.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/port/include/esp_nimble_cfg.h rename to lib/libesp32_div/NimBLE-Arduino/src/esp_nimble_cfg.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/esp-hci/include/esp_nimble_hci.h b/lib/libesp32_div/NimBLE-Arduino/src/esp_nimble_hci.h similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/esp-hci/include/esp_nimble_hci.h rename to lib/libesp32_div/NimBLE-Arduino/src/esp_nimble_hci.h index dda03216e..e10436f3c 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/esp-hci/include/esp_nimble_hci.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/esp_nimble_hci.h @@ -19,11 +19,10 @@ * under the License. */ -#ifdef ESP_PLATFORM #ifndef __ESP_NIMBLE_HCI_H__ #define __ESP_NIMBLE_HCI_H__ -#include "nimble/nimble/include/nimble/ble_hci_trans.h" +#include "nimble/ble_hci_trans.h" #ifdef __cplusplus extern "C" { @@ -137,4 +136,3 @@ esp_err_t esp_nimble_hci_and_controller_deinit(void); #endif #endif /* __ESP_NIMBLE_HCI_H__ */ -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/port/include/esp_nimble_mem.h b/lib/libesp32_div/NimBLE-Arduino/src/esp_nimble_mem.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/port/include/esp_nimble_mem.h rename to lib/libesp32_div/NimBLE-Arduino/src/esp_nimble_mem.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/AUTHORS b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/AUTHORS similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/AUTHORS rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/AUTHORS diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/LICENSE b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/LICENSE similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/LICENSE rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/LICENSE diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/README b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/README similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/README rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/README diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/VERSION b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/VERSION similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/VERSION rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/VERSION diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/documentation/tinycrypt.rst b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/documentation/tinycrypt.rst similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/documentation/tinycrypt.rst rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/documentation/tinycrypt.rst diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/aes_decrypt.c b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/aes_decrypt.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/aes_decrypt.c rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/aes_decrypt.c index 0bab6e280..993a6180c 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/aes_decrypt.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/aes_decrypt.c @@ -30,9 +30,9 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "../include/tinycrypt/aes.h" -#include "../include/tinycrypt/constants.h" -#include "../include/tinycrypt/utils.h" +#include +#include +#include static const uint8_t inv_sbox[256] = { 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/aes_encrypt.c b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/aes_encrypt.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/aes_encrypt.c rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/aes_encrypt.c index bdc434bce..8991aee52 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/aes_encrypt.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/aes_encrypt.c @@ -30,9 +30,9 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "../include/tinycrypt/aes.h" -#include "../include/tinycrypt/utils.h" -#include "../include/tinycrypt/constants.h" +#include +#include +#include static const uint8_t sbox[256] = { 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/cbc_mode.c b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/cbc_mode.c similarity index 96% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/cbc_mode.c rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/cbc_mode.c index b743878a9..62d7879eb 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/cbc_mode.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/cbc_mode.c @@ -30,9 +30,9 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "../include/tinycrypt/cbc_mode.h" -#include "../include/tinycrypt/constants.h" -#include "../include/tinycrypt/utils.h" +#include +#include +#include int tc_cbc_mode_encrypt(uint8_t *out, unsigned int outlen, const uint8_t *in, unsigned int inlen, const uint8_t *iv, diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ccm_mode.c b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ccm_mode.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ccm_mode.c rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ccm_mode.c index 598531252..929adac63 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ccm_mode.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ccm_mode.c @@ -30,9 +30,9 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "../include/tinycrypt/ccm_mode.h" -#include "../include/tinycrypt/constants.h" -#include "../include/tinycrypt/utils.h" +#include +#include +#include #include diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/cmac_mode.c b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/cmac_mode.c similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/cmac_mode.c rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/cmac_mode.c index dff28cf03..96d147e80 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/cmac_mode.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/cmac_mode.c @@ -30,10 +30,10 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "../include/tinycrypt/aes.h" -#include "../include/tinycrypt/cmac_mode.h" -#include "../include/tinycrypt/constants.h" -#include "../include/tinycrypt/utils.h" +#include +#include +#include +#include /* max number of calls until change the key (2^48).*/ const static uint64_t MAX_CALLS = ((uint64_t)1 << 48); diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ctr_mode.c b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ctr_mode.c similarity index 95% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ctr_mode.c rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ctr_mode.c index 6653afc52..1dfb92dfe 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ctr_mode.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ctr_mode.c @@ -30,9 +30,9 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "../include/tinycrypt/constants.h" -#include "../include/tinycrypt/ctr_mode.h" -#include "../include/tinycrypt/utils.h" +#include +#include +#include int tc_ctr_mode(uint8_t *out, unsigned int outlen, const uint8_t *in, unsigned int inlen, uint8_t *ctr, const TCAesKeySched_t sched) diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ctr_prng.c b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ctr_prng.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ctr_prng.c rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ctr_prng.c index f908932e2..cac2cc41d 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ctr_prng.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ctr_prng.c @@ -27,9 +27,9 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "../include/tinycrypt/ctr_prng.h" -#include "../include/tinycrypt/utils.h" -#include "../include/tinycrypt/constants.h" +#include +#include +#include #include /* diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ecc.c b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ecc.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ecc.c rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ecc.c index e7fce278d..46080bf61 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ecc.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ecc.c @@ -52,8 +52,8 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "../include/tinycrypt/ecc.h" -#include "../include/tinycrypt/ecc_platform_specific.h" +#include +#include #include /* IMPORTANT: Make sure a cryptographically-secure PRNG is set and the platform diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ecc_dh.c b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ecc_dh.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ecc_dh.c rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ecc_dh.c index 5cd6a2e2f..e5257d2d4 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ecc_dh.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ecc_dh.c @@ -54,9 +54,9 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ -#include "../include/tinycrypt/constants.h" -#include "../include/tinycrypt/ecc.h" -#include "../include/tinycrypt/ecc_dh.h" +#include +#include +#include #include #if default_RNG_defined diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ecc_dsa.c b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ecc_dsa.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ecc_dsa.c rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ecc_dsa.c index 31046c860..064dfe5ae 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ecc_dsa.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ecc_dsa.c @@ -53,9 +53,9 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "../include/tinycrypt/constants.h" -#include "../include/tinycrypt/ecc.h" -#include "../include/tinycrypt/ecc_dsa.h" +#include +#include +#include #if default_RNG_defined static uECC_RNG_Function g_rng_function = &default_CSPRNG; diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ecc_platform_specific.c b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ecc_platform_specific.c similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/ecc_platform_specific.c rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/ecc_platform_specific.c diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/hmac.c b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/hmac.c similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/hmac.c rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/hmac.c index c86fd35a7..89878cec7 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/hmac.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/hmac.c @@ -30,9 +30,9 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "../include/tinycrypt/hmac.h" -#include "../include/tinycrypt/constants.h" -#include "../include/tinycrypt/utils.h" +#include +#include +#include static void rekey(uint8_t *key, const uint8_t *new_key, unsigned int key_size) { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/hmac_prng.c b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/hmac_prng.c similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/hmac_prng.c rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/hmac_prng.c index a41ea43d5..68b5b1faf 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/hmac_prng.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/hmac_prng.c @@ -30,10 +30,10 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "../include/tinycrypt/hmac_prng.h" -#include "../include/tinycrypt/hmac.h" -#include "../include/tinycrypt/constants.h" -#include "../include/tinycrypt/utils.h" +#include +#include +#include +#include /* * min bytes in the seed string. diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/sha256.c b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/sha256.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/sha256.c rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/sha256.c index b7e0bba55..b4efd2044 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/sha256.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/sha256.c @@ -30,9 +30,9 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "../include/tinycrypt/sha256.h" -#include "../include/tinycrypt/constants.h" -#include "../include/tinycrypt/utils.h" +#include +#include +#include static void compress(unsigned int *iv, const uint8_t *data); diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/utils.c b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/utils.c similarity index 96% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/utils.c rename to lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/utils.c index 792a78178..13cc49512 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/src/utils.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/ext/tinycrypt/src/utils.c @@ -30,8 +30,8 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "../include/tinycrypt/utils.h" -#include "../include/tinycrypt/constants.h" +#include +#include #include diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/hal/hal_timer.h b/lib/libesp32_div/NimBLE-Arduino/src/hal/hal_timer.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/hal/hal_timer.h rename to lib/libesp32_div/NimBLE-Arduino/src/hal/hal_timer.h index 936545d8c..be41c6095 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/hal/hal_timer.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/hal/hal_timer.h @@ -29,7 +29,7 @@ #define H_HAL_TIMER_ #include -#include "../os/queue.h" +#include "os/queue.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_att.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_att.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_att.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_att.h index ceca35179..391a992ae 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_att.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_att.h @@ -27,7 +27,7 @@ * @{ */ -#include "nimble/porting/nimble/include/os/queue.h" +#include "os/queue.h" #ifdef __cplusplus extern "C" { #endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_eddystone.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_eddystone.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_eddystone.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_eddystone.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_gap.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_gap.h similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_gap.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_gap.h index edaf3bc4d..ed7fbb128 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_gap.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_gap.h @@ -28,9 +28,9 @@ */ #include -#include "ble_hs.h" -#include "ble_hs_adv.h" -#include "nimble/porting/nimble/include/syscfg/syscfg.h" +#include "host/ble_hs.h" +#include "host/ble_hs_adv.h" +#include "syscfg/syscfg.h" #ifdef __cplusplus extern "C" { @@ -1821,22 +1821,6 @@ int ble_gap_wl_tx_rmv(const ble_addr_t *addrs); int ble_gap_update_params(uint16_t conn_handle, const struct ble_gap_upd_params *params); -/** - * Configure LE Data Length in controller (OGF = 0x08, OCF = 0x0022). - * - * @param conn_handle Connection handle. - * @param tx_octets The preferred value of payload octets that the Controller - * should use for a new connection (Range - * 0x001B-0x00FB). - * @param tx_time The preferred maximum number of microseconds that the local Controller - * should use to transmit a single link layer packet - * (Range 0x0148-0x4290). - * - * @return 0 on success, - * other error code on failure. - */ -int ble_gap_set_data_len(uint16_t conn_handle, uint16_t tx_octets, uint16_t tx_time); - /** * Initiates the GAP security procedure. * diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_gatt.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_gatt.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_gatt.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_gatt.h index ee8f177f8..d5c3269f0 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_gatt.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_gatt.h @@ -28,8 +28,8 @@ */ #include -#include "ble_att.h" -#include "ble_uuid.h" +#include "host/ble_att.h" +#include "host/ble_uuid.h" #ifdef __cplusplus extern "C" { #endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs.h similarity index 96% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs.h index f24b8a9e0..43979ba57 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs.h @@ -27,23 +27,23 @@ */ #include -#include "nimble/nimble/include/nimble/hci_common.h" -#include "ble_att.h" -#include "ble_eddystone.h" -#include "ble_gap.h" -#include "ble_gatt.h" -#include "ble_hs_adv.h" -#include "ble_hs_id.h" -#include "ble_hs_hci.h" -#include "ble_hs_log.h" -#include "ble_hs_mbuf.h" -#include "ble_hs_stop.h" -#include "ble_ibeacon.h" -#include "ble_l2cap.h" -#include "ble_sm.h" -#include "ble_store.h" -#include "ble_uuid.h" -#include "nimble/nimble/include/nimble/nimble_npl.h" +#include "nimble/hci_common.h" +#include "host/ble_att.h" +#include "host/ble_eddystone.h" +#include "host/ble_gap.h" +#include "host/ble_gatt.h" +#include "host/ble_hs_adv.h" +#include "host/ble_hs_id.h" +#include "host/ble_hs_hci.h" +#include "host/ble_hs_log.h" +#include "host/ble_hs_mbuf.h" +#include "host/ble_hs_stop.h" +#include "host/ble_ibeacon.h" +#include "host/ble_l2cap.h" +#include "host/ble_sm.h" +#include "host/ble_store.h" +#include "host/ble_uuid.h" +#include "nimble/nimble_npl.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_adv.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_adv.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_adv.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_adv.h index ae2965328..e3b6ea709 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_adv.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_adv.h @@ -21,7 +21,7 @@ #define H_BLE_HS_ADV_ #include -#include "ble_uuid.h" +#include "host/ble_uuid.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_hci.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_hci.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_hci.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_hci.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_id.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_id.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_id.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_id.h index 568303412..c96bd20f5 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_id.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_id.h @@ -28,7 +28,7 @@ */ #include -#include "nimble/nimble/include/nimble/ble.h" +#include "nimble/ble.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_log.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_log.h similarity index 92% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_log.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_log.h index 303b53c6e..8d0a4596e 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_log.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_log.h @@ -20,11 +20,11 @@ #ifndef H_BLE_HS_LOG_ #define H_BLE_HS_LOG_ -#include "nimble/porting/nimble/include/modlog/modlog.h" +#include "modlog/modlog.h" /* Only include the logcfg header if this version of newt can generate it. */ #if MYNEWT_VAL(NEWT_FEATURE_LOGCFG) -#include "nimble/porting/nimble/include/logcfg/logcfg.h" +#include "logcfg/logcfg.h" #endif #ifdef __cplusplus diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_mbuf.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_mbuf.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_mbuf.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_mbuf.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_pvcy.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_pvcy.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_pvcy.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_pvcy.h index 26450f4f8..19087f220 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_pvcy.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_pvcy.h @@ -22,7 +22,7 @@ #ifndef H_BLE_HS_PVCY_ #define H_BLE_HS_PVCY_ -#include "ble_hs.h" +#include "host/ble_hs.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_stop.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_stop.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_hs_stop.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_hs_stop.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_ibeacon.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_ibeacon.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_ibeacon.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_ibeacon.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_l2cap.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_l2cap.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_l2cap.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_l2cap.h index 9d92c08f1..aef9682cc 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_l2cap.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_l2cap.h @@ -20,7 +20,7 @@ #ifndef H_BLE_L2CAP_ #define H_BLE_L2CAP_ -#include "nimble/nimble/include/nimble/nimble_opt.h" +#include "nimble/nimble_opt.h" #ifdef __cplusplus extern "C" { #endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_monitor.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_monitor.h similarity index 95% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_monitor.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_monitor.h index 418d4e379..61722f7db 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_monitor.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_monitor.h @@ -20,7 +20,7 @@ #ifndef H_BLE_MONITOR_ #define H_BLE_MONITOR_ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" +#include #undef BLE_MONITOR #define BLE_MONITOR (MYNEWT_VAL(BLE_MONITOR_UART) || MYNEWT_VAL(BLE_MONITOR_RTT)) diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_sm.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_sm.h similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_sm.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_sm.h index 42414d584..ceebb8564 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_sm.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_sm.h @@ -21,7 +21,7 @@ #define H_BLE_SM_ #include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" +#include "syscfg/syscfg.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_store.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_store.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_store.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_store.h index 8e6721bf3..a3eca5d23 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_store.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_store.h @@ -21,7 +21,7 @@ #define H_BLE_STORE_ #include -#include "nimble/nimble/include/nimble/ble.h" +#include "nimble/ble.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_uuid.h b/lib/libesp32_div/NimBLE-Arduino/src/host/ble_uuid.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/include/host/ble_uuid.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/ble_uuid.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/util/include/host/util/util.h b/lib/libesp32_div/NimBLE-Arduino/src/host/util/util.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/util/include/host/util/util.h rename to lib/libesp32_div/NimBLE-Arduino/src/host/util/util.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/log/log.h b/lib/libesp32_div/NimBLE-Arduino/src/log/log.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/log/log.h rename to lib/libesp32_div/NimBLE-Arduino/src/log/log.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/log_common/ignore.h b/lib/libesp32_div/NimBLE-Arduino/src/log_common/ignore.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/log_common/ignore.h rename to lib/libesp32_div/NimBLE-Arduino/src/log_common/ignore.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/log_common/log_common.h b/lib/libesp32_div/NimBLE-Arduino/src/log_common/log_common.h similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/log_common/log_common.h rename to lib/libesp32_div/NimBLE-Arduino/src/log_common/log_common.h index f6c9e57e0..f13a61ad9 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/log_common/log_common.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/log_common/log_common.h @@ -20,7 +20,7 @@ #ifndef H_LOG_COMMON_ #define H_LOG_COMMON_ -#include "ignore.h" +#include "log_common/ignore.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/logcfg/logcfg.h b/lib/libesp32_div/NimBLE-Arduino/src/logcfg/logcfg.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/logcfg/logcfg.h rename to lib/libesp32_div/NimBLE-Arduino/src/logcfg/logcfg.h index d7422cc8f..764f87f27 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/logcfg/logcfg.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/logcfg/logcfg.h @@ -5,8 +5,8 @@ #ifndef H_MYNEWT_LOGCFG_ #define H_MYNEWT_LOGCFG_ -#include "../modlog/modlog.h" -#include "../log_common/log_common.h" +#include "modlog/modlog.h" +#include "log_common/log_common.h" #if (MYNEWT_VAL(BLE_HS_LOG_LVL) == LOG_LEVEL_DEBUG) #define BLE_HS_LOG_DEBUG(...) MODLOG_DEBUG(4, __VA_ARGS__) @@ -130,7 +130,6 @@ #define BLE_MESH_TRANS_LOG_ERROR(...) MODLOG_ERROR(21, __VA_ARGS__) #define BLE_MESH_TRANS_LOG_CRITICAL(...) MODLOG_CRITICAL(21, __VA_ARGS__) #define BLE_MESH_TRANS_LOG_DISABLED(...) MODLOG_DISABLED(21, __VA_ARGS__) - #define DFLT_LOG_DEBUG(...) IGNORE(__VA_ARGS__) #define DFLT_LOG_INFO(...) MODLOG_INFO(0, __VA_ARGS__) #define DFLT_LOG_WARN(...) MODLOG_WARN(0, __VA_ARGS__) diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/mem/mem.h b/lib/libesp32_div/NimBLE-Arduino/src/mem/mem.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/mem/mem.h rename to lib/libesp32_div/NimBLE-Arduino/src/mem/mem.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/access.h b/lib/libesp32_div/NimBLE-Arduino/src/mesh/access.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/access.h rename to lib/libesp32_div/NimBLE-Arduino/src/mesh/access.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/cfg_cli.h b/lib/libesp32_div/NimBLE-Arduino/src/mesh/cfg_cli.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/cfg_cli.h rename to lib/libesp32_div/NimBLE-Arduino/src/mesh/cfg_cli.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/cfg_srv.h b/lib/libesp32_div/NimBLE-Arduino/src/mesh/cfg_srv.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/cfg_srv.h rename to lib/libesp32_div/NimBLE-Arduino/src/mesh/cfg_srv.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/glue.h b/lib/libesp32_div/NimBLE-Arduino/src/mesh/glue.h similarity index 95% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/glue.h rename to lib/libesp32_div/NimBLE-Arduino/src/mesh/glue.h index f50b6ece8..388ecba39 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/glue.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/mesh/glue.h @@ -23,19 +23,19 @@ #include #include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/logcfg/logcfg.h" -#include "nimble/porting/nimble/include/modlog/modlog.h" -#include "nimble/nimble/include/nimble/nimble_npl.h" +#include "syscfg/syscfg.h" +#include "logcfg/logcfg.h" +#include "modlog/modlog.h" +#include "nimble/nimble_npl.h" -#include "nimble/porting/nimble/include/os/os_mbuf.h" -#include "nimble/porting/nimble/include/os/queue.h" +#include "os/os_mbuf.h" +#include "os/queue.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "nimble/nimble/host/include/host/ble_uuid.h" -#include "nimble/nimble/host/src/ble_sm_priv.h" -#include "nimble/nimble/host/src/ble_hs_hci_priv.h" +#include "nimble/ble.h" +#include "host/ble_hs.h" +#include "host/ble_uuid.h" +#include "../src/ble_sm_priv.h" +#include "../src/ble_hs_hci_priv.h" #if MYNEWT_VAL(BLE_CRYPTO_STACK_MBEDTLS) #include "mbedtls/aes.h" @@ -47,11 +47,11 @@ #include "mbedtls/ecp.h" #else -#include "nimble/ext/tinycrypt/include/tinycrypt/aes.h" -#include "nimble/ext/tinycrypt/include/tinycrypt/constants.h" -#include "nimble/ext/tinycrypt/include/tinycrypt/utils.h" -#include "nimble/ext/tinycrypt/include/tinycrypt/cmac_mode.h" -#include "nimble/ext/tinycrypt/include/tinycrypt/ecc_dh.h" +#include "tinycrypt/aes.h" +#include "tinycrypt/constants.h" +#include "tinycrypt/utils.h" +#include "tinycrypt/cmac_mode.h" +#include "tinycrypt/ecc_dh.h" #endif #if MYNEWT_VAL(BLE_MESH_SETTINGS) @@ -359,6 +359,8 @@ static inline void net_buf_simple_restore(struct os_mbuf *buf, static inline void sys_memcpy_swap(void *dst, const void *src, size_t length) { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpointer-arith" __ASSERT(((src < dst && (src + length) <= dst) || (src > dst && (dst + length) <= src)), "Source and destination buffers must not overlap"); @@ -368,6 +370,7 @@ static inline void sys_memcpy_swap(void *dst, const void *src, size_t length) for (; length > 0; length--) { *((u8_t *)dst++) = *((u8_t *)src--); } +#pragma GCC diagnostic pop } #define popcount(x) __builtin_popcount(x) diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/health_cli.h b/lib/libesp32_div/NimBLE-Arduino/src/mesh/health_cli.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/health_cli.h rename to lib/libesp32_div/NimBLE-Arduino/src/mesh/health_cli.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/health_srv.h b/lib/libesp32_div/NimBLE-Arduino/src/mesh/health_srv.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/health_srv.h rename to lib/libesp32_div/NimBLE-Arduino/src/mesh/health_srv.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/main.h b/lib/libesp32_div/NimBLE-Arduino/src/mesh/main.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/main.h rename to lib/libesp32_div/NimBLE-Arduino/src/mesh/main.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/mesh.h b/lib/libesp32_div/NimBLE-Arduino/src/mesh/mesh.h similarity index 78% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/mesh.h rename to lib/libesp32_div/NimBLE-Arduino/src/mesh/mesh.h index 77b2871fc..9ba63ef0e 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/mesh.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/mesh/mesh.h @@ -11,8 +11,8 @@ #define __BT_MESH_H #include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os_mbuf.h" +#include "syscfg/syscfg.h" +#include "os/os_mbuf.h" #include "glue.h" #include "access.h" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/model_cli.h b/lib/libesp32_div/NimBLE-Arduino/src/mesh/model_cli.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/model_cli.h rename to lib/libesp32_div/NimBLE-Arduino/src/mesh/model_cli.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/model_srv.h b/lib/libesp32_div/NimBLE-Arduino/src/mesh/model_srv.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/model_srv.h rename to lib/libesp32_div/NimBLE-Arduino/src/mesh/model_srv.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/porting.h b/lib/libesp32_div/NimBLE-Arduino/src/mesh/porting.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/porting.h rename to lib/libesp32_div/NimBLE-Arduino/src/mesh/porting.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/proxy.h b/lib/libesp32_div/NimBLE-Arduino/src/mesh/proxy.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/proxy.h rename to lib/libesp32_div/NimBLE-Arduino/src/mesh/proxy.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/slist.h b/lib/libesp32_div/NimBLE-Arduino/src/mesh/slist.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/slist.h rename to lib/libesp32_div/NimBLE-Arduino/src/mesh/slist.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/testing.h b/lib/libesp32_div/NimBLE-Arduino/src/mesh/testing.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/include/mesh/testing.h rename to lib/libesp32_div/NimBLE-Arduino/src/mesh/testing.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/modlog/modlog.h b/lib/libesp32_div/NimBLE-Arduino/src/modlog/modlog.h similarity index 79% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/modlog/modlog.h rename to lib/libesp32_div/NimBLE-Arduino/src/modlog/modlog.h index c12b13991..e81ea3812 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/modlog/modlog.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/modlog/modlog.h @@ -22,8 +22,7 @@ #include -#include "../log/log.h" -#include "../log_common/log_common.h" +#include "log/log.h" #ifdef ESP_PLATFORM #include "esp_log.h" @@ -33,11 +32,36 @@ #define MODLOG_MODULE_DFLT 255 -#if defined(ESP_PLATFORM) && !defined(ARDUINO_ARCH_ESP32) +#if (MYNEWT_VAL(LOG_LEVEL) > 0) +static inline void +modlog_dummy(const char *msg, ...) +{ + (void)msg; +} +#endif + +#ifdef ESP_PLATFORM #define MODLOG_ESP_LOCAL(level, ml_msg_, ...) do { \ - if (MYNEWT_VAL(BLE_HS_LOG_LVL) <= LOG_LOCAL_LEVEL) ESP_LOG_LEVEL_LOCAL(level, "NimBLE", ml_msg_, ##__VA_ARGS__); \ + if (LOG_LOCAL_LEVEL >= level) esp_log_write(level, "NimBLE", ml_msg_, ##__VA_ARGS__); \ } while(0) +#ifdef ARDUINO_ARCH_ESP32 +#include "nimconfig.h" +#endif + +#if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_BT_NIMBLE_DEBUG) + +#define MODLOG_DEBUG(ml_mod_, ml_msg_, ...) \ + MODLOG_ESP_LOCAL(ESP_LOG_ERROR, ml_msg_, ##__VA_ARGS__) + +#define MODLOG_INFO(ml_mod_, ml_msg_, ...) \ + MODLOG_ESP_LOCAL(ESP_LOG_ERROR, ml_msg_, ##__VA_ARGS__) + +#define MODLOG_WARN(ml_mod_, ml_msg_, ...) \ + MODLOG_ESP_LOCAL(ESP_LOG_ERROR, ml_msg_, ##__VA_ARGS__) + +#else + #define MODLOG_DEBUG(ml_mod_, ml_msg_, ...) \ MODLOG_ESP_LOCAL(ESP_LOG_DEBUG, ml_msg_, ##__VA_ARGS__) @@ -47,6 +71,8 @@ #define MODLOG_WARN(ml_mod_, ml_msg_, ...) \ MODLOG_ESP_LOCAL(ESP_LOG_WARN, ml_msg_, ##__VA_ARGS__) +#endif + #define MODLOG_ERROR(ml_mod_, ml_msg_, ...) \ MODLOG_ESP_LOCAL(ESP_LOG_ERROR, ml_msg_, ##__VA_ARGS__) @@ -55,30 +81,12 @@ #else -#if (MYNEWT_VAL(LOG_LEVEL) > 0) -static inline void -modlog_dummy(const char *msg, ...) -{ - (void)msg; -} -#endif - -#include "nimble/console/console.h" - -#if (MYNEWT_VAL(LOG_LEVEL) > 0) -#define MODLOG_DEBUG(ml_mod_, ml_msg_, ...) \ - modlog_dummy((ml_msg_), ##__VA_ARGS__) -#else -#define MODLOG_DEBUG(ml_mod_, ml_msg_, ...) \ - console_printf((ml_msg_), ##__VA_ARGS__); -#endif - #if (MYNEWT_VAL(LOG_LEVEL) > 1) #define MODLOG_INFO(ml_mod_, ml_msg_, ...) \ modlog_dummy((ml_msg_), ##__VA_ARGS__) #else #define MODLOG_INFO(ml_mod_, ml_msg_, ...) \ - console_printf((ml_msg_), ##__VA_ARGS__); + printf((ml_msg_), ##__VA_ARGS__); #endif #if (MYNEWT_VAL(LOG_LEVEL) > 2) @@ -86,7 +94,7 @@ modlog_dummy(const char *msg, ...) modlog_dummy((ml_msg_), ##__VA_ARGS__) #else #define MODLOG_WARN(ml_mod_, ml_msg_, ...) \ - console_printf((ml_msg_), ##__VA_ARGS__); + printf((ml_msg_), ##__VA_ARGS__); #endif #if (MYNEWT_VAL(LOG_LEVEL) > 3) @@ -94,7 +102,7 @@ modlog_dummy(const char *msg, ...) modlog_dummy((ml_msg_), ##__VA_ARGS__) #else #define MODLOG_ERROR(ml_mod_, ml_msg_, ...) \ - console_printf((ml_msg_), ##__VA_ARGS__); + printf((ml_msg_), ##__VA_ARGS__); #endif #if (MYNEWT_VAL(LOG_LEVEL) > 4) @@ -102,7 +110,7 @@ modlog_dummy(const char *msg, ...) modlog_dummy((ml_msg_), ##__VA_ARGS__) #else #define MODLOG_CRITICAL(ml_mod_, ml_msg_, ...) \ - console_printf((ml_msg_), ##__VA_ARGS__); + printf((ml_msg_), ##__VA_ARGS__); #endif #endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/LICENSE b/lib/libesp32_div/NimBLE-Arduino/src/nimble/LICENSE deleted file mode 100644 index 08b9b218a..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/LICENSE +++ /dev/null @@ -1,217 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed 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. - -This product bundles queue.h 8.5, which is available under the "3-clause BSD" -license. For details, see porting/nimble/include/os/queue.h - -This product partly derives from FreeBSD, which is available under the -"3-clause BSD" license. For details, see: - * porting/nimble/src/os_mbuf.c - -This product bundles Gary S. Brown's CRC32 implementation, which is available -under the following license: - COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or - code or tables extracted from it, as desired without restriction. - -This product bundles tinycrypt, which is available under the "3-clause BSD" -license. For details, and bundled files see: - * ext/tinycrypt/LICENSE diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/ble.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/ble.h similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/ble.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/ble.h index f6847728c..3fc2902ec 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/ble.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/ble.h @@ -22,8 +22,8 @@ #include #include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" +#include "syscfg/syscfg.h" +#include "os/os.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/ble_hci_trans.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/ble_hci_trans.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/ble_hci_trans.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/ble_hci_trans.h index d4c353f1f..e8d3ec031 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/ble_hci_trans.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/ble_hci_trans.h @@ -21,7 +21,7 @@ #define H_HCI_TRANSPORT_ #include -#include "nimble/porting/nimble/include/os/os_mempool.h" +#include "os/os_mempool.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/console/console.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/console/console.h deleted file mode 100644 index b1052e62e..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/console/console.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef __CONSOLE_H__ -#define __CONSOLE_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define console_printf printf - -#ifdef __cplusplus -} -#endif - -#endif /* __CONSOLE_H__ */ \ No newline at end of file diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/esp-hci/include/esp_compiler.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/esp-hci/include/esp_compiler.h deleted file mode 100644 index 7ab8cb9af..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/esp-hci/include/esp_compiler.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2016-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed 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 __ESP_COMPILER_H -#define __ESP_COMPILER_H - -/* - * The likely and unlikely macro pairs: - * These macros are useful to place when application - * knows the majority ocurrence of a decision paths, - * placing one of these macros can hint the compiler - * to reorder instructions producing more optimized - * code. - */ -#if (CONFIG_COMPILER_OPTIMIZATION_PERF) -#define likely(x) __builtin_expect(!!(x), 1) -#define unlikely(x) __builtin_expect(!!(x), 0) -#else -#define likely(x) (x) -#define unlikely(x) (x) -#endif - -/* - * Utility macros used for designated initializers, which work differently - * in C99 and C++ standards mainly for aggregate types. - * The member separator, comma, is already part of the macro, please omit the trailing comma. - * Usage example: - * struct config_t { char* pchr; char arr[SIZE]; } config = { - * ESP_COMPILER_DESIGNATED_INIT_AGGREGATE_TYPE_EMPTY(pchr) - * ESP_COMPILER_DESIGNATED_INIT_AGGREGATE_TYPE_STR(arr, "Value") - * }; - */ -#ifdef __cplusplus -#define ESP_COMPILER_DESIGNATED_INIT_AGGREGATE_TYPE_STR(member, value) { .member = value }, -#define ESP_COMPILER_DESIGNATED_INIT_AGGREGATE_TYPE_EMPTY(member) .member = { }, -#else -#define ESP_COMPILER_DESIGNATED_INIT_AGGREGATE_TYPE_STR(member, value) .member = value, -#define ESP_COMPILER_DESIGNATED_INIT_AGGREGATE_TYPE_EMPTY(member) -#endif - -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/hci_common.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/hci_common.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/hci_common.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/hci_common.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/access.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/access.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/access.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/access.c index 37580b400..ff8e99997 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/access.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/access.c @@ -6,15 +6,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_ACCESS_LOG #include -#include "nimble/porting/nimble/include/os/os_mbuf.h" +#include -#include "../include/mesh/mesh.h" +#include "mesh/mesh.h" #include "mesh_priv.h" #include "adv.h" @@ -24,7 +22,7 @@ #include "access.h" #include "foundation.h" #if MYNEWT_VAL(BLE_MESH_SHELL_MODELS) -#include "../include/mesh/model_cli.h" +#include "mesh/model_cli.h" #endif static const struct bt_mesh_comp *dev_comp; @@ -856,4 +854,3 @@ int bt_mesh_model_extend(struct bt_mesh_model *mod, return 0; } #endif -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/access.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/access.h similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/access.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/access.h index 03081b9ad..48514983f 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/access.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/access.h @@ -9,7 +9,7 @@ #ifndef __ACCESS_H__ #define __ACCESS_H__ -#include "../include/mesh/mesh.h" +#include "mesh/mesh.h" /* bt_mesh_model.flags */ enum { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/adv.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/adv.c similarity index 94% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/adv.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/adv.c index b9d290176..b8fb1c7de 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/adv.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/adv.c @@ -7,17 +7,16 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_ADV_LOG -#include "../include/mesh/mesh.h" -#include "nimble/nimble/host/include/host/ble_hs_adv.h" -#include "nimble/nimble/host/include/host/ble_gap.h" -#include "nimble/nimble/include/nimble/hci_common.h" -#include "../include/mesh/porting.h" -#include "nimble/porting/nimble/include/nimble/nimble_port.h" +#include "mesh/mesh.h" +#include "host/ble_hs_adv.h" +#include "host/ble_gap.h" +#include "nimble/hci_common.h" +#include "mesh/porting.h" +#include "nimble/nimble_port.h" + #include "adv.h" #include "net.h" #include "foundation.h" @@ -338,12 +337,9 @@ void bt_mesh_adv_init(void) os_task_init(&adv_task, "mesh_adv", mesh_adv_thread, NULL, MYNEWT_VAL(BLE_MESH_ADV_TASK_PRIO), OS_WAIT_FOREVER, g_blemesh_stack, ADV_STACK_SIZE); -#elif ESP_PLATFORM +#else xTaskCreatePinnedToCore(mesh_adv_thread, "mesh_adv", 2768, NULL, (configMAX_PRIORITIES - 5), &adv_task_h, NIMBLE_CORE); -#else - xTaskCreate(mesh_adv_thread, "mesh_adv", MYNEWT_VAL(BLE_MESH_ADV_STACK_SIZE), - NULL, MYNEWT_VAL(BLE_MESH_ADV_TASK_PRIO), &adv_task_h); #endif /* For BT5 controllers we can have fast advertising interval */ @@ -447,4 +443,3 @@ int bt_mesh_scan_disable(void) return 0; } -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/adv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/adv.h similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/adv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/adv.h index 40e65e5f4..4d0f7d8ba 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/adv.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/adv.h @@ -10,7 +10,7 @@ #define __ADV_H__ /* Maximum advertising data payload for a single data type */ -#include "../include/mesh/mesh.h" +#include "mesh/mesh.h" #define BT_MESH_ADV(om) (*(struct bt_mesh_adv **) OS_MBUF_USRHDR(om)) diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/atomic.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/atomic.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/atomic.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/atomic.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/beacon.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/beacon.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/beacon.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/beacon.c index 89ee1a086..cd540aa8c 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/beacon.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/beacon.c @@ -6,15 +6,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_BEACON_LOG #include #include -#include "nimble/porting/nimble/include/os/os_mbuf.h" -#include "../include/mesh/mesh.h" +#include "os/os_mbuf.h" +#include "mesh/mesh.h" #include "adv.h" #include "mesh_priv.h" @@ -441,4 +439,3 @@ void bt_mesh_beacon_disable(void) k_delayed_work_cancel(&beacon_timer); } } -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/beacon.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/beacon.h similarity index 89% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/beacon.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/beacon.h index 08fd88d96..ac4bfed8a 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/beacon.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/beacon.h @@ -9,7 +9,7 @@ #ifndef __BEACON_H__ #define __BEACON_H__ -#include "nimble/porting/nimble/include/os/os_mbuf.h" +#include "os/os_mbuf.h" void bt_mesh_beacon_enable(void); void bt_mesh_beacon_disable(void); diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_att_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_att_priv.h new file mode 100644 index 000000000..2201d4ddb --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_att_priv.h @@ -0,0 +1,307 @@ +/* + * 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_ATT_PRIV_ +#define H_BLE_ATT_PRIV_ + +#include +#include "stats/stats.h" +#include "host/ble_att.h" +#include "host/ble_uuid.h" +#include "nimble/nimble_npl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct os_mbuf; +struct ble_hs_conn; +struct ble_l2cap_chan; +struct ble_att_find_info_req; +struct ble_att_error_rsp; +struct ble_att_mtu_cmd; +struct ble_att_read_req; +struct ble_att_read_blob_req; +struct ble_att_read_type_req; +struct ble_att_read_group_type_req; +struct ble_att_read_group_type_rsp; +struct ble_att_find_type_value_req; +struct ble_att_write_req; +struct ble_att_prep_write_cmd; +struct ble_att_exec_write_req; +struct ble_att_notify_req; +struct ble_att_indicate_req; + +STATS_SECT_START(ble_att_stats) + STATS_SECT_ENTRY(error_rsp_rx) + STATS_SECT_ENTRY(error_rsp_tx) + STATS_SECT_ENTRY(mtu_req_rx) + STATS_SECT_ENTRY(mtu_req_tx) + STATS_SECT_ENTRY(mtu_rsp_rx) + STATS_SECT_ENTRY(mtu_rsp_tx) + STATS_SECT_ENTRY(find_info_req_rx) + STATS_SECT_ENTRY(find_info_req_tx) + STATS_SECT_ENTRY(find_info_rsp_rx) + STATS_SECT_ENTRY(find_info_rsp_tx) + STATS_SECT_ENTRY(find_type_value_req_rx) + STATS_SECT_ENTRY(find_type_value_req_tx) + STATS_SECT_ENTRY(find_type_value_rsp_rx) + STATS_SECT_ENTRY(find_type_value_rsp_tx) + STATS_SECT_ENTRY(read_type_req_rx) + STATS_SECT_ENTRY(read_type_req_tx) + STATS_SECT_ENTRY(read_type_rsp_rx) + STATS_SECT_ENTRY(read_type_rsp_tx) + STATS_SECT_ENTRY(read_req_rx) + STATS_SECT_ENTRY(read_req_tx) + STATS_SECT_ENTRY(read_rsp_rx) + STATS_SECT_ENTRY(read_rsp_tx) + STATS_SECT_ENTRY(read_blob_req_rx) + STATS_SECT_ENTRY(read_blob_req_tx) + STATS_SECT_ENTRY(read_blob_rsp_rx) + STATS_SECT_ENTRY(read_blob_rsp_tx) + STATS_SECT_ENTRY(read_mult_req_rx) + STATS_SECT_ENTRY(read_mult_req_tx) + STATS_SECT_ENTRY(read_mult_rsp_rx) + STATS_SECT_ENTRY(read_mult_rsp_tx) + STATS_SECT_ENTRY(read_group_type_req_rx) + STATS_SECT_ENTRY(read_group_type_req_tx) + STATS_SECT_ENTRY(read_group_type_rsp_rx) + STATS_SECT_ENTRY(read_group_type_rsp_tx) + STATS_SECT_ENTRY(write_req_rx) + STATS_SECT_ENTRY(write_req_tx) + STATS_SECT_ENTRY(write_rsp_rx) + STATS_SECT_ENTRY(write_rsp_tx) + STATS_SECT_ENTRY(prep_write_req_rx) + STATS_SECT_ENTRY(prep_write_req_tx) + STATS_SECT_ENTRY(prep_write_rsp_rx) + STATS_SECT_ENTRY(prep_write_rsp_tx) + STATS_SECT_ENTRY(exec_write_req_rx) + STATS_SECT_ENTRY(exec_write_req_tx) + STATS_SECT_ENTRY(exec_write_rsp_rx) + STATS_SECT_ENTRY(exec_write_rsp_tx) + STATS_SECT_ENTRY(notify_req_rx) + STATS_SECT_ENTRY(notify_req_tx) + STATS_SECT_ENTRY(indicate_req_rx) + STATS_SECT_ENTRY(indicate_req_tx) + STATS_SECT_ENTRY(indicate_rsp_rx) + STATS_SECT_ENTRY(indicate_rsp_tx) + STATS_SECT_ENTRY(write_cmd_rx) + STATS_SECT_ENTRY(write_cmd_tx) +STATS_SECT_END +extern STATS_SECT_DECL(ble_att_stats) ble_att_stats; + +struct ble_att_prep_entry { + SLIST_ENTRY(ble_att_prep_entry) bape_next; + uint16_t bape_handle; + uint16_t bape_offset; + + /* XXX: This is wasteful; we should use one mbuf chain for the entire + * prepared write, and compress the data into as few mbufs as possible. + */ + struct os_mbuf *bape_value; +}; + +SLIST_HEAD(ble_att_prep_entry_list, ble_att_prep_entry); + +struct ble_att_svr_conn { + /** This list is sorted by attribute handle ID. */ + struct ble_att_prep_entry_list basc_prep_list; + ble_npl_time_t basc_prep_timeout_at; +}; + +/** + * Handles a host attribute request. + * + * @param entry The host attribute being requested. + * @param op The operation being performed on the attribute. + * @param arg The request data associated with that host + * attribute. + * + * @return 0 on success; + * One of the BLE_ATT_ERR_[...] codes on + * failure. + */ +typedef int ble_att_svr_access_fn(uint16_t conn_handle, uint16_t attr_handle, + uint8_t op, uint16_t offset, + struct os_mbuf **om, void *arg); + +int ble_att_svr_register(const ble_uuid_t *uuid, uint8_t flags, + uint8_t min_key_size, uint16_t *handle_id, + ble_att_svr_access_fn *cb, void *cb_arg); + +struct ble_att_svr_entry { + STAILQ_ENTRY(ble_att_svr_entry) ha_next; + + const ble_uuid_t *ha_uuid; + uint8_t ha_flags; + uint8_t ha_min_key_size; + uint16_t ha_handle_id; + ble_att_svr_access_fn *ha_cb; + void *ha_cb_arg; +}; + +SLIST_HEAD(ble_att_clt_entry_list, ble_att_clt_entry); + +/*** @gen */ + +struct ble_l2cap_chan *ble_att_create_chan(uint16_t conn_handle); +int ble_att_conn_chan_find(uint16_t conn_handle, struct ble_hs_conn **out_conn, + struct ble_l2cap_chan **out_chan); +void ble_att_inc_tx_stat(uint8_t att_op); +void ble_att_truncate_to_mtu(const struct ble_l2cap_chan *att_chan, + struct os_mbuf *txom); +void ble_att_set_peer_mtu(struct ble_l2cap_chan *chan, uint16_t peer_mtu); +uint16_t ble_att_chan_mtu(const struct ble_l2cap_chan *chan); +int ble_att_init(void); + +#define BLE_ATT_LOG_CMD(is_tx, cmd_name, conn_handle, log_cb, cmd) \ + BLE_HS_LOG_CMD((is_tx), "att", (cmd_name), (conn_handle), (log_cb), (cmd)) + +#define BLE_ATT_LOG_EMPTY_CMD(is_tx, cmd_name, conn_handle) \ + BLE_HS_LOG_EMPTY_CMD((is_tx), "att", (cmd_name), (conn_handle)) + +/*** @svr */ + +int ble_att_svr_start(void); +void ble_att_svr_stop(void); + +struct ble_att_svr_entry * +ble_att_svr_find_by_uuid(struct ble_att_svr_entry *start_at, + const ble_uuid_t *uuid, + uint16_t end_handle); +uint16_t ble_att_svr_prev_handle(void); +int ble_att_svr_rx_mtu(uint16_t conn_handle, struct os_mbuf **rxom); +struct ble_att_svr_entry *ble_att_svr_find_by_handle(uint16_t handle_id); +int32_t ble_att_svr_ticks_until_tmo(const struct ble_att_svr_conn *svr, + ble_npl_time_t now); +int ble_att_svr_rx_find_info(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_svr_rx_find_type_value(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_read_type(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_read_group_type(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_read(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_read_blob(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_read_mult(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_write(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_write_no_rsp(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_svr_rx_prep_write(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_exec_write(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_notify(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_indicate(uint16_t conn_handle, + struct os_mbuf **rxom); +void ble_att_svr_prep_clear(struct ble_att_prep_entry_list *prep_list); +int ble_att_svr_read_handle(uint16_t conn_handle, uint16_t attr_handle, + uint16_t offset, struct os_mbuf *om, + uint8_t *out_att_err); +void ble_att_svr_reset(void); +int ble_att_svr_init(void); + +void ble_att_svr_hide_range(uint16_t start_handle, uint16_t end_handle); +void ble_att_svr_restore_range(uint16_t start_handle, uint16_t end_handle); + +int ble_att_svr_tx_error_rsp(uint16_t conn_handle, struct os_mbuf *txom, + uint8_t req_op, uint16_t handle, + uint8_t error_code); +/*** $clt */ + +/** An information-data entry in a find information response. */ +struct ble_att_find_info_idata { + uint16_t attr_handle; + ble_uuid_any_t uuid; +}; + +/** A handles-information entry in a find by type value response. */ +struct ble_att_find_type_value_hinfo { + uint16_t attr_handle; + uint16_t group_end_handle; +}; + +/** An attribute-data entry in a read by type response. */ +struct ble_att_read_type_adata { + uint16_t att_handle; + int value_len; + uint8_t *value; + +}; + +/** An attribute-data entry in a read by group type response. */ +struct ble_att_read_group_type_adata { + uint16_t att_handle; + uint16_t end_group_handle; + int value_len; + uint8_t *value; +}; + +int ble_att_clt_rx_error(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_mtu(uint16_t conn_handle, uint16_t mtu); +int ble_att_clt_rx_mtu(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_read(uint16_t conn_handle, uint16_t handle); +int ble_att_clt_rx_read(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_read_blob(uint16_t conn_handle, uint16_t handle, + uint16_t offset); +int ble_att_clt_rx_read_blob(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_read_mult(uint16_t conn_handle, + const uint16_t *handles, int num_handles); +int ble_att_clt_rx_read_mult(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_read_type(uint16_t conn_handle, uint16_t start_handle, + uint16_t end_handle, const ble_uuid_t *uuid); +int ble_att_clt_rx_read_type(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_read_group_type(uint16_t conn_handle, + uint16_t start_handle, uint16_t end_handle, + const ble_uuid_t *uuid128); +int ble_att_clt_rx_read_group_type(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_clt_tx_find_info(uint16_t conn_handle, uint16_t start_handle, + uint16_t end_handle); +int ble_att_clt_rx_find_info(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_find_type_value(uint16_t conn_handle, uint16_t start_handle, + uint16_t end_handle, uint16_t attribute_type, + const void *attribute_value, int value_len); +int ble_att_clt_rx_find_type_value(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_clt_tx_write_req(uint16_t conn_handle, uint16_t handle, + struct os_mbuf *txom); +int ble_att_clt_tx_write_cmd(uint16_t conn_handle, uint16_t handle, + struct os_mbuf *txom); +int ble_att_clt_tx_prep_write(uint16_t conn_handle, uint16_t handle, + uint16_t offset, struct os_mbuf *txom); +int ble_att_clt_rx_prep_write(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_exec_write(uint16_t conn_handle, uint8_t flags); +int ble_att_clt_rx_exec_write(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_rx_write(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_notify(uint16_t conn_handle, uint16_t handle, + struct os_mbuf *txom); +int ble_att_clt_tx_indicate(uint16_t conn_handle, uint16_t handle, + struct os_mbuf *txom); +int ble_att_clt_rx_indicate(uint16_t conn_handle, struct os_mbuf **rxom); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gatt_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_gatt_priv.h similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gatt_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_gatt_priv.h index 07616d011..4a59635b8 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gatt_priv.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_gatt_priv.h @@ -20,9 +20,9 @@ #ifndef H_BLE_GATT_PRIV_ #define H_BLE_GATT_PRIV_ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/stats/stats.h" -#include "nimble/nimble/host/include/host/ble_gatt.h" +#include "syscfg/syscfg.h" +#include "stats/stats.h" +#include "host/ble_gatt.h" #ifdef __cplusplus extern "C" { #endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_hs_conn_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_hs_conn_priv.h new file mode 100644 index 000000000..92aacd405 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_hs_conn_priv.h @@ -0,0 +1,128 @@ +/* + * 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_HS_CONN_ +#define H_BLE_HS_CONN_ + +#include +#include "ble_l2cap_priv.h" +#include "ble_gatt_priv.h" +#include "ble_att_priv.h" +#ifdef __cplusplus +extern "C" { +#endif + +struct hci_le_conn_complete; +struct hci_create_conn; +struct ble_l2cap_chan; + +typedef uint8_t ble_hs_conn_flags_t; + +#define BLE_HS_CONN_F_MASTER 0x01 +#define BLE_HS_CONN_F_TERMINATING 0x02 +#define BLE_HS_CONN_F_TX_FRAG 0x04 /* Cur ACL packet partially txed. */ + +struct ble_hs_conn { + SLIST_ENTRY(ble_hs_conn) bhc_next; + uint16_t bhc_handle; + uint8_t bhc_our_addr_type; +#if MYNEWT_VAL(BLE_EXT_ADV) + uint8_t bhc_our_rnd_addr[6]; +#endif + ble_addr_t bhc_peer_addr; + ble_addr_t bhc_our_rpa_addr; + ble_addr_t bhc_peer_rpa_addr; + + uint16_t bhc_itvl; + uint16_t bhc_latency; + uint16_t bhc_supervision_timeout; + uint8_t bhc_master_clock_accuracy; + + uint32_t supported_feat; + + ble_hs_conn_flags_t bhc_flags; + + struct ble_l2cap_chan_list bhc_channels; + struct ble_l2cap_chan *bhc_rx_chan; /* Channel rxing current packet. */ + ble_npl_time_t bhc_rx_timeout; + + /** + * Count of packets sent over this connection that the controller has not + * transmitted or flushed yet. + */ + uint16_t bhc_outstanding_pkts; + +#if MYNEWT_VAL(BLE_HS_FLOW_CTRL) + /** + * Count of packets received over this connection that have been processed + * and freed. + */ + uint16_t bhc_completed_pkts; +#endif + + /** Queue of outgoing packets that could not be sent. */ + STAILQ_HEAD(, os_mbuf_pkthdr) bhc_tx_q; + + struct ble_att_svr_conn bhc_att_svr; + struct ble_gatts_conn bhc_gatt_svr; + + struct ble_gap_sec_state bhc_sec_state; + + ble_gap_event_fn *bhc_cb; + void *bhc_cb_arg; +}; + +struct ble_hs_conn_addrs { + ble_addr_t our_id_addr; + ble_addr_t peer_id_addr; + ble_addr_t our_ota_addr; + ble_addr_t peer_ota_addr; +}; + +int ble_hs_conn_can_alloc(void); +struct ble_hs_conn *ble_hs_conn_alloc(uint16_t conn_handle); +void ble_hs_conn_free(struct ble_hs_conn *conn); +void ble_hs_conn_insert(struct ble_hs_conn *conn); +void ble_hs_conn_remove(struct ble_hs_conn *conn); +struct ble_hs_conn *ble_hs_conn_find(uint16_t conn_handle); +struct ble_hs_conn *ble_hs_conn_find_assert(uint16_t conn_handle); +struct ble_hs_conn *ble_hs_conn_find_by_addr(const ble_addr_t *addr); +struct ble_hs_conn *ble_hs_conn_find_by_idx(int idx); +int ble_hs_conn_exists(uint16_t conn_handle); +struct ble_hs_conn *ble_hs_conn_first(void); +struct ble_l2cap_chan *ble_hs_conn_chan_find_by_scid(struct ble_hs_conn *conn, + uint16_t cid); +struct ble_l2cap_chan *ble_hs_conn_chan_find_by_dcid(struct ble_hs_conn *conn, + uint16_t cid); +int ble_hs_conn_chan_insert(struct ble_hs_conn *conn, + struct ble_l2cap_chan *chan); +void +ble_hs_conn_delete_chan(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan); + +void ble_hs_conn_addrs(const struct ble_hs_conn *conn, + struct ble_hs_conn_addrs *addrs); +int32_t ble_hs_conn_timer(void); + +int ble_hs_conn_init(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_l2cap_coc_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_l2cap_coc_priv.h new file mode 100644 index 000000000..0a1a97b77 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_l2cap_coc_priv.h @@ -0,0 +1,85 @@ +/* + * 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_L2CAP_COC_PRIV_ +#define H_L2CAP_COC_PRIV_ + +#include +#include "syscfg/syscfg.h" +#include "os/queue.h" +#include "os/os_mbuf.h" +#include "host/ble_l2cap.h" +#include "ble_l2cap_sig_priv.h" +#ifdef __cplusplus +extern "C" { +#endif + +#define BLE_L2CAP_COC_CID_START 0x0040 +#define BLE_L2CAP_COC_CID_END 0x007F + +struct ble_l2cap_chan; + +#define BLE_L2CAP_COC_FLAG_STALLED 0x01 + +struct ble_l2cap_coc_endpoint { + struct os_mbuf *sdu; + uint16_t mtu; + uint16_t credits; + uint16_t data_offset; + uint8_t flags; +}; + +struct ble_l2cap_coc_srv { + STAILQ_ENTRY(ble_l2cap_coc_srv) next; + uint16_t psm; + uint16_t mtu; + ble_l2cap_event_fn *cb; + void *cb_arg; +}; + +#if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) != 0 +int ble_l2cap_coc_init(void); +int ble_l2cap_coc_create_server(uint16_t psm, uint16_t mtu, + ble_l2cap_event_fn *cb, void *cb_arg); +int ble_l2cap_coc_create_srv_chan(uint16_t conn_handle, uint16_t psm, + struct ble_l2cap_chan **chan); +struct ble_l2cap_chan * ble_l2cap_coc_chan_alloc(uint16_t conn_handle, + uint16_t psm, uint16_t mtu, + struct os_mbuf *sdu_rx, + ble_l2cap_event_fn *cb, + void *cb_arg); +void ble_l2cap_coc_cleanup_chan(struct ble_l2cap_chan *chan); +void ble_l2cap_coc_le_credits_update(uint16_t conn_handle, uint16_t dcid, + uint16_t credits); +int ble_l2cap_coc_recv_ready(struct ble_l2cap_chan *chan, + struct os_mbuf *sdu_rx); +int ble_l2cap_coc_send(struct ble_l2cap_chan *chan, struct os_mbuf *sdu_tx); +#else +#define ble_l2cap_coc_init() 0 +#define ble_l2cap_coc_create_server(psm, mtu, cb, cb_arg) BLE_HS_ENOTSUP +#define ble_l2cap_coc_recv_ready(chan, sdu_rx) BLE_HS_ENOTSUP +#define ble_l2cap_coc_cleanup_chan(chan) +#define ble_l2cap_coc_send(chan, sdu_tx) BLE_HS_ENOTSUP +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* H_L2CAP_COC_PRIV_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_l2cap_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_l2cap_priv.h new file mode 100644 index 000000000..640974d2a --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_l2cap_priv.h @@ -0,0 +1,125 @@ +/* + * 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_L2CAP_PRIV_ +#define H_L2CAP_PRIV_ + +#include "ble_l2cap_coc_priv.h" +#include "host/ble_l2cap.h" +#include +#include "stats/stats.h" +#include "os/queue.h" +#include "os/os_mbuf.h" +#ifdef __cplusplus +extern "C" { +#endif + +struct ble_hs_conn; +struct hci_data_hdr; + +STATS_SECT_START(ble_l2cap_stats) + STATS_SECT_ENTRY(chan_create) + STATS_SECT_ENTRY(chan_delete) + STATS_SECT_ENTRY(update_init) + STATS_SECT_ENTRY(update_rx) + STATS_SECT_ENTRY(update_fail) + STATS_SECT_ENTRY(proc_timeout) + STATS_SECT_ENTRY(sig_tx) + STATS_SECT_ENTRY(sig_rx) + STATS_SECT_ENTRY(sm_tx) + STATS_SECT_ENTRY(sm_rx) +STATS_SECT_END +extern STATS_SECT_DECL(ble_l2cap_stats) ble_l2cap_stats; + +extern struct os_mempool ble_l2cap_chan_pool; + +/* This is nimble specific; packets sent to the black hole CID do not elicit + * an "invalid CID" response. + */ +#define BLE_L2CAP_CID_BLACK_HOLE 0xffff + +#define BLE_L2CAP_HDR_SZ 4 + +typedef uint8_t ble_l2cap_chan_flags; + +typedef int ble_l2cap_rx_fn(struct ble_l2cap_chan *chan); + +struct ble_l2cap_chan { + SLIST_ENTRY(ble_l2cap_chan) next; + uint16_t conn_handle; + uint16_t dcid; + uint16_t scid; + uint16_t my_mtu; + uint16_t peer_mtu; /* 0 if not exchanged. */ + ble_l2cap_chan_flags flags; + + struct os_mbuf *rx_buf; + uint16_t rx_len; /* Length of current reassembled rx packet. */ + + ble_l2cap_rx_fn *rx_fn; + +#if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) != 0 + uint16_t psm; + struct ble_l2cap_coc_endpoint coc_rx; + struct ble_l2cap_coc_endpoint coc_tx; + uint16_t initial_credits; + ble_l2cap_event_fn *cb; + void *cb_arg; +#endif +}; + +struct ble_l2cap_hdr { + uint16_t len; + uint16_t cid; +}; + +typedef int ble_l2cap_tx_fn(struct ble_hs_conn *conn, + struct ble_l2cap_chan *chan); + +#define BLE_L2CAP_CHAN_F_TXED_MTU 0x01 /* We have sent our MTU. */ + +SLIST_HEAD(ble_l2cap_chan_list, ble_l2cap_chan); + +int ble_l2cap_parse_hdr(struct os_mbuf *om, int off, + struct ble_l2cap_hdr *l2cap_hdr); +struct os_mbuf *ble_l2cap_prepend_hdr(struct os_mbuf *om, uint16_t cid, + uint16_t len); + +struct ble_l2cap_chan *ble_l2cap_chan_alloc(uint16_t conn_handle); +void ble_l2cap_chan_free(struct ble_l2cap_chan *chan); + +bool ble_l2cap_is_mtu_req_sent(const struct ble_l2cap_chan *chan); + +int ble_l2cap_rx(struct ble_hs_conn *conn, + struct hci_data_hdr *hci_hdr, + struct os_mbuf *om, + ble_l2cap_rx_fn **out_rx_cb, + int *out_reject_cid); +int ble_l2cap_tx(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan, + struct os_mbuf *txom); + +void ble_l2cap_remove_rx(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan); + +int ble_l2cap_init(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_l2cap_sig_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_l2cap_sig_priv.h new file mode 100644 index 000000000..1a6fb8293 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/ble_l2cap_sig_priv.h @@ -0,0 +1,124 @@ +/* + * 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_L2CAP_SIG_ +#define H_BLE_L2CAP_SIG_ + +#include "syscfg/syscfg.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define BLE_L2CAP_SIG_MTU 100 /* This is our own default. */ + +#define BLE_L2CAP_SIG_HDR_SZ 4 +struct ble_l2cap_sig_hdr { + uint8_t op; + uint8_t identifier; + uint16_t length; + uint8_t data[0]; +} __attribute__((packed)); + +#define BLE_L2CAP_SIG_REJECT_MIN_SZ 2 +struct ble_l2cap_sig_reject { + uint16_t reason; + uint8_t data[0]; +} __attribute__((packed)); + +#define BLE_L2CAP_SIG_UPDATE_REQ_SZ 8 +struct ble_l2cap_sig_update_req { + uint16_t itvl_min; + uint16_t itvl_max; + uint16_t slave_latency; + uint16_t timeout_multiplier; +} __attribute__((packed)); + +#define BLE_L2CAP_SIG_UPDATE_RSP_SZ 2 +struct ble_l2cap_sig_update_rsp { + uint16_t result; +} __attribute__((packed)); + +#define BLE_L2CAP_SIG_UPDATE_RSP_RESULT_ACCEPT 0x0000 +#define BLE_L2CAP_SIG_UPDATE_RSP_RESULT_REJECT 0x0001 + +struct ble_l2cap_sig_le_con_req { + uint16_t psm; + uint16_t scid; + uint16_t mtu; + uint16_t mps; + uint16_t credits; +} __attribute__((packed)); + +struct ble_l2cap_sig_le_con_rsp { + uint16_t dcid; + uint16_t mtu; + uint16_t mps; + uint16_t credits; + uint16_t result; +} __attribute__((packed)); + +struct ble_l2cap_sig_disc_req { + uint16_t dcid; + uint16_t scid; +} __attribute__((packed)); + +struct ble_l2cap_sig_disc_rsp { + uint16_t dcid; + uint16_t scid; +} __attribute__((packed)); + +struct ble_l2cap_sig_le_credits { + uint16_t scid; + uint16_t credits; +} __attribute__((packed)); + +void ble_l2cap_sig_hdr_parse(void *payload, uint16_t len, + struct ble_l2cap_sig_hdr *hdr); +int ble_l2cap_sig_reject_tx(uint16_t conn_handle, + uint8_t id, uint16_t reason, + void *data, int data_len); +int ble_l2cap_sig_reject_invalid_cid_tx(uint16_t conn_handle, uint8_t id, + uint16_t src_cid, uint16_t dst_cid); +int ble_l2cap_sig_tx(uint16_t conn_handle, struct os_mbuf *txom); +void *ble_l2cap_sig_cmd_get(uint8_t opcode, uint8_t id, uint16_t len, + struct os_mbuf **txom); +#if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) != 0 +int ble_l2cap_sig_coc_connect(uint16_t conn_handle, uint16_t psm, uint16_t mtu, + struct os_mbuf *sdu_rx, + ble_l2cap_event_fn *cb, void *cb_arg); +int ble_l2cap_sig_disconnect(struct ble_l2cap_chan *chan); +int ble_l2cap_sig_le_credits(uint16_t conn_handle, uint16_t scid, + uint16_t credits); +#else +#define ble_l2cap_sig_coc_connect(conn_handle, psm, mtu, sdu_rx, cb, cb_arg) \ + BLE_HS_ENOTSUP +#define ble_l2cap_sig_disconnect(chan) BLE_HS_ENOTSUP +#endif + +void ble_l2cap_sig_conn_broken(uint16_t conn_handle, int reason); +int32_t ble_l2cap_sig_timer(void); +struct ble_l2cap_chan *ble_l2cap_sig_create_chan(uint16_t conn_handle); +int ble_l2cap_sig_init(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/cfg_cli.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/cfg_cli.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/cfg_cli.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/cfg_cli.c index d2596c434..2c2f6c3ff 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/cfg_cli.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/cfg_cli.c @@ -6,13 +6,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_MODEL_LOG #if MYNEWT_VAL(BLE_MESH_CFG_CLI) -#include "../include/mesh/mesh.h" +#include "mesh/mesh.h" #include #include @@ -1498,4 +1496,3 @@ void bt_mesh_cfg_cli_timeout_set(s32_t timeout) } #endif -#endif \ No newline at end of file diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/cfg_srv.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/cfg_srv.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/cfg_srv.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/cfg_srv.c index f5de01cbf..57aac90a3 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/cfg_srv.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/cfg_srv.c @@ -6,16 +6,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_MODEL_LOG #include #include #include -#include "../include/mesh/mesh.h" +#include "mesh/mesh.h" #include "mesh_priv.h" #include "adv.h" @@ -3619,4 +3617,3 @@ void bt_mesh_subnet_del(struct bt_mesh_subnet *sub, bool store) memset(sub, 0, sizeof(*sub)); sub->net_idx = BT_MESH_KEY_UNUSED; } -#endif \ No newline at end of file diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/crypto.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/crypto.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/crypto.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/crypto.c index 425897630..20b110378 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/crypto.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/crypto.c @@ -6,14 +6,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_CRYPTO_LOG #include #include #include +#include "syscfg/syscfg.h" #if (MYNEWT_VAL(BLE_CRYPTO_STACK_MBEDTLS)) #include "mbedtls/aes.h" @@ -25,11 +24,11 @@ #include "mbedtls/ecp.h" #else -#include "nimble/ext/tinycrypt/include/tinycrypt/constants.h" -#include "nimble/ext/tinycrypt/include/tinycrypt/utils.h" -#include "nimble/ext/tinycrypt/include/tinycrypt/aes.h" -#include "nimble/ext/tinycrypt/include/tinycrypt/cmac_mode.h" -#include "nimble/ext/tinycrypt/include/tinycrypt/ccm_mode.h" +#include +#include +#include +#include +#include #endif #include "crypto.h" @@ -966,4 +965,3 @@ int bt_mesh_beacon_auth(const u8_t beacon_key[16], u8_t flags, return err; } -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/crypto.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/crypto.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/crypto.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/crypto.h index 8af371c60..745cf324a 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/crypto.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/crypto.h @@ -8,7 +8,7 @@ #ifndef __CRYPTO_H__ #define __CRYPTO_H__ -#include "../include/mesh/mesh.h" +#include "mesh/mesh.h" struct bt_mesh_sg { const void *data; diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/foundation.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/foundation.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/foundation.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/foundation.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/friend.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/friend.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/friend.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/friend.c index c10a93ec7..9056a8658 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/friend.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/friend.c @@ -6,9 +6,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_CRYPTO_LOG #if MYNEWT_VAL(BLE_MESH_FRIEND) @@ -17,9 +15,9 @@ #include #include -#include "../include/mesh/mesh.h" -#include "../include/mesh/slist.h" -#include "../include/mesh_priv.h" +#include "mesh/mesh.h" +#include "mesh/slist.h" +#include "mesh_priv.h" #include "crypto.h" #include "adv.h" #include "net.h" @@ -1651,4 +1649,3 @@ void bt_mesh_friend_clear_incomplete(struct bt_mesh_subnet *sub, u16_t src, } #endif /* MYNEWT_VAL(BLE_MESH_FRIEND) */ -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/friend.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/friend.h similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/friend.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/friend.h index 361c1f097..10ffa8190 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/friend.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/friend.h @@ -9,7 +9,7 @@ #ifndef __FRIEND_H__ #define __FRIEND_H__ -#include "../include/mesh/mesh.h" +#include "mesh/mesh.h" enum bt_mesh_friend_pdu_type { BT_MESH_FRIEND_PDU_SINGLE, diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/glue.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/glue.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/glue.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/glue.c index 14e515b91..7da73d15b 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/glue.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/glue.c @@ -17,15 +17,13 @@ * under the License. */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_LOG -#include "../include/mesh/glue.h" +#include "mesh/glue.h" #include "adv.h" #ifndef MYNEWT -#include "nimble/porting/nimble/include/nimble/nimble_port.h" +#include "nimble/nimble_port.h" #endif #if MYNEWT_VAL(BLE_MESH_SETTINGS) @@ -892,4 +890,4 @@ char *settings_str_from_bytes(const void *vp, int vp_len, } #endif /* MYNEWT_VAL(BLE_MESH_SETTINGS) */ -#endif + diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/health_cli.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/health_cli.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/health_cli.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/health_cli.c index 3fc29e52f..193279c28 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/health_cli.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/health_cli.c @@ -6,22 +6,20 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_MODEL_LOG #include #include #include -#include "../include/mesh/mesh.h" +#include "mesh/mesh.h" #include "mesh_priv.h" #include "adv.h" #include "net.h" #include "transport.h" #include "foundation.h" -#include "../include/mesh/health_cli.h" +#include "mesh/health_cli.h" static s32_t msg_timeout = K_SECONDS(5); @@ -556,4 +554,3 @@ static int health_cli_init(struct bt_mesh_model *model) const struct bt_mesh_model_cb bt_mesh_health_cli_cb = { .init = health_cli_init, }; -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/health_srv.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/health_srv.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/health_srv.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/health_srv.c index 7063d9203..16de83a99 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/health_srv.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/health_srv.c @@ -6,16 +6,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_MODEL_LOG #include #include #include -#include "../include/mesh/mesh.h" +#include "mesh/mesh.h" #include "mesh_priv.h" #include "adv.h" #include "net.h" @@ -453,4 +451,3 @@ void bt_mesh_attention(struct bt_mesh_model *model, u8_t time) } } } -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/light_model.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/light_model.c similarity index 87% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/light_model.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/light_model.c index a390bf86b..b6d838188 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/light_model.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/light_model.c @@ -1,9 +1,8 @@ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) +#include "syscfg/syscfg.h" -#include "../include/mesh/mesh.h" -#include "nimble/console/console.h" +#include "mesh/mesh.h" +#include "console/console.h" #include "light_model.h" @@ -56,4 +55,4 @@ int light_model_light_lightness_set(struct bt_mesh_model *model, s16_t lightness { return light_model_gen_level_set(model, lightness); } -#endif + diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/light_model.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/light_model.h similarity index 87% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/light_model.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/light_model.h index f3b1f7cb7..95fcdb786 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/light_model.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/light_model.h @@ -6,8 +6,8 @@ #ifndef __BT_MESH_LIGHT_MODEL_H #define __BT_MESH_LIGHT_MODEL_H -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "../include/mesh/mesh.h" +#include "syscfg/syscfg.h" +#include "mesh/mesh.h" int light_model_gen_onoff_get(struct bt_mesh_model *model, u8_t *state); int light_model_gen_onoff_set(struct bt_mesh_model *model, u8_t state); diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/lpn.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/lpn.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/lpn.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/lpn.c index 5bb64b97d..ec012a5f0 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/lpn.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/lpn.c @@ -6,16 +6,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_LOW_POWER_LOG #if MYNEWT_VAL(BLE_MESH_LOW_POWER) #include -#include "../include/mesh/mesh.h" +#include "mesh/mesh.h" #include "mesh_priv.h" #include "crypto.h" #include "adv.h" @@ -1056,4 +1054,3 @@ int bt_mesh_lpn_init(void) } #endif /* MYNEWT_VAL(BLE_MESH_LOW_POWER) */ -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/lpn.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/lpn.h similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/lpn.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/lpn.h index e53c81d3d..0ff6c9cfd 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/lpn.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/lpn.h @@ -8,7 +8,7 @@ #ifndef __LPN_H__ #define __LPN_H__ -#include "../include/mesh/mesh.h" +#include "mesh/mesh.h" int bt_mesh_lpn_friend_update(struct bt_mesh_net_rx *rx, struct os_mbuf *buf); diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/mesh.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/mesh.c similarity index 96% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/mesh.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/mesh.c index 7ad1264ae..52fbdbf66 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/mesh.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/mesh.c @@ -6,17 +6,15 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_LOG #include #include -#include "nimble/porting/nimble/include/os/os_mbuf.h" -#include "../include/mesh/mesh.h" -#include "nimble/nimble/host/include/host/ble_uuid.h" +#include "os/os_mbuf.h" +#include "mesh/mesh.h" +#include "host/ble_uuid.h" #include "adv.h" #include "prov.h" @@ -361,4 +359,3 @@ int bt_mesh_init(uint8_t own_addr_type, const struct bt_mesh_prov *prov, return 0; } -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/mesh_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/mesh_priv.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/mesh_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/mesh_priv.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/model_cli.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/model_cli.c similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/model_cli.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/model_cli.c index c8b10df0c..b00cfa520 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/model_cli.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/model_cli.c @@ -4,13 +4,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_MODEL_LOG -#include "../include/mesh/mesh.h" -#include "../include/mesh/model_cli.h" +#include "mesh/mesh.h" +#include "mesh/model_cli.h" #include "mesh_priv.h" static s32_t msg_timeout = K_SECONDS(5); @@ -300,4 +298,4 @@ done: os_mbuf_free_chain(msg); return err; } -#endif + diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/model_srv.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/model_srv.c similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/model_srv.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/model_srv.c index e7bbf38d0..5f5a8df42 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/model_srv.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/model_srv.c @@ -4,13 +4,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_MODEL_LOG -#include "../include/mesh/mesh.h" -#include "../include/mesh/model_srv.h" +#include "mesh/mesh.h" +#include "mesh/model_srv.h" #include "mesh_priv.h" static struct bt_mesh_gen_onoff_srv *gen_onoff_srv; @@ -266,4 +264,3 @@ static int lightness_srv_init(struct bt_mesh_model *model) const struct bt_mesh_model_cb light_lightness_srv_cb = { .init = lightness_srv_init, }; -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/net.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/net.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/net.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/net.c index b8e48d6ed..cf11c2d4f 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/net.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/net.c @@ -6,17 +6,15 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_NET_LOG #include #include #include -#include "nimble/porting/nimble/include/os/os_mbuf.h" -#include "../include/mesh/mesh.h" +#include "os/os_mbuf.h" +#include "mesh/mesh.h" #include "crypto.h" #include "adv.h" @@ -256,7 +254,8 @@ int friend_cred_set(struct friend_cred *cred, u8_t idx, const u8_t net_key[16]) void friend_cred_refresh(u16_t net_idx) { int i; - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wtype-limits" for (i = 0; i < ARRAY_SIZE(friend_cred); i++) { struct friend_cred *cred = &friend_cred[i]; @@ -266,6 +265,7 @@ void friend_cred_refresh(u16_t net_idx) sizeof(cred->cred[0])); } } +#pragma GCC diagnostic pop } int friend_cred_update(struct bt_mesh_subnet *sub) @@ -273,7 +273,8 @@ int friend_cred_update(struct bt_mesh_subnet *sub) int err, i; BT_DBG("net_idx 0x%04x", sub->net_idx); - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wtype-limits" for (i = 0; i < ARRAY_SIZE(friend_cred); i++) { struct friend_cred *cred = &friend_cred[i]; @@ -287,7 +288,7 @@ int friend_cred_update(struct bt_mesh_subnet *sub) return err; } } - +#pragma GCC diagnostic pop return 0; } @@ -298,7 +299,8 @@ struct friend_cred *friend_cred_create(struct bt_mesh_subnet *sub, u16_t addr, int i, err; BT_DBG("net_idx 0x%04x addr 0x%04x", sub->net_idx, addr); - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wtype-limits" for (cred = NULL, i = 0; i < ARRAY_SIZE(friend_cred); i++) { if ((friend_cred[i].addr == BT_MESH_ADDR_UNASSIGNED) || (friend_cred[i].addr == addr && @@ -307,7 +309,7 @@ struct friend_cred *friend_cred_create(struct bt_mesh_subnet *sub, u16_t addr, break; } } - +#pragma GCC diagnostic pop if (!cred) { BT_WARN("No free friend credential slots"); return NULL; @@ -347,7 +349,8 @@ void friend_cred_clear(struct friend_cred *cred) int friend_cred_del(u16_t net_idx, u16_t addr) { int i; - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wtype-limits" for (i = 0; i < ARRAY_SIZE(friend_cred); i++) { struct friend_cred *cred = &friend_cred[i]; @@ -356,7 +359,7 @@ int friend_cred_del(u16_t net_idx, u16_t addr) return 0; } } - +#pragma GCC diagnostic pop return -ENOENT; } @@ -366,7 +369,8 @@ int friend_cred_get(struct bt_mesh_subnet *sub, u16_t addr, u8_t *nid, int i; BT_DBG("net_idx 0x%04x addr 0x%04x", sub->net_idx, addr); - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wtype-limits" for (i = 0; i < ARRAY_SIZE(friend_cred); i++) { struct friend_cred *cred = &friend_cred[i]; @@ -392,7 +396,7 @@ int friend_cred_get(struct bt_mesh_subnet *sub, u16_t addr, u8_t *nid, return 0; } - +#pragma GCC diagnostic pop return -ENOENT; } @@ -1026,7 +1030,8 @@ static int friend_decrypt(struct bt_mesh_subnet *sub, const u8_t *data, int i; BT_DBG("NID 0x%02x net_idx 0x%04x", NID(data), sub->net_idx); - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wtype-limits" for (i = 0; i < ARRAY_SIZE(friend_cred); i++) { struct friend_cred *cred = &friend_cred[i]; @@ -1051,7 +1056,7 @@ static int friend_decrypt(struct bt_mesh_subnet *sub, const u8_t *data, return 0; } } - +#pragma GCC diagnostic pop return -ENOENT; } @@ -1433,4 +1438,3 @@ void bt_mesh_net_init(void) k_work_init(&bt_mesh.local_work, bt_mesh_net_local); net_buf_slist_init(&bt_mesh.local_queue); } -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/net.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/net.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/net.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/net.h index 1a7e3aa7d..976da0053 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/net.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/net.h @@ -22,8 +22,8 @@ #include #include "atomic.h" -#include "../include/mesh/mesh.h" -#include "../include/mesh/glue.h" +#include "mesh/mesh.h" +#include "mesh/glue.h" /* How many hours in between updating IVU duration */ #define BT_MESH_IVU_MIN_HOURS 96 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/nodes.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/nodes.c similarity index 96% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/nodes.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/nodes.c index de41f40d0..127ef21e4 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/nodes.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/nodes.c @@ -4,14 +4,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_PROV_LOG #if MYNEWT_VAL(BLE_MESH_PROVISIONER) -#include "../include/mesh/mesh.h" +#include "mesh/mesh.h" #include "mesh_priv.h" #include "net.h" @@ -161,4 +159,3 @@ void bt_mesh_node_del(struct bt_mesh_node *node, bool store) } #endif -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/nodes.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/nodes.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/nodes.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/nodes.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/prov.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/prov.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/prov.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/prov.c index f8f22fa7e..fe92c0e34 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/prov.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/prov.c @@ -6,16 +6,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_PROV_LOG #if MYNEWT_VAL(BLE_MESH_PROV) #include -#include "../include/mesh/mesh.h" +#include "mesh/mesh.h" #include "mesh_priv.h" #include "crypto.h" @@ -2008,4 +2006,3 @@ void bt_mesh_prov_reset(void) } #endif /* MYNEWT_VAL(BLE_MESH_PROV) */ -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/prov.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/prov.h similarity index 85% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/prov.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/prov.h index c6866c9e2..96e5a447c 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/prov.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/prov.h @@ -9,9 +9,9 @@ #ifndef __PROV_H__ #define __PROV_H__ -#include "nimble/porting/nimble/include/os/os_mbuf.h" -#include "../include/mesh/mesh.h" -#include "nimble/nimble/host/src/ble_hs_conn_priv.h" +#include "os/os_mbuf.h" +#include "mesh/mesh.h" +#include "../src/ble_hs_conn_priv.h" int bt_mesh_pb_adv_open(const u8_t uuid[16], u16_t net_idx, u16_t addr, u8_t attention_duration); diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/proxy.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/proxy.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/proxy.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/proxy.c index 6801791f1..134a36dd6 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/proxy.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/proxy.c @@ -6,17 +6,15 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_PROXY_LOG #if MYNEWT_VAL(BLE_MESH_PROXY) -#include "../include/mesh/mesh.h" -#include "nimble/nimble/host/include/host/ble_att.h" -#include "nimble/nimble/host/services/gatt/include/services/gatt/ble_svc_gatt.h" -#include "nimble/nimble/host/src/ble_hs_priv.h" +#include "mesh/mesh.h" +#include "host/ble_att.h" +#include "services/gatt/ble_svc_gatt.h" +#include "../../host/src/ble_hs_priv.h" #include "mesh_priv.h" #include "adv.h" @@ -1499,4 +1497,3 @@ int bt_mesh_proxy_init(void) } #endif /* MYNEWT_VAL(BLE_MESH_PROXY) */ -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/proxy.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/proxy.h similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/proxy.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/proxy.h index e099947c9..64338a0a3 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/proxy.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/proxy.h @@ -14,7 +14,7 @@ #define BT_MESH_PROXY_CONFIG 0x02 #define BT_MESH_PROXY_PROV 0x03 -#include "../include/mesh/mesh.h" +#include "mesh/mesh.h" int bt_mesh_proxy_send(uint16_t conn_handle, u8_t type, struct os_mbuf *msg); diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/settings.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/settings.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/settings.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/settings.c index 2130e9e6c..88d9b302e 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/settings.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/settings.c @@ -4,15 +4,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_SETTINGS_LOG #if MYNEWT_VAL(BLE_MESH_SETTINGS) -#include "../include/mesh/mesh.h" -#include "../include/mesh/glue.h" +#include "mesh/mesh.h" +#include "mesh/glue.h" #include "net.h" #include "crypto.h" #include "transport.h" @@ -2083,4 +2081,3 @@ void bt_mesh_settings_init(void) } #endif /* MYNEWT_VAL(BLE_MESH_SETTINGS) */ -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/settings.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/settings.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/settings.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/settings.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/shell.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/shell.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/shell.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/shell.c index c19342764..91fbd9785 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/shell.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/shell.c @@ -9,8 +9,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) +#include "syscfg/syscfg.h" #if MYNEWT_VAL(BLE_MESH_SHELL) @@ -2818,4 +2817,3 @@ void ble_mesh_shell_init(void) #endif } -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/shell.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/shell.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/shell.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/shell.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att_cmd_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_att_cmd_priv.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att_cmd_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_att_cmd_priv.h index 18f473603..70f33260a 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att_cmd_priv.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_att_cmd_priv.h @@ -22,7 +22,7 @@ #include #include -#include "nimble/porting/nimble/include/os/os_mbuf.h" +#include "os/os_mbuf.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_att_priv.h similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_att_priv.h index ab59c4f01..73b6aeab0 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att_priv.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_att_priv.h @@ -21,10 +21,10 @@ #define H_BLE_ATT_PRIV_ #include -#include "nimble/porting/nimble/include/stats/stats.h" -#include "nimble/nimble/host/include/host/ble_att.h" -#include "nimble/nimble/host/include/host/ble_uuid.h" -#include "nimble/nimble/include/nimble/nimble_npl.h" +#include "stats/stats.h" +#include "host/ble_att.h" +#include "host/ble_uuid.h" +#include "nimble/nimble_npl.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gap_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_gap_priv.h similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gap_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_gap_priv.h index 3767ddba8..2b6b40696 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gap_priv.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_gap_priv.h @@ -21,9 +21,9 @@ #define H_BLE_GAP_CONN_ #include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/stats/stats.h" -#include "nimble/nimble/host/include/host/ble_gap.h" +#include "syscfg/syscfg.h" +#include "stats/stats.h" +#include "host/ble_gap.h" #ifdef __cplusplus extern "C" { #endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_gatt_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_gatt_priv.h new file mode 100644 index 000000000..4a59635b8 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_gatt_priv.h @@ -0,0 +1,199 @@ +/* + * 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_GATT_PRIV_ +#define H_BLE_GATT_PRIV_ + +#include "syscfg/syscfg.h" +#include "stats/stats.h" +#include "host/ble_gatt.h" +#ifdef __cplusplus +extern "C" { +#endif + +struct ble_att_read_type_adata; +struct ble_att_find_type_value_hinfo; +struct ble_att_find_info_idata; +struct ble_att_read_group_type_adata; +struct ble_att_prep_write_cmd; + +STATS_SECT_START(ble_gattc_stats) + STATS_SECT_ENTRY(mtu) + STATS_SECT_ENTRY(mtu_fail) + STATS_SECT_ENTRY(disc_all_svcs) + STATS_SECT_ENTRY(disc_all_svcs_fail) + STATS_SECT_ENTRY(disc_svc_uuid) + STATS_SECT_ENTRY(disc_svc_uuid_fail) + STATS_SECT_ENTRY(find_inc_svcs) + STATS_SECT_ENTRY(find_inc_svcs_fail) + STATS_SECT_ENTRY(disc_all_chrs) + STATS_SECT_ENTRY(disc_all_chrs_fail) + STATS_SECT_ENTRY(disc_chrs_uuid) + STATS_SECT_ENTRY(disc_chrs_uuid_fail) + STATS_SECT_ENTRY(disc_all_dscs) + STATS_SECT_ENTRY(disc_all_dscs_fail) + STATS_SECT_ENTRY(read) + STATS_SECT_ENTRY(read_fail) + STATS_SECT_ENTRY(read_uuid) + STATS_SECT_ENTRY(read_uuid_fail) + STATS_SECT_ENTRY(read_long) + STATS_SECT_ENTRY(read_long_fail) + STATS_SECT_ENTRY(read_mult) + STATS_SECT_ENTRY(read_mult_fail) + STATS_SECT_ENTRY(write_no_rsp) + STATS_SECT_ENTRY(write_no_rsp_fail) + STATS_SECT_ENTRY(write) + STATS_SECT_ENTRY(write_fail) + STATS_SECT_ENTRY(write_long) + STATS_SECT_ENTRY(write_long_fail) + STATS_SECT_ENTRY(write_reliable) + STATS_SECT_ENTRY(write_reliable_fail) + STATS_SECT_ENTRY(notify) + STATS_SECT_ENTRY(notify_fail) + STATS_SECT_ENTRY(indicate) + STATS_SECT_ENTRY(indicate_fail) + STATS_SECT_ENTRY(proc_timeout) +STATS_SECT_END +extern STATS_SECT_DECL(ble_gattc_stats) ble_gattc_stats; + +STATS_SECT_START(ble_gatts_stats) + STATS_SECT_ENTRY(svcs) + STATS_SECT_ENTRY(chrs) + STATS_SECT_ENTRY(dscs) + STATS_SECT_ENTRY(svc_def_reads) + STATS_SECT_ENTRY(svc_inc_reads) + STATS_SECT_ENTRY(chr_def_reads) + STATS_SECT_ENTRY(chr_val_reads) + STATS_SECT_ENTRY(chr_val_writes) + STATS_SECT_ENTRY(dsc_reads) + STATS_SECT_ENTRY(dsc_writes) +STATS_SECT_END +extern STATS_SECT_DECL(ble_gatts_stats) ble_gatts_stats; + +#define BLE_GATT_CHR_DECL_SZ_16 5 +#define BLE_GATT_CHR_DECL_SZ_128 19 + +typedef uint8_t ble_gatts_conn_flags; + +struct ble_gatts_conn { + struct ble_gatts_clt_cfg *clt_cfgs; + int num_clt_cfgs; + + uint16_t indicate_val_handle; +}; + +/*** @client. */ + +int ble_gattc_locked_by_cur_task(void); +void ble_gatts_indicate_fail_notconn(uint16_t conn_handle); + +void ble_gattc_rx_err(uint16_t conn_handle, uint16_t handle, uint16_t status); +void ble_gattc_rx_mtu(uint16_t conn_handle, int status, uint16_t chan_mtu); +void ble_gattc_rx_read_type_adata(uint16_t conn_handle, + struct ble_att_read_type_adata *adata); +void ble_gattc_rx_read_type_complete(uint16_t conn_handle, int status); +void ble_gattc_rx_read_rsp(uint16_t conn_handle, int status, + struct os_mbuf **rxom); +void ble_gattc_rx_read_blob_rsp(uint16_t conn_handle, int status, + struct os_mbuf **rxom); +void ble_gattc_rx_read_mult_rsp(uint16_t conn_handle, int status, + struct os_mbuf **rxom); +void ble_gattc_rx_read_group_type_adata( + uint16_t conn_handle, struct ble_att_read_group_type_adata *adata); +void ble_gattc_rx_read_group_type_complete(uint16_t conn_handle, int rc); +void ble_gattc_rx_find_type_value_hinfo( + uint16_t conn_handle, struct ble_att_find_type_value_hinfo *hinfo); +void ble_gattc_rx_find_type_value_complete(uint16_t conn_handle, int status); +void ble_gattc_rx_write_rsp(uint16_t conn_handle); +void ble_gattc_rx_prep_write_rsp(uint16_t conn_handle, int status, + uint16_t handle, uint16_t offset, + struct os_mbuf **rxom); +void ble_gattc_rx_exec_write_rsp(uint16_t conn_handle, int status); +void ble_gattc_rx_indicate_rsp(uint16_t conn_handle); +void ble_gattc_rx_find_info_idata(uint16_t conn_handle, + struct ble_att_find_info_idata *idata); +void ble_gattc_rx_find_info_complete(uint16_t conn_handle, int status); +void ble_gattc_connection_txable(uint16_t conn_handle); +void ble_gattc_connection_broken(uint16_t conn_handle); +int32_t ble_gattc_timer(void); + +int ble_gattc_any_jobs(void); +int ble_gattc_init(void); + +/*** @server. */ +#define BLE_GATTS_CLT_CFG_F_NOTIFY 0x0001 +#define BLE_GATTS_CLT_CFG_F_INDICATE 0x0002 +#define BLE_GATTS_CLT_CFG_F_MODIFIED 0x0080 /* Internal only. */ +#define BLE_GATTS_CLT_CFG_F_RESERVED 0xfffc + +#define BLE_GATTS_INC_SVC_LEN_NO_UUID 4 +#define BLE_GATTS_INC_SVC_LEN_UUID 6 + +/** + * Contains counts of resources required by the GATT server. The contents of + * this struct are generally used to populate a configuration struct before + * the host is initialized. + */ +struct ble_gatt_resources { + /** Number of services. */ + uint16_t svcs; + + /** Number of included services. */ + uint16_t incs; + + /** Number of characteristics. */ + uint16_t chrs; + + /** Number of descriptors. */ + uint16_t dscs; + + /** + * Number of client characteristic configuration descriptors. Each of + * these also contributes to the total descriptor count. + */ + uint16_t cccds; + + /** Total number of ATT attributes. */ + uint16_t attrs; +}; + +int ble_gatts_rx_indicate_ack(uint16_t conn_handle, uint16_t chr_val_handle); +int ble_gatts_send_next_indicate(uint16_t conn_handle); +void ble_gatts_tx_notifications(void); +void ble_gatts_bonding_established(uint16_t conn_handle); +void ble_gatts_bonding_restored(uint16_t conn_handle); +void ble_gatts_connection_broken(uint16_t conn_handle); +void ble_gatts_lcl_svc_foreach(ble_gatt_svc_foreach_fn cb, void *arg); +int ble_gatts_register_svcs(const struct ble_gatt_svc_def *svcs, + ble_gatt_register_fn *register_cb, + void *cb_arg); +int ble_gatts_clt_cfg_access(uint16_t conn_handle, uint16_t attr_handle, + uint8_t op, uint16_t offset, struct os_mbuf **om, + void *arg); + +/*** @misc. */ +int ble_gatts_conn_can_alloc(void); +int ble_gatts_conn_init(struct ble_gatts_conn *gatts_conn); +int ble_gatts_init(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_adv_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_adv_priv.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_adv_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_adv_priv.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_atomic_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_atomic_priv.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_atomic_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_atomic_priv.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_conn_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_conn_priv.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_conn_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_conn_priv.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_flow_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_flow_priv.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_flow_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_flow_priv.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_hci_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_hci_priv.h similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_hci_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_hci_priv.h index d8a72cb29..362f12cbd 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_hci_priv.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_hci_priv.h @@ -20,7 +20,7 @@ #ifndef H_BLE_HS_HCI_PRIV_ #define H_BLE_HS_HCI_PRIV_ -#include "nimble/nimble/include/nimble/hci_common.h" +#include "nimble/hci_common.h" #ifdef __cplusplus extern "C" { #endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_id_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_id_priv.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_id_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_id_priv.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_mbuf_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_mbuf_priv.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_mbuf_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_mbuf_priv.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_periodic_sync_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_periodic_sync_priv.h similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_periodic_sync_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_periodic_sync_priv.h index f16132f04..c82ea7904 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_periodic_sync_priv.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_periodic_sync_priv.h @@ -21,7 +21,7 @@ #define H_BLE_HS_PERIODIC_SYNC_ #include -#include "nimble/porting/nimble/include/os/queue.h" +#include "os/queue.h" #ifdef __cplusplus extern "C" { #endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_priv.h similarity index 95% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_priv.h index 952690e71..538d07a97 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_priv.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_priv.h @@ -42,10 +42,10 @@ #include "ble_hs_id_priv.h" #include "ble_hs_periodic_sync_priv.h" #include "ble_uuid_priv.h" -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "nimble/nimble/host/include/host/ble_monitor.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/porting/nimble/include/stats/stats.h" +#include "host/ble_hs.h" +#include "host/ble_monitor.h" +#include "nimble/nimble_opt.h" +#include "stats/stats.h" #ifdef __cplusplus extern "C" { #endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_pvcy_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_pvcy_priv.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_pvcy_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_pvcy_priv.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_resolv_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_resolv_priv.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_resolv_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_resolv_priv.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_startup_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_startup_priv.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_startup_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_hs_startup_priv.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_coc_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_l2cap_coc_priv.h similarity index 93% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_coc_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_l2cap_coc_priv.h index 911946e05..5ebdaa050 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_coc_priv.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_l2cap_coc_priv.h @@ -21,10 +21,10 @@ #define H_L2CAP_COC_PRIV_ #include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/queue.h" -#include "nimble/porting/nimble/include/os/os_mbuf.h" -#include "nimble/nimble/host/include/host/ble_l2cap.h" +#include "syscfg/syscfg.h" +#include "os/queue.h" +#include "os/os_mbuf.h" +#include "host/ble_l2cap.h" #include "ble_l2cap_sig_priv.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_l2cap_priv.h similarity index 95% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_l2cap_priv.h index 30af30427..e3409743b 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_priv.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_l2cap_priv.h @@ -21,11 +21,11 @@ #define H_L2CAP_PRIV_ #include "ble_l2cap_coc_priv.h" -#include "nimble/nimble/host/include/host/ble_l2cap.h" +#include "host/ble_l2cap.h" #include -#include "nimble/porting/nimble/include/stats/stats.h" -#include "nimble/porting/nimble/include/os/queue.h" -#include "nimble/porting/nimble/include/os/os_mbuf.h" +#include "stats/stats.h" +#include "os/queue.h" +#include "os/os_mbuf.h" #ifdef __cplusplus extern "C" { #endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_sig_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_l2cap_sig_priv.h similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_sig_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_l2cap_sig_priv.h index a0e2e58cf..a698cd0d8 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_sig_priv.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_l2cap_sig_priv.h @@ -20,7 +20,7 @@ #ifndef H_BLE_L2CAP_SIG_ #define H_BLE_L2CAP_SIG_ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" +#include "syscfg/syscfg.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_monitor_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_monitor_priv.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_monitor_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_monitor_priv.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_sm_priv.h similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_sm_priv.h index 853b33f7a..def0a32f5 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm_priv.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_sm_priv.h @@ -21,9 +21,9 @@ #define H_BLE_SM_PRIV_ #include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/queue.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" +#include "syscfg/syscfg.h" +#include "os/queue.h" +#include "nimble/nimble_opt.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_uuid_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_uuid_priv.h similarity index 96% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_uuid_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_uuid_priv.h index 39ce88d7a..3dbcc6b8e 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_uuid_priv.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/src/ble_uuid_priv.h @@ -20,7 +20,7 @@ #ifndef H_BLE_UUID_PRIV_ #define H_BLE_UUID_PRIV_ -#include "nimble/nimble/host/include/host/ble_uuid.h" +#include "host/ble_uuid.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/testing.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/testing.c new file mode 100644 index 000000000..d0a053760 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/testing.c @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2017 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +#include "console/console.h" +#include "mesh/testing.h" +#include "mesh/slist.h" +#include "mesh/glue.h" +#include "mesh/access.h" + +#include "net.h" +#include "testing.h" +#include "access.h" +#include "foundation.h" +#include "lpn.h" +#include "transport.h" + +static sys_slist_t cb_slist; + +void bt_test_cb_register(struct bt_test_cb *cb) +{ + sys_slist_append(&cb_slist, &cb->node); +} + +void bt_test_cb_unregister(struct bt_test_cb *cb) +{ + sys_slist_find_and_remove(&cb_slist, &cb->node); +} + +void bt_test_mesh_net_recv(u8_t ttl, u8_t ctl, u16_t src, u16_t dst, + const void *payload, size_t payload_len) +{ + struct bt_test_cb *cb; + + SYS_SLIST_FOR_EACH_CONTAINER(&cb_slist, cb, node) { + if (cb->mesh_net_recv) { + cb->mesh_net_recv(ttl, ctl, src, dst, payload, + payload_len); + } + } +} + +void bt_test_mesh_model_bound(u16_t addr, struct bt_mesh_model *model, + u16_t key_idx) +{ + struct bt_test_cb *cb; + + SYS_SLIST_FOR_EACH_CONTAINER(&cb_slist, cb, node) { + if (cb->mesh_model_bound) { + cb->mesh_model_bound(addr, model, key_idx); + } + } +} + +void bt_test_mesh_model_unbound(u16_t addr, struct bt_mesh_model *model, + u16_t key_idx) +{ + struct bt_test_cb *cb; + + SYS_SLIST_FOR_EACH_CONTAINER(&cb_slist, cb, node) { + if (cb->mesh_model_unbound) { + cb->mesh_model_unbound(addr, model, key_idx); + } + } +} + +void bt_test_mesh_prov_invalid_bearer(u8_t opcode) +{ + struct bt_test_cb *cb; + + SYS_SLIST_FOR_EACH_CONTAINER(&cb_slist, cb, node) { + if (cb->mesh_prov_invalid_bearer) { + cb->mesh_prov_invalid_bearer(opcode); + } + } +} + +void bt_test_mesh_trans_incomp_timer_exp(void) +{ + struct bt_test_cb *cb; + + SYS_SLIST_FOR_EACH_CONTAINER(&cb_slist, cb, node) { + if (cb->mesh_trans_incomp_timer_exp) { + cb->mesh_trans_incomp_timer_exp(); + } + } +} + +int bt_test_mesh_lpn_group_add(u16_t group) +{ + bt_mesh_lpn_group_add(group); + + return 0; +} + +int bt_test_mesh_lpn_group_remove(u16_t *groups, size_t groups_count) +{ + bt_mesh_lpn_group_del(groups, groups_count); + + return 0; +} + +int bt_test_mesh_rpl_clear(void) +{ + bt_mesh_rpl_clear(); + + return 0; +} + +void bt_test_print_credentials(void) +{ + int i; + u8_t nid; + const u8_t *enc; + const u8_t *priv; + struct bt_mesh_subnet *sub; + struct bt_mesh_app_key *app_key; + + console_printf("IV Index: %08lx\n", (long) bt_mesh.iv_index); + console_printf("Dev key: %s\n", bt_hex(bt_mesh.dev_key, 16)); + + for (i = 0; i < MYNEWT_VAL(BLE_MESH_SUBNET_COUNT); ++i) + { + if (bt_mesh.app_keys[i].net_idx == BT_MESH_KEY_UNUSED) { + continue; + } + + sub = &bt_mesh.sub[i]; + + console_printf("Subnet: %d\n", i); + console_printf("\tNetKeyIdx: %04x\n", + sub->net_idx); + console_printf("\tNetKey: %s\n", + bt_hex(sub->keys[sub->kr_flag].net, 16)); + } + + for (i = 0; i < MYNEWT_VAL(BLE_MESH_APP_KEY_COUNT); ++i) + { + if (bt_mesh.app_keys[i].net_idx == BT_MESH_KEY_UNUSED) { + continue; + } + + sub = &bt_mesh.sub[i]; + app_key = &bt_mesh.app_keys[i]; + + console_printf("AppKey: %d\n", i); + console_printf("\tNetKeyIdx: %04x\n", + app_key->net_idx); + console_printf("\tAppKeyIdx: %04x\n", + app_key->app_idx); + console_printf("\tAppKey: %s\n", + bt_hex(app_key->keys[sub->kr_flag].val, 16)); + } + + for (i = 0; i < MYNEWT_VAL(BLE_MESH_SUBNET_COUNT); ++i) + { + if (bt_mesh.sub[i].net_idx == BT_MESH_KEY_UNUSED) { + continue; + } + + if (friend_cred_get(&bt_mesh.sub[i], BT_MESH_ADDR_UNASSIGNED, + &nid, &enc, &priv)) { + return; + } + + console_printf("Friend cred: %d\n", i); + console_printf("\tNetKeyIdx: %04x\n", + bt_mesh.sub[i].net_idx); + console_printf("\tNID: %02x\n", nid); + console_printf("\tEncKey: %s\n", + bt_hex(enc, 16)); + console_printf("\tPrivKey: %s\n", + bt_hex(priv, 16)); + } +} + +int bt_test_shell_init(void) +{ +#if MYNEWT_VAL(BLE_MESH_SHELL) + return cmd_mesh_init(0, NULL); +#else + return -ENOTSUP; +#endif +} + +int bt_test_bind_app_key_to_model(struct bt_mesh_model *model, u16_t key_idx, u16_t id) +{ + struct bt_mesh_model *found_model; + + found_model = bt_mesh_model_find(bt_mesh_model_elem(model), id); + if (!found_model) { + return STATUS_INVALID_MODEL; + } + + return mod_bind(found_model, key_idx); +} diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/testing.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/testing.h new file mode 100644 index 000000000..166a9eea6 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/testing.h @@ -0,0 +1,23 @@ +/** + * @file testing.h + * @brief Internal API for Bluetooth testing. + */ + +/* + * Copyright (c) 2017 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "mesh/glue.h" +#include "mesh/access.h" + +void bt_test_mesh_model_bound(u16_t addr, struct bt_mesh_model *model, + u16_t key_idx); +void bt_test_mesh_model_unbound(u16_t addr, struct bt_mesh_model *model, + u16_t key_idx); +void bt_test_mesh_prov_invalid_bearer(u8_t opcode); +void bt_test_mesh_net_recv(u8_t ttl, u8_t ctl, u16_t src, u16_t dst, + const void *payload, size_t payload_len); +void bt_test_mesh_trans_incomp_timer_exp(void); +void bt_test_print_credentials(void); diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/transport.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/transport.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/transport.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/transport.c index c8e716a04..caf1b4f12 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/transport.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/transport.c @@ -6,15 +6,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#if MYNEWT_VAL(BLE_MESH) - +#include "syscfg/syscfg.h" #define MESH_LOG_MODULE BLE_MESH_TRANS_LOG #include #include -#include "../include/mesh/mesh.h" +#include "mesh/mesh.h" #include "mesh_priv.h" #include "crypto.h" @@ -1668,4 +1666,3 @@ int bt_mesh_app_key_get(const struct bt_mesh_subnet *subnet, u16_t app_idx, return 0; } -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/transport.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/transport.h similarity index 96% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/transport.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/transport.h index 227ba5922..eff768e9f 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/src/transport.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/mesh/src/transport.h @@ -6,8 +6,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "../include/mesh/mesh.h" +#include "syscfg/syscfg.h" +#include "mesh/mesh.h" #define TRANS_SEQ_AUTH_NVAL 0xffffffffffffffff diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ans/src/ble_svc_ans.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/ans/src/ble_svc_ans.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ans/src/ble_svc_ans.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/ans/src/ble_svc_ans.c index 2fc50c4be..5b64f18c4 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ans/src/ble_svc_ans.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/ans/src/ble_svc_ans.c @@ -20,11 +20,11 @@ #include #include -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "nimble/nimble/host/include/host/ble_gap.h" -#include "../include/services/ans/ble_svc_ans.h" +#include "sysinit/sysinit.h" +#include "syscfg/syscfg.h" +#include "host/ble_hs.h" +#include "host/ble_gap.h" +#include "services/ans/ble_svc_ans.h" /* Max length of new alert info string */ #define BLE_SVC_ANS_INFO_STR_MAX_LEN 18 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/bas/src/ble_svc_bas.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/bas/src/ble_svc_bas.c similarity index 92% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/bas/src/ble_svc_bas.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/bas/src/ble_svc_bas.c index 317b11627..631519cf9 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/bas/src/ble_svc_bas.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/bas/src/ble_svc_bas.c @@ -20,11 +20,11 @@ #include #include -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "nimble/nimble/host/include/host/ble_gap.h" -#include "../include/services/bas/ble_svc_bas.h" +#include "sysinit/sysinit.h" +#include "syscfg/syscfg.h" +#include "host/ble_hs.h" +#include "host/ble_gap.h" +#include "services/bas/ble_svc_bas.h" /* Characteristic value handles */ #if MYNEWT_VAL(BLE_SVC_BAS_BATTERY_LEVEL_NOTIFY_ENABLE) > 0 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gap/src/ble_svc_gap.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/gap/src/ble_svc_gap.c similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gap/src/ble_svc_gap.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/gap/src/ble_svc_gap.c index f1cf2d9ba..e79b2b872 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gap/src/ble_svc_gap.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/gap/src/ble_svc_gap.c @@ -20,10 +20,10 @@ #include #include -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "../include/services/gap/ble_svc_gap.h" -#include "nimble/porting/nimble/include/os/endian.h" +#include "sysinit/sysinit.h" +#include "host/ble_hs.h" +#include "services/gap/ble_svc_gap.h" +#include "os/endian.h" #define PPCP_ENABLED \ MYNEWT_VAL(BLE_ROLE_PERIPHERAL) && \ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gatt/src/ble_svc_gatt.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/gatt/src/ble_svc_gatt.c similarity index 95% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gatt/src/ble_svc_gatt.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/gatt/src/ble_svc_gatt.c index eef3c49ba..78b4a0683 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gatt/src/ble_svc_gatt.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/gatt/src/ble_svc_gatt.c @@ -19,9 +19,9 @@ #include -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "../include/services/gatt/ble_svc_gatt.h" +#include "sysinit/sysinit.h" +#include "host/ble_hs.h" +#include "services/gatt/ble_svc_gatt.h" static uint16_t ble_svc_gatt_changed_val_handle; static uint16_t ble_svc_gatt_start_handle; diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ias/src/ble_svc_ias.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/ias/src/ble_svc_ias.c similarity index 96% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ias/src/ble_svc_ias.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/ias/src/ble_svc_ias.c index 98be867f1..9f5da1485 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ias/src/ble_svc_ias.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/ias/src/ble_svc_ias.c @@ -19,9 +19,9 @@ #include #include -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "../include/services/ias/ble_svc_ias.h" +#include "sysinit/sysinit.h" +#include "host/ble_hs.h" +#include "services/ias/ble_svc_ias.h" /* Callback function */ static ble_svc_ias_event_fn *ble_svc_ias_cb_fn; diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ipss/src/ble_svc_ipss.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/ipss/src/ble_svc_ipss.c similarity index 89% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ipss/src/ble_svc_ipss.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/ipss/src/ble_svc_ipss.c index dd9d4ee96..f42ca1e9e 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ipss/src/ble_svc_ipss.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/ipss/src/ble_svc_ipss.c @@ -19,9 +19,9 @@ #include -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "../include/services/ipss/ble_svc_ipss.h" +#include "sysinit/sysinit.h" +#include "host/ble_hs.h" +#include "services/ipss/ble_svc_ipss.h" static const struct ble_gatt_svc_def ble_svc_ipss_defs[] = { { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/lls/src/ble_svc_lls.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/lls/src/ble_svc_lls.c similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/lls/src/ble_svc_lls.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/lls/src/ble_svc_lls.c index 822f72ece..b5f7f9bd4 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/lls/src/ble_svc_lls.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/lls/src/ble_svc_lls.c @@ -19,9 +19,9 @@ #include #include -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "../include/services/lls/ble_svc_lls.h" +#include "sysinit/sysinit.h" +#include "host/ble_hs.h" +#include "services/lls/ble_svc_lls.h" /* Callback function */ static ble_svc_lls_event_fn *ble_svc_lls_cb_fn; diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/tps/src/ble_hs_hci_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/tps/src/ble_hs_hci_priv.h new file mode 100644 index 000000000..362f12cbd --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/tps/src/ble_hs_hci_priv.h @@ -0,0 +1,124 @@ +/* + * 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_HS_HCI_PRIV_ +#define H_BLE_HS_HCI_PRIV_ + +#include "nimble/hci_common.h" +#ifdef __cplusplus +extern "C" { +#endif + +struct ble_hs_conn; +struct os_mbuf; + +#define BLE_HS_HCI_LE_FEAT_ENCRYPTION (0x00000001) +#define BLE_HS_HCI_LE_FEAT_CONN_PARAM_REQUEST (0x00000002) +#define BLE_HS_HCI_LE_FEAT_EXT_REJECT (0x00000004) +#define BLE_HS_HCI_LE_FEAT_SLAVE_FEAT_EXCHANGE (0x00000008) +#define BLE_HS_HCI_LE_FEAT_PING (0x00000010) +#define BLE_HS_HCI_LE_FEAT_DATA_PACKET_LENGTH_EXT (0x00000020) +#define BLE_HS_HCI_LE_FEAT_LL_PRIVACY (0x00000040) +#define BLE_HS_HCI_LE_FEAT_EXT_SCANNER_FILTER_POLICIES (0x00000080) +#define BLE_HS_HCI_LE_FEAT_2M_PHY (0x00000100) +#define BLE_HS_HCI_LE_FEAT_STABLE_MOD_INDEX_TX (0x00000200) +#define BLE_HS_HCI_LE_FEAT_STABLE_MOD_INDEX_RX (0x00000400) +#define BLE_HS_HCI_LE_FEAT_CODED_PHY (0x00000800) +#define BLE_HS_HCI_LE_FEAT_EXT_ADV (0x00001000) +#define BLE_HS_HCI_LE_FEAT_PERIODIC_ADV (0x00002000) +#define BLE_HS_HCI_LE_FEAT_CSA2 (0x00004000) +#define BLE_HS_HCI_LE_FEAT_POWER_CLASS_1 (0x00008000) +#define BLE_HS_HCI_LE_FEAT_MIN_NUM_USED_CHAN (0x00010000) + +struct ble_hs_hci_ack { + int bha_status; /* A BLE_HS_E<...> error; NOT a naked HCI code. */ + const uint8_t *bha_params; + int bha_params_len; + uint16_t bha_opcode; + uint8_t bha_hci_handle; +}; + +#if MYNEWT_VAL(BLE_EXT_ADV) +struct ble_hs_hci_ext_scan_param { + uint8_t scan_type; + uint16_t scan_itvl; + uint16_t scan_window; +}; + +struct ble_hs_hci_ext_conn_params { + uint16_t scan_itvl; + uint16_t scan_window; + uint16_t conn_itvl; + uint16_t conn_windows; +}; + +#if MYNEWT_VAL(BLE_PERIODIC_ADV) +/* Periodic Advertising Parameters */ +struct hci_periodic_adv_params +{ + uint16_t min_interval; + uint16_t max_interval; + uint16_t properties; +}; +#endif +#endif + +extern uint16_t ble_hs_hci_avail_pkts; + +int ble_hs_hci_cmd_tx(uint16_t opcode, const void *cmd, uint8_t cmd_len, + void *rsp, uint8_t rsp_len); +void ble_hs_hci_init(void); +void ble_hs_hci_deinit(void); + +void ble_hs_hci_set_le_supported_feat(uint32_t feat); +uint32_t ble_hs_hci_get_le_supported_feat(void); +void ble_hs_hci_set_hci_version(uint8_t hci_version); +uint8_t ble_hs_hci_get_hci_version(void); + +#if MYNEWT_VAL(BLE_HS_PHONY_HCI_ACKS) +typedef int ble_hs_hci_phony_ack_fn(uint8_t *ack, int ack_buf_len); +void ble_hs_hci_set_phony_ack_cb(ble_hs_hci_phony_ack_fn *cb); +#endif + +int ble_hs_hci_util_read_adv_tx_pwr(int8_t *out_pwr); +int ble_hs_hci_util_rand(void *dst, int len); +int ble_hs_hci_util_read_rssi(uint16_t conn_handle, int8_t *out_rssi); +int ble_hs_hci_util_set_random_addr(const uint8_t *addr); +int ble_hs_hci_util_data_hdr_strip(struct os_mbuf *om, + struct hci_data_hdr *out_hdr); +int ble_hs_hci_evt_process(const struct ble_hci_ev *ev); + +int ble_hs_hci_cmd_send_buf(uint16_t opcode, const void *buf, uint8_t buf_len); +int ble_hs_hci_set_buf_sz(uint16_t pktlen, uint16_t max_pkts); +void ble_hs_hci_add_avail_pkts(uint16_t delta); + +uint16_t ble_hs_hci_util_handle_pb_bc_join(uint16_t handle, uint8_t pb, + uint8_t bc); + +int ble_hs_hci_acl_tx_now(struct ble_hs_conn *conn, struct os_mbuf **om); +int ble_hs_hci_acl_tx(struct ble_hs_conn *conn, struct os_mbuf **om); + +int ble_hs_hci_frag_num_mbufs(void); +int ble_hs_hci_frag_num_mbufs_free(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/tps/src/ble_svc_tps.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/tps/src/ble_svc_tps.c similarity index 91% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/tps/src/ble_svc_tps.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/tps/src/ble_svc_tps.c index 0099a9689..9885a9216 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/tps/src/ble_svc_tps.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/services/tps/src/ble_svc_tps.c @@ -19,16 +19,16 @@ #include #include -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "../include/services/tps/ble_svc_tps.h" +#include "sysinit/sysinit.h" +#include "syscfg/syscfg.h" +#include "host/ble_hs.h" +#include "services/tps/ble_svc_tps.h" /* XXX: We shouldn't be including the host's private header files. The host * API needs to be updated with a function to query the advertising transmit * power. */ -#include "nimble/nimble/host/src/ble_hs_hci_priv.h" +#include "../src/ble_hs_hci_priv.h" int8_t ble_svc_tps_tx_power_level; diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att.c similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att.c diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att_clt.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_clt.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att_clt.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_clt.c index 2416ecbcb..09fc9ea23 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att_clt.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_clt.c @@ -21,9 +21,9 @@ #include #include #include -#include "nimble/porting/nimble/include/os/os_mempool.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/host/include/host/ble_uuid.h" +#include "os/os_mempool.h" +#include "nimble/ble.h" +#include "host/ble_uuid.h" #include "ble_hs_priv.h" /***************************************************************************** diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att_cmd.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_cmd.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att_cmd.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_cmd.c index 4c3af1f60..81b070f9c 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att_cmd.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_cmd.c @@ -19,11 +19,11 @@ #include #include -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/nimble/include/nimble/ble.h" +#include "os/os.h" +#include "nimble/ble.h" #include "ble_hs_priv.h" -#include "nimble/nimble/host/include/host/ble_att.h" -#include "nimble/nimble/host/include/host/ble_uuid.h" +#include "host/ble_att.h" +#include "host/ble_uuid.h" #include "ble_hs_priv.h" void * diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_cmd_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_cmd_priv.h new file mode 100644 index 000000000..70f33260a --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_cmd_priv.h @@ -0,0 +1,449 @@ +/* + * 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_ATT_CMD_ +#define H_BLE_ATT_CMD_ + +#include +#include +#include "os/os_mbuf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct ble_att_hdr { + uint8_t opcode; + uint8_t data[0]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Request Opcode In Error | 1 | + * | Attribute Handle In Error | 2 | + * | Error Code | 1 | + */ +#define BLE_ATT_ERROR_RSP_SZ 5 +struct ble_att_error_rsp { + uint8_t baep_req_op; + uint16_t baep_handle; + uint8_t baep_error_code; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Server Rx MTU | 2 | + */ +#define BLE_ATT_MTU_CMD_SZ 3 +struct ble_att_mtu_cmd { + uint16_t bamc_mtu; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Starting Handle | 2 | + * | Ending Handle | 2 | + */ +#define BLE_ATT_FIND_INFO_REQ_SZ 5 +struct ble_att_find_info_req { + uint16_t bafq_start_handle; + uint16_t bafq_end_handle; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Format | 1 | + * | Information Data | 4 to (ATT_MTU-2) | + */ +#define BLE_ATT_FIND_INFO_RSP_BASE_SZ 2 +struct ble_att_find_info_rsp { + uint8_t bafp_format; + /* Followed by information data. */ +} __attribute__((packed)); + +#define BLE_ATT_FIND_INFO_RSP_FORMAT_16BIT 1 +#define BLE_ATT_FIND_INFO_RSP_FORMAT_128BIT 2 + +#define BLE_ATT_FIND_INFO_IDATA_16_SZ 4 +#define BLE_ATT_FIND_INFO_IDATA_128_SZ 18 + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Starting Handle | 2 | + * | Ending Handle | 2 | + * | Attribute Type | 2 | + * | Attribute Value | 0 to (ATT_MTU-7) | + */ +#define BLE_ATT_FIND_TYPE_VALUE_REQ_BASE_SZ 7 +struct ble_att_find_type_value_req { + uint16_t bavq_start_handle; + uint16_t bavq_end_handle; + uint16_t bavq_attr_type; + uint16_t bavq_value[0]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Information Data | 4 to (ATT_MTU-1) | + */ +#define BLE_ATT_FIND_TYPE_VALUE_RSP_BASE_SZ 1 +#define BLE_ATT_FIND_TYPE_VALUE_HINFO_BASE_SZ 4 + +struct ble_att_handle_group { + uint16_t attr_handle; + uint16_t group_end_handle; +} __attribute__((packed)); + +struct ble_att_find_type_value_rsp { + struct ble_att_handle_group list[0]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Starting Handle | 2 | + * | Ending Handle | 2 | + * | Attribute Type | 2 or 16 | + */ +#define BLE_ATT_READ_TYPE_REQ_BASE_SZ 5 +#define BLE_ATT_READ_TYPE_REQ_SZ_16 7 +#define BLE_ATT_READ_TYPE_REQ_SZ_128 21 +struct ble_att_read_type_req { + uint16_t batq_start_handle; + uint16_t batq_end_handle; + uint8_t uuid[0]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Length | 1 | + * | Attribute Data List | 2 to (ATT_MTU-2) | + */ +#define BLE_ATT_READ_TYPE_RSP_BASE_SZ 2 + +struct ble_att_attr_data_list { + uint16_t handle; + uint8_t value[0]; +} __attribute__((packed)); + +struct ble_att_read_type_rsp { + uint8_t batp_length; + struct ble_att_attr_data_list batp_list[0]; +} __attribute__((packed)); + +#define BLE_ATT_READ_TYPE_ADATA_BASE_SZ 2 +#define BLE_ATT_READ_TYPE_ADATA_SZ_16 6 +#define BLE_ATT_READ_TYPE_ADATA_SZ_128 20 + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Attribute Handle | 2 | + */ +#define BLE_ATT_READ_REQ_SZ 3 +struct ble_att_read_req { + uint16_t barq_handle; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Attribute Value | 0 to (ATT_MTU-1) | + */ +#define BLE_ATT_READ_RSP_BASE_SZ 1 + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Attribute Handle | 2 | + * | Value Offset | 2 | + */ +#define BLE_ATT_READ_BLOB_REQ_SZ 5 +struct ble_att_read_blob_req { + uint16_t babq_handle; + uint16_t babq_offset; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Attribute Value | 0 to (ATT_MTU-1) | + */ +#define BLE_ATT_READ_BLOB_RSP_BASE_SZ 1 + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Set Of Handles | 4 to (ATT_MTU-1) | + */ +#define BLE_ATT_READ_MULT_REQ_BASE_SZ 1 +struct ble_att_read_mult_req { + uint16_t handles[0]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Set Of Values | 4 to (ATT_MTU-1) | + */ +#define BLE_ATT_READ_MULT_RSP_BASE_SZ 1 + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Starting Handle | 2 | + * | Ending Handle | 2 | + * | Attribute Group Type | 2 or 16 | + */ +#define BLE_ATT_READ_GROUP_TYPE_REQ_BASE_SZ 5 +#define BLE_ATT_READ_GROUP_TYPE_REQ_SZ_16 7 +#define BLE_ATT_READ_GROUP_TYPE_REQ_SZ_128 21 +struct ble_att_read_group_type_req { + uint16_t bagq_start_handle; + uint16_t bagq_end_handle; + uint8_t uuid[0]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Length | 1 | + * | Attribute Data List | 2 to (ATT_MTU-2) | + */ +#define BLE_ATT_READ_GROUP_TYPE_RSP_BASE_SZ 2 +struct ble_att_read_group_type_rsp { + uint8_t bagp_length; +} __attribute__((packed)); + +#define BLE_ATT_READ_GROUP_TYPE_ADATA_BASE_SZ 4 +#define BLE_ATT_READ_GROUP_TYPE_ADATA_SZ_16 6 +#define BLE_ATT_READ_GROUP_TYPE_ADATA_SZ_128 20 + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Attribute Handle | 2 | + * | Attribute Value | 0 to (ATT_MTU-3) | + */ +#define BLE_ATT_WRITE_REQ_BASE_SZ 3 +struct ble_att_write_req { + uint16_t bawq_handle; + uint8_t value[0]; +} __attribute__((packed)); + +#define BLE_ATT_WRITE_RSP_SZ 1 + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Attribute Handle | 2 | + * | Value Offset | 2 | + * | Part Attribute Value | 0 to (ATT_MTU-5) | + */ +#define BLE_ATT_PREP_WRITE_CMD_BASE_SZ 5 +struct ble_att_prep_write_cmd { + uint16_t bapc_handle; + uint16_t bapc_offset; + uint16_t bapc_value[0]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Flags | 1 | + */ +#define BLE_ATT_EXEC_WRITE_REQ_SZ 2 +struct ble_att_exec_write_req { + uint8_t baeq_flags; +} __attribute__((packed)); + +#define BLE_ATT_EXEC_WRITE_F_CANCEL 0x00 +#define BLE_ATT_EXEC_WRITE_F_EXECUTE 0x01 + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + */ +#define BLE_ATT_EXEC_WRITE_RSP_SZ 1 + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Attribute Handle | 2 | + * | Attribute Value | 0 to (ATT_MTU-3) | + */ +#define BLE_ATT_NOTIFY_REQ_BASE_SZ 3 +struct ble_att_notify_req { + uint16_t banq_handle; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Attribute Handle | 2 | + * | Attribute Value | 0 to (ATT_MTU-3) | + */ +#define BLE_ATT_INDICATE_REQ_BASE_SZ 3 +struct ble_att_indicate_req { + uint16_t baiq_handle; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + */ +#define BLE_ATT_INDICATE_RSP_SZ 1 + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Attribute Handle | 2 | + * | Attribute Value | 0 to (ATT_MTU-3) | + */ +#define BLE_ATT_WRITE_CMD_BASE_SZ 3 +struct ble_att_write_cmd { + uint16_t handle; + uint8_t value[0]; +} __attribute__((packed)); + +void ble_att_error_rsp_parse(const void *payload, int len, + struct ble_att_error_rsp *rsp); +void ble_att_error_rsp_write(void *payload, int len, + const struct ble_att_error_rsp *rsp); +void ble_att_mtu_req_parse(const void *payload, int len, + struct ble_att_mtu_cmd *cmd); +void ble_att_mtu_req_write(void *payload, int len, + const struct ble_att_mtu_cmd *cmd); +void ble_att_mtu_rsp_parse(const void *payload, int len, + struct ble_att_mtu_cmd *cmd); +void ble_att_mtu_rsp_write(void *payload, int len, + const struct ble_att_mtu_cmd *cmd); +void ble_att_find_info_req_parse(const void *payload, int len, + struct ble_att_find_info_req *req); +void ble_att_find_info_req_write(void *payload, int len, + const struct ble_att_find_info_req *req); +void ble_att_find_info_rsp_parse(const void *payload, int len, + struct ble_att_find_info_rsp *rsp); +void ble_att_find_info_rsp_write(void *payload, int len, + const struct ble_att_find_info_rsp *rsp); +void ble_att_find_type_value_req_parse( + const void *payload, int len, struct ble_att_find_type_value_req *req); +void ble_att_find_type_value_req_write( + void *payload, int len, const struct ble_att_find_type_value_req *req); +void ble_att_read_type_req_parse(const void *payload, int len, + struct ble_att_read_type_req *req); +void ble_att_read_type_req_write(void *payload, int len, + const struct ble_att_read_type_req *req); +void ble_att_read_type_rsp_parse(const void *payload, int len, + struct ble_att_read_type_rsp *rsp); +void ble_att_read_type_rsp_write(void *payload, int len, + const struct ble_att_read_type_rsp *rsp); +void ble_att_read_req_parse(const void *payload, int len, + struct ble_att_read_req *req); +void ble_att_read_req_write(void *payload, int len, + const struct ble_att_read_req *req); +void ble_att_read_blob_req_parse(const void *payload, int len, + struct ble_att_read_blob_req *req); +void ble_att_read_blob_req_write(void *payload, int len, + const struct ble_att_read_blob_req *req); +void ble_att_read_mult_req_parse(const void *payload, int len); +void ble_att_read_mult_req_write(void *payload, int len); +void ble_att_read_mult_rsp_parse(const void *payload, int len); +void ble_att_read_mult_rsp_write(void *payload, int len); +void ble_att_read_group_type_req_parse( + const void *payload, int len, struct ble_att_read_group_type_req *req); +void ble_att_read_group_type_req_write( + void *payload, int len, const struct ble_att_read_group_type_req *req); +void ble_att_read_group_type_rsp_parse( + const void *payload, int len, struct ble_att_read_group_type_rsp *rsp); +void ble_att_read_group_type_rsp_write( + void *payload, int len, const struct ble_att_read_group_type_rsp *rsp); +void ble_att_write_req_parse(const void *payload, int len, + struct ble_att_write_req *req); +void ble_att_write_req_write(void *payload, int len, + const struct ble_att_write_req *req); +void ble_att_write_cmd_parse(const void *payload, int len, + struct ble_att_write_req *req); +void ble_att_write_cmd_write(void *payload, int len, + const struct ble_att_write_req *req); +void ble_att_prep_write_req_parse(const void *payload, int len, + struct ble_att_prep_write_cmd *cmd); +void ble_att_prep_write_req_write(void *payload, int len, + const struct ble_att_prep_write_cmd *cmd); +void ble_att_prep_write_rsp_parse(const void *payload, int len, + struct ble_att_prep_write_cmd *cmd); +void ble_att_prep_write_rsp_write(void *payload, int len, + const struct ble_att_prep_write_cmd *cmd); +void ble_att_exec_write_req_parse(const void *payload, int len, + struct ble_att_exec_write_req *req); +void ble_att_exec_write_req_write(void *payload, int len, + const struct ble_att_exec_write_req *req); +void ble_att_exec_write_rsp_parse(const void *payload, int len); +void ble_att_exec_write_rsp_write(void *payload, int len); +void ble_att_notify_req_parse(const void *payload, int len, + struct ble_att_notify_req *req); +void ble_att_notify_req_write(void *payload, int len, + const struct ble_att_notify_req *req); +void ble_att_indicate_req_parse(const void *payload, int len, + struct ble_att_indicate_req *req); +void ble_att_indicate_req_write(void *payload, int len, + const struct ble_att_indicate_req *req); +void ble_att_indicate_rsp_parse(const void *payload, int len); +void ble_att_indicate_rsp_write(void *payload, int len); + +void *ble_att_cmd_prepare(uint8_t opcode, size_t len, struct os_mbuf *txom); +void *ble_att_cmd_get(uint8_t opcode, size_t len, struct os_mbuf **txom); +int ble_att_tx(uint16_t conn_handle, struct os_mbuf *txom); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_priv.h new file mode 100644 index 000000000..73b6aeab0 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_priv.h @@ -0,0 +1,301 @@ +/* + * 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_ATT_PRIV_ +#define H_BLE_ATT_PRIV_ + +#include +#include "stats/stats.h" +#include "host/ble_att.h" +#include "host/ble_uuid.h" +#include "nimble/nimble_npl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct os_mbuf; +struct ble_hs_conn; +struct ble_l2cap_chan; +struct ble_att_find_info_req; +struct ble_att_error_rsp; +struct ble_att_mtu_cmd; +struct ble_att_read_req; +struct ble_att_read_blob_req; +struct ble_att_read_type_req; +struct ble_att_read_group_type_req; +struct ble_att_read_group_type_rsp; +struct ble_att_find_type_value_req; +struct ble_att_write_req; +struct ble_att_prep_write_cmd; +struct ble_att_exec_write_req; +struct ble_att_notify_req; +struct ble_att_indicate_req; + +STATS_SECT_START(ble_att_stats) + STATS_SECT_ENTRY(error_rsp_rx) + STATS_SECT_ENTRY(error_rsp_tx) + STATS_SECT_ENTRY(mtu_req_rx) + STATS_SECT_ENTRY(mtu_req_tx) + STATS_SECT_ENTRY(mtu_rsp_rx) + STATS_SECT_ENTRY(mtu_rsp_tx) + STATS_SECT_ENTRY(find_info_req_rx) + STATS_SECT_ENTRY(find_info_req_tx) + STATS_SECT_ENTRY(find_info_rsp_rx) + STATS_SECT_ENTRY(find_info_rsp_tx) + STATS_SECT_ENTRY(find_type_value_req_rx) + STATS_SECT_ENTRY(find_type_value_req_tx) + STATS_SECT_ENTRY(find_type_value_rsp_rx) + STATS_SECT_ENTRY(find_type_value_rsp_tx) + STATS_SECT_ENTRY(read_type_req_rx) + STATS_SECT_ENTRY(read_type_req_tx) + STATS_SECT_ENTRY(read_type_rsp_rx) + STATS_SECT_ENTRY(read_type_rsp_tx) + STATS_SECT_ENTRY(read_req_rx) + STATS_SECT_ENTRY(read_req_tx) + STATS_SECT_ENTRY(read_rsp_rx) + STATS_SECT_ENTRY(read_rsp_tx) + STATS_SECT_ENTRY(read_blob_req_rx) + STATS_SECT_ENTRY(read_blob_req_tx) + STATS_SECT_ENTRY(read_blob_rsp_rx) + STATS_SECT_ENTRY(read_blob_rsp_tx) + STATS_SECT_ENTRY(read_mult_req_rx) + STATS_SECT_ENTRY(read_mult_req_tx) + STATS_SECT_ENTRY(read_mult_rsp_rx) + STATS_SECT_ENTRY(read_mult_rsp_tx) + STATS_SECT_ENTRY(read_group_type_req_rx) + STATS_SECT_ENTRY(read_group_type_req_tx) + STATS_SECT_ENTRY(read_group_type_rsp_rx) + STATS_SECT_ENTRY(read_group_type_rsp_tx) + STATS_SECT_ENTRY(write_req_rx) + STATS_SECT_ENTRY(write_req_tx) + STATS_SECT_ENTRY(write_rsp_rx) + STATS_SECT_ENTRY(write_rsp_tx) + STATS_SECT_ENTRY(prep_write_req_rx) + STATS_SECT_ENTRY(prep_write_req_tx) + STATS_SECT_ENTRY(prep_write_rsp_rx) + STATS_SECT_ENTRY(prep_write_rsp_tx) + STATS_SECT_ENTRY(exec_write_req_rx) + STATS_SECT_ENTRY(exec_write_req_tx) + STATS_SECT_ENTRY(exec_write_rsp_rx) + STATS_SECT_ENTRY(exec_write_rsp_tx) + STATS_SECT_ENTRY(notify_req_rx) + STATS_SECT_ENTRY(notify_req_tx) + STATS_SECT_ENTRY(indicate_req_rx) + STATS_SECT_ENTRY(indicate_req_tx) + STATS_SECT_ENTRY(indicate_rsp_rx) + STATS_SECT_ENTRY(indicate_rsp_tx) + STATS_SECT_ENTRY(write_cmd_rx) + STATS_SECT_ENTRY(write_cmd_tx) +STATS_SECT_END +extern STATS_SECT_DECL(ble_att_stats) ble_att_stats; + +struct ble_att_prep_entry { + SLIST_ENTRY(ble_att_prep_entry) bape_next; + uint16_t bape_handle; + uint16_t bape_offset; + + /* XXX: This is wasteful; we should use one mbuf chain for the entire + * prepared write, and compress the data into as few mbufs as possible. + */ + struct os_mbuf *bape_value; +}; + +SLIST_HEAD(ble_att_prep_entry_list, ble_att_prep_entry); + +struct ble_att_svr_conn { + /** This list is sorted by attribute handle ID. */ + struct ble_att_prep_entry_list basc_prep_list; + ble_npl_time_t basc_prep_timeout_at; +}; + +/** + * Handles a host attribute request. + * + * @param entry The host attribute being requested. + * @param op The operation being performed on the attribute. + * @param arg The request data associated with that host + * attribute. + * + * @return 0 on success; + * One of the BLE_ATT_ERR_[...] codes on + * failure. + */ +typedef int ble_att_svr_access_fn(uint16_t conn_handle, uint16_t attr_handle, + uint8_t op, uint16_t offset, + struct os_mbuf **om, void *arg); + +int ble_att_svr_register(const ble_uuid_t *uuid, uint8_t flags, + uint8_t min_key_size, uint16_t *handle_id, + ble_att_svr_access_fn *cb, void *cb_arg); + +struct ble_att_svr_entry { + STAILQ_ENTRY(ble_att_svr_entry) ha_next; + + const ble_uuid_t *ha_uuid; + uint8_t ha_flags; + uint8_t ha_min_key_size; + uint16_t ha_handle_id; + ble_att_svr_access_fn *ha_cb; + void *ha_cb_arg; +}; + +SLIST_HEAD(ble_att_clt_entry_list, ble_att_clt_entry); + +/*** @gen */ + +struct ble_l2cap_chan *ble_att_create_chan(uint16_t conn_handle); +int ble_att_conn_chan_find(uint16_t conn_handle, struct ble_hs_conn **out_conn, + struct ble_l2cap_chan **out_chan); +void ble_att_inc_tx_stat(uint8_t att_op); +void ble_att_truncate_to_mtu(const struct ble_l2cap_chan *att_chan, + struct os_mbuf *txom); +void ble_att_set_peer_mtu(struct ble_l2cap_chan *chan, uint16_t peer_mtu); +uint16_t ble_att_chan_mtu(const struct ble_l2cap_chan *chan); +int ble_att_init(void); + +/*** @svr */ + +int ble_att_svr_start(void); +void ble_att_svr_stop(void); + +struct ble_att_svr_entry * +ble_att_svr_find_by_uuid(struct ble_att_svr_entry *start_at, + const ble_uuid_t *uuid, + uint16_t end_handle); +uint16_t ble_att_svr_prev_handle(void); +int ble_att_svr_rx_mtu(uint16_t conn_handle, struct os_mbuf **rxom); +struct ble_att_svr_entry *ble_att_svr_find_by_handle(uint16_t handle_id); +int32_t ble_att_svr_ticks_until_tmo(const struct ble_att_svr_conn *svr, + ble_npl_time_t now); +int ble_att_svr_rx_find_info(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_svr_rx_find_type_value(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_read_type(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_read_group_type(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_read(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_read_blob(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_read_mult(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_write(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_write_no_rsp(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_svr_rx_prep_write(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_exec_write(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_notify(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_svr_rx_indicate(uint16_t conn_handle, + struct os_mbuf **rxom); +void ble_att_svr_prep_clear(struct ble_att_prep_entry_list *prep_list); +int ble_att_svr_read_handle(uint16_t conn_handle, uint16_t attr_handle, + uint16_t offset, struct os_mbuf *om, + uint8_t *out_att_err); +void ble_att_svr_reset(void); +int ble_att_svr_init(void); + +void ble_att_svr_hide_range(uint16_t start_handle, uint16_t end_handle); +void ble_att_svr_restore_range(uint16_t start_handle, uint16_t end_handle); + +int ble_att_svr_tx_error_rsp(uint16_t conn_handle, struct os_mbuf *txom, + uint8_t req_op, uint16_t handle, + uint8_t error_code); +/*** $clt */ + +/** An information-data entry in a find information response. */ +struct ble_att_find_info_idata { + uint16_t attr_handle; + ble_uuid_any_t uuid; +}; + +/** A handles-information entry in a find by type value response. */ +struct ble_att_find_type_value_hinfo { + uint16_t attr_handle; + uint16_t group_end_handle; +}; + +/** An attribute-data entry in a read by type response. */ +struct ble_att_read_type_adata { + uint16_t att_handle; + int value_len; + uint8_t *value; + +}; + +/** An attribute-data entry in a read by group type response. */ +struct ble_att_read_group_type_adata { + uint16_t att_handle; + uint16_t end_group_handle; + int value_len; + uint8_t *value; +}; + +int ble_att_clt_rx_error(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_mtu(uint16_t conn_handle, uint16_t mtu); +int ble_att_clt_rx_mtu(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_read(uint16_t conn_handle, uint16_t handle); +int ble_att_clt_rx_read(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_read_blob(uint16_t conn_handle, uint16_t handle, + uint16_t offset); +int ble_att_clt_rx_read_blob(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_read_mult(uint16_t conn_handle, + const uint16_t *handles, int num_handles); +int ble_att_clt_rx_read_mult(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_read_type(uint16_t conn_handle, uint16_t start_handle, + uint16_t end_handle, const ble_uuid_t *uuid); +int ble_att_clt_rx_read_type(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_read_group_type(uint16_t conn_handle, + uint16_t start_handle, uint16_t end_handle, + const ble_uuid_t *uuid128); +int ble_att_clt_rx_read_group_type(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_clt_tx_find_info(uint16_t conn_handle, uint16_t start_handle, + uint16_t end_handle); +int ble_att_clt_rx_find_info(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_find_type_value(uint16_t conn_handle, uint16_t start_handle, + uint16_t end_handle, uint16_t attribute_type, + const void *attribute_value, int value_len); +int ble_att_clt_rx_find_type_value(uint16_t conn_handle, + struct os_mbuf **rxom); +int ble_att_clt_tx_write_req(uint16_t conn_handle, uint16_t handle, + struct os_mbuf *txom); +int ble_att_clt_tx_write_cmd(uint16_t conn_handle, uint16_t handle, + struct os_mbuf *txom); +int ble_att_clt_tx_prep_write(uint16_t conn_handle, uint16_t handle, + uint16_t offset, struct os_mbuf *txom); +int ble_att_clt_rx_prep_write(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_exec_write(uint16_t conn_handle, uint8_t flags); +int ble_att_clt_rx_exec_write(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_rx_write(uint16_t conn_handle, struct os_mbuf **rxom); +int ble_att_clt_tx_notify(uint16_t conn_handle, uint16_t handle, + struct os_mbuf *txom); +int ble_att_clt_tx_indicate(uint16_t conn_handle, uint16_t handle, + struct os_mbuf *txom); +int ble_att_clt_rx_indicate(uint16_t conn_handle, struct os_mbuf **rxom); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att_svr.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_svr.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att_svr.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_svr.c index 73172ef73..afcf90372 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_att_svr.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_att_svr.c @@ -20,14 +20,11 @@ #include #include #include -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/host/include/host/ble_uuid.h" +#include "os/os.h" +#include "nimble/ble.h" +#include "host/ble_uuid.h" #include "ble_hs_priv.h" - -#ifdef ESP_PLATFORM -#include "nimble/esp_port/port/include/esp_nimble_mem.h" -#endif +#include "esp_nimble_mem.h" /** * ATT server - Attribute Protocol @@ -2672,11 +2669,7 @@ ble_att_svr_reset(void) static void ble_att_svr_free_start_mem(void) { -#ifdef ESP_PLATFORM nimble_platform_mem_free(ble_att_svr_entry_mem); -#else - free(ble_att_svr_entry_mem); -#endif ble_att_svr_entry_mem = NULL; } @@ -2688,11 +2681,7 @@ ble_att_svr_start(void) ble_att_svr_free_start_mem(); if (ble_hs_max_attrs > 0) { -#ifdef ESP_PLATFORM ble_att_svr_entry_mem = nimble_platform_mem_malloc( -#else - ble_att_svr_entry_mem = malloc( -#endif OS_MEMPOOL_BYTES(ble_hs_max_attrs, sizeof (struct ble_att_svr_entry))); if (ble_att_svr_entry_mem == NULL) { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_eddystone.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_eddystone.c similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_eddystone.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_eddystone.c index ad0f449df..eccb3e988 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_eddystone.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_eddystone.c @@ -18,9 +18,9 @@ */ #include -#include "nimble/porting/nimble/include/os/endian.h" -#include "../include/host/ble_eddystone.h" -#include "nimble/nimble/host/include/host/ble_hs_adv.h" +#include "os/endian.h" +#include "host/ble_eddystone.h" +#include "host/ble_hs_adv.h" #include "ble_hs_priv.h" #define BLE_EDDYSTONE_MAX_SVC_DATA_LEN 22 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gap.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gap.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gap.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gap.c index 068414bbf..17ff4eae0 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gap.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gap.c @@ -20,9 +20,9 @@ #include #include #include -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/host/include/host/ble_hs_adv.h" -#include "nimble/nimble/host/include/host/ble_hs_hci.h" +#include "nimble/nimble_opt.h" +#include "host/ble_hs_adv.h" +#include "host/ble_hs_hci.h" #include "ble_hs_priv.h" #include "ble_hs_resolv_priv.h" @@ -2246,6 +2246,11 @@ ble_gap_wl_set(const ble_addr_t *addrs, uint8_t white_list_count) ble_hs_lock(); + if (white_list_count == 0) { + rc = BLE_HS_EINVAL; + goto done; + } + for (i = 0; i < white_list_count; i++) { if (addrs[i].type != BLE_ADDR_PUBLIC && addrs[i].type != BLE_ADDR_RANDOM) { @@ -5612,11 +5617,6 @@ done: #endif } -int ble_gap_set_data_len(uint16_t conn_handle, uint16_t tx_octets, uint16_t tx_time) -{ - return ble_hs_hci_util_set_data_len(conn_handle, tx_octets, tx_time); -} - /***************************************************************************** * $security * *****************************************************************************/ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gap_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gap_priv.h new file mode 100644 index 000000000..2b6b40696 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gap_priv.h @@ -0,0 +1,154 @@ +/* + * 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_GAP_CONN_ +#define H_BLE_GAP_CONN_ + +#include +#include "syscfg/syscfg.h" +#include "stats/stats.h" +#include "host/ble_gap.h" +#ifdef __cplusplus +extern "C" { +#endif + +struct hci_le_conn_upd_complete; +struct hci_le_conn_param_req; +struct hci_le_conn_complete; +struct hci_disconn_complete; +struct hci_encrypt_change; +struct ble_hs_hci_ack; +struct ble_hs_adv; + +STATS_SECT_START(ble_gap_stats) + STATS_SECT_ENTRY(wl_set) + STATS_SECT_ENTRY(wl_set_fail) + STATS_SECT_ENTRY(adv_stop) + STATS_SECT_ENTRY(adv_stop_fail) + STATS_SECT_ENTRY(adv_start) + STATS_SECT_ENTRY(adv_start_fail) + STATS_SECT_ENTRY(adv_set_data) + STATS_SECT_ENTRY(adv_set_data_fail) + STATS_SECT_ENTRY(adv_rsp_set_data) + STATS_SECT_ENTRY(adv_rsp_set_data_fail) + STATS_SECT_ENTRY(discover) + STATS_SECT_ENTRY(discover_fail) + STATS_SECT_ENTRY(initiate) + STATS_SECT_ENTRY(initiate_fail) + STATS_SECT_ENTRY(terminate) + STATS_SECT_ENTRY(terminate_fail) + STATS_SECT_ENTRY(cancel) + STATS_SECT_ENTRY(cancel_fail) + STATS_SECT_ENTRY(update) + STATS_SECT_ENTRY(update_fail) + STATS_SECT_ENTRY(connect_mst) + STATS_SECT_ENTRY(connect_slv) + STATS_SECT_ENTRY(disconnect) + STATS_SECT_ENTRY(rx_disconnect) + STATS_SECT_ENTRY(rx_update_complete) + STATS_SECT_ENTRY(rx_adv_report) + STATS_SECT_ENTRY(rx_conn_complete) + STATS_SECT_ENTRY(discover_cancel) + STATS_SECT_ENTRY(discover_cancel_fail) + STATS_SECT_ENTRY(security_initiate) + STATS_SECT_ENTRY(security_initiate_fail) +STATS_SECT_END + +extern STATS_SECT_DECL(ble_gap_stats) ble_gap_stats; + +#define BLE_GAP_CONN_MODE_MAX 3 +#define BLE_GAP_DISC_MODE_MAX 3 + +#if MYNEWT_VAL(BLE_EXT_ADV) && NIMBLE_BLE_SCAN +void ble_gap_rx_le_scan_timeout(void); +#endif + +#if MYNEWT_VAL(BLE_EXT_ADV) +void ble_gap_rx_ext_adv_report(struct ble_gap_ext_disc_desc *desc); +void ble_gap_rx_adv_set_terminated(const struct ble_hci_ev_le_subev_adv_set_terminated *ev); +#if MYNEWT_VAL(BLE_PERIODIC_ADV) +void ble_gap_rx_peroidic_adv_sync_estab(const struct ble_hci_ev_le_subev_periodic_adv_sync_estab *ev); +void ble_gap_rx_periodic_adv_rpt(const struct ble_hci_ev_le_subev_periodic_adv_rpt *ev); +void ble_gap_rx_periodic_adv_sync_lost(const struct ble_hci_ev_le_subev_periodic_adv_sync_lost *ev); +void ble_gap_rx_periodic_adv_sync_transfer(const struct ble_hci_ev_le_subev_periodic_adv_sync_transfer *ev); +#endif +void ble_gap_rx_scan_req_rcvd(const struct ble_hci_ev_le_subev_scan_req_rcvd *ev); +#endif +void ble_gap_rx_adv_report(struct ble_gap_disc_desc *desc); +void ble_gap_rx_rd_rem_sup_feat_complete(const struct ble_hci_ev_le_subev_rd_rem_used_feat *ev); + +struct ble_gap_conn_complete +{ + uint8_t status; + uint16_t connection_handle; + uint8_t role; + uint8_t peer_addr_type; + uint8_t peer_addr[BLE_DEV_ADDR_LEN]; + uint16_t conn_itvl; + uint16_t conn_latency; + uint16_t supervision_timeout; + uint8_t master_clk_acc; + uint8_t local_rpa[BLE_DEV_ADDR_LEN]; + uint8_t peer_rpa[BLE_DEV_ADDR_LEN]; +}; + +int ble_gap_rx_conn_complete(struct ble_gap_conn_complete *evt, uint8_t instance); +void ble_gap_rx_disconn_complete(const struct ble_hci_ev_disconn_cmp *ev); +void ble_gap_rx_update_complete(const struct ble_hci_ev_le_subev_conn_upd_complete *ev); +void ble_gap_rx_param_req(const struct ble_hci_ev_le_subev_rem_conn_param_req *ev); +int ble_gap_rx_l2cap_update_req(uint16_t conn_handle, + struct ble_gap_upd_params *params); +void ble_gap_rx_phy_update_complete(const struct ble_hci_ev_le_subev_phy_update_complete *ev); +void ble_gap_enc_event(uint16_t conn_handle, int status, + int security_restored, int bonded); +void ble_gap_passkey_event(uint16_t conn_handle, + struct ble_gap_passkey_params *passkey_params); +void ble_gap_notify_rx_event(uint16_t conn_handle, uint16_t attr_handle, + struct os_mbuf *om, int is_indication); +void ble_gap_notify_tx_event(int status, uint16_t conn_handle, + uint16_t attr_handle, int is_indication); +void ble_gap_subscribe_event(uint16_t conn_handle, uint16_t attr_handle, + uint8_t reason, + uint8_t prev_notify, uint8_t cur_notify, + uint8_t prev_indicate, uint8_t cur_indicate); +void ble_gap_mtu_event(uint16_t conn_handle, uint16_t cid, uint16_t mtu); +void ble_gap_identity_event(uint16_t conn_handle); +int ble_gap_repeat_pairing_event(const struct ble_gap_repeat_pairing *rp); +int ble_gap_master_in_progress(void); + +void ble_gap_preempt(void); +void ble_gap_preempt_done(void); + +int ble_gap_terminate_with_conn(struct ble_hs_conn *conn, uint8_t hci_reason); +void ble_gap_conn_broken(uint16_t conn_handle, int reason); +void ble_gap_reset_state(int reason); +int32_t ble_gap_timer(void); + +int ble_gap_init(void); +void ble_gap_deinit(void); + +#if MYNEWT_VAL(BLE_HS_DEBUG) +int ble_gap_dbg_update_active(uint16_t conn_handle); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gatt_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gatt_priv.h new file mode 100644 index 000000000..4a59635b8 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gatt_priv.h @@ -0,0 +1,199 @@ +/* + * 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_GATT_PRIV_ +#define H_BLE_GATT_PRIV_ + +#include "syscfg/syscfg.h" +#include "stats/stats.h" +#include "host/ble_gatt.h" +#ifdef __cplusplus +extern "C" { +#endif + +struct ble_att_read_type_adata; +struct ble_att_find_type_value_hinfo; +struct ble_att_find_info_idata; +struct ble_att_read_group_type_adata; +struct ble_att_prep_write_cmd; + +STATS_SECT_START(ble_gattc_stats) + STATS_SECT_ENTRY(mtu) + STATS_SECT_ENTRY(mtu_fail) + STATS_SECT_ENTRY(disc_all_svcs) + STATS_SECT_ENTRY(disc_all_svcs_fail) + STATS_SECT_ENTRY(disc_svc_uuid) + STATS_SECT_ENTRY(disc_svc_uuid_fail) + STATS_SECT_ENTRY(find_inc_svcs) + STATS_SECT_ENTRY(find_inc_svcs_fail) + STATS_SECT_ENTRY(disc_all_chrs) + STATS_SECT_ENTRY(disc_all_chrs_fail) + STATS_SECT_ENTRY(disc_chrs_uuid) + STATS_SECT_ENTRY(disc_chrs_uuid_fail) + STATS_SECT_ENTRY(disc_all_dscs) + STATS_SECT_ENTRY(disc_all_dscs_fail) + STATS_SECT_ENTRY(read) + STATS_SECT_ENTRY(read_fail) + STATS_SECT_ENTRY(read_uuid) + STATS_SECT_ENTRY(read_uuid_fail) + STATS_SECT_ENTRY(read_long) + STATS_SECT_ENTRY(read_long_fail) + STATS_SECT_ENTRY(read_mult) + STATS_SECT_ENTRY(read_mult_fail) + STATS_SECT_ENTRY(write_no_rsp) + STATS_SECT_ENTRY(write_no_rsp_fail) + STATS_SECT_ENTRY(write) + STATS_SECT_ENTRY(write_fail) + STATS_SECT_ENTRY(write_long) + STATS_SECT_ENTRY(write_long_fail) + STATS_SECT_ENTRY(write_reliable) + STATS_SECT_ENTRY(write_reliable_fail) + STATS_SECT_ENTRY(notify) + STATS_SECT_ENTRY(notify_fail) + STATS_SECT_ENTRY(indicate) + STATS_SECT_ENTRY(indicate_fail) + STATS_SECT_ENTRY(proc_timeout) +STATS_SECT_END +extern STATS_SECT_DECL(ble_gattc_stats) ble_gattc_stats; + +STATS_SECT_START(ble_gatts_stats) + STATS_SECT_ENTRY(svcs) + STATS_SECT_ENTRY(chrs) + STATS_SECT_ENTRY(dscs) + STATS_SECT_ENTRY(svc_def_reads) + STATS_SECT_ENTRY(svc_inc_reads) + STATS_SECT_ENTRY(chr_def_reads) + STATS_SECT_ENTRY(chr_val_reads) + STATS_SECT_ENTRY(chr_val_writes) + STATS_SECT_ENTRY(dsc_reads) + STATS_SECT_ENTRY(dsc_writes) +STATS_SECT_END +extern STATS_SECT_DECL(ble_gatts_stats) ble_gatts_stats; + +#define BLE_GATT_CHR_DECL_SZ_16 5 +#define BLE_GATT_CHR_DECL_SZ_128 19 + +typedef uint8_t ble_gatts_conn_flags; + +struct ble_gatts_conn { + struct ble_gatts_clt_cfg *clt_cfgs; + int num_clt_cfgs; + + uint16_t indicate_val_handle; +}; + +/*** @client. */ + +int ble_gattc_locked_by_cur_task(void); +void ble_gatts_indicate_fail_notconn(uint16_t conn_handle); + +void ble_gattc_rx_err(uint16_t conn_handle, uint16_t handle, uint16_t status); +void ble_gattc_rx_mtu(uint16_t conn_handle, int status, uint16_t chan_mtu); +void ble_gattc_rx_read_type_adata(uint16_t conn_handle, + struct ble_att_read_type_adata *adata); +void ble_gattc_rx_read_type_complete(uint16_t conn_handle, int status); +void ble_gattc_rx_read_rsp(uint16_t conn_handle, int status, + struct os_mbuf **rxom); +void ble_gattc_rx_read_blob_rsp(uint16_t conn_handle, int status, + struct os_mbuf **rxom); +void ble_gattc_rx_read_mult_rsp(uint16_t conn_handle, int status, + struct os_mbuf **rxom); +void ble_gattc_rx_read_group_type_adata( + uint16_t conn_handle, struct ble_att_read_group_type_adata *adata); +void ble_gattc_rx_read_group_type_complete(uint16_t conn_handle, int rc); +void ble_gattc_rx_find_type_value_hinfo( + uint16_t conn_handle, struct ble_att_find_type_value_hinfo *hinfo); +void ble_gattc_rx_find_type_value_complete(uint16_t conn_handle, int status); +void ble_gattc_rx_write_rsp(uint16_t conn_handle); +void ble_gattc_rx_prep_write_rsp(uint16_t conn_handle, int status, + uint16_t handle, uint16_t offset, + struct os_mbuf **rxom); +void ble_gattc_rx_exec_write_rsp(uint16_t conn_handle, int status); +void ble_gattc_rx_indicate_rsp(uint16_t conn_handle); +void ble_gattc_rx_find_info_idata(uint16_t conn_handle, + struct ble_att_find_info_idata *idata); +void ble_gattc_rx_find_info_complete(uint16_t conn_handle, int status); +void ble_gattc_connection_txable(uint16_t conn_handle); +void ble_gattc_connection_broken(uint16_t conn_handle); +int32_t ble_gattc_timer(void); + +int ble_gattc_any_jobs(void); +int ble_gattc_init(void); + +/*** @server. */ +#define BLE_GATTS_CLT_CFG_F_NOTIFY 0x0001 +#define BLE_GATTS_CLT_CFG_F_INDICATE 0x0002 +#define BLE_GATTS_CLT_CFG_F_MODIFIED 0x0080 /* Internal only. */ +#define BLE_GATTS_CLT_CFG_F_RESERVED 0xfffc + +#define BLE_GATTS_INC_SVC_LEN_NO_UUID 4 +#define BLE_GATTS_INC_SVC_LEN_UUID 6 + +/** + * Contains counts of resources required by the GATT server. The contents of + * this struct are generally used to populate a configuration struct before + * the host is initialized. + */ +struct ble_gatt_resources { + /** Number of services. */ + uint16_t svcs; + + /** Number of included services. */ + uint16_t incs; + + /** Number of characteristics. */ + uint16_t chrs; + + /** Number of descriptors. */ + uint16_t dscs; + + /** + * Number of client characteristic configuration descriptors. Each of + * these also contributes to the total descriptor count. + */ + uint16_t cccds; + + /** Total number of ATT attributes. */ + uint16_t attrs; +}; + +int ble_gatts_rx_indicate_ack(uint16_t conn_handle, uint16_t chr_val_handle); +int ble_gatts_send_next_indicate(uint16_t conn_handle); +void ble_gatts_tx_notifications(void); +void ble_gatts_bonding_established(uint16_t conn_handle); +void ble_gatts_bonding_restored(uint16_t conn_handle); +void ble_gatts_connection_broken(uint16_t conn_handle); +void ble_gatts_lcl_svc_foreach(ble_gatt_svc_foreach_fn cb, void *arg); +int ble_gatts_register_svcs(const struct ble_gatt_svc_def *svcs, + ble_gatt_register_fn *register_cb, + void *cb_arg); +int ble_gatts_clt_cfg_access(uint16_t conn_handle, uint16_t attr_handle, + uint8_t op, uint16_t offset, struct os_mbuf **om, + void *arg); + +/*** @misc. */ +int ble_gatts_conn_can_alloc(void); +int ble_gatts_conn_init(struct ble_gatts_conn *gatts_conn); +int ble_gatts_init(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gattc.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gattc.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gattc.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gattc.c index f7bc9f47f..a6e114cc2 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gattc.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gattc.c @@ -54,10 +54,10 @@ #include #include #include -#include "nimble/porting/nimble/include/os/os_mempool.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/host/include/host/ble_uuid.h" -#include "nimble/nimble/host/include/host/ble_gap.h" +#include "os/os_mempool.h" +#include "nimble/ble.h" +#include "host/ble_uuid.h" +#include "host/ble_gap.h" #include "ble_hs_priv.h" /***************************************************************************** diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gatts.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gatts.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gatts.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gatts.c index c805d2ab2..e53cc116f 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gatts.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gatts.c @@ -20,14 +20,11 @@ #include #include #include -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/host/include/host/ble_uuid.h" -#include "nimble/nimble/host/include/host/ble_store.h" +#include "nimble/ble.h" +#include "host/ble_uuid.h" +#include "host/ble_store.h" #include "ble_hs_priv.h" - -#ifdef ESP_PLATFORM -#include "nimble/esp_port/port/include/esp_nimble_mem.h" -#endif +#include "esp_nimble_mem.h" #define BLE_GATTS_INCLUDE_SZ 6 #define BLE_GATTS_CHR_MAX_SZ 19 @@ -1158,11 +1155,7 @@ ble_gatts_connection_broken(uint16_t conn_handle) static void ble_gatts_free_svc_defs(void) { -#ifdef ESP_PLATFORM nimble_platform_mem_free(ble_gatts_svc_defs); -#else - free(ble_gatts_svc_defs); -#endif ble_gatts_svc_defs = NULL; ble_gatts_num_svc_defs = 0; } @@ -1170,19 +1163,11 @@ ble_gatts_free_svc_defs(void) static void ble_gatts_free_mem(void) { -#ifdef ESP_PLATFORM nimble_platform_mem_free(ble_gatts_clt_cfg_mem); ble_gatts_clt_cfg_mem = NULL; nimble_platform_mem_free(ble_gatts_svc_entries); ble_gatts_svc_entries = NULL; -#else - free(ble_gatts_clt_cfg_mem); - ble_gatts_clt_cfg_mem = NULL; - - free(ble_gatts_svc_entries); - ble_gatts_svc_entries = NULL; -#endif } @@ -1225,11 +1210,7 @@ ble_gatts_start(void) } if (ble_hs_max_client_configs > 0) { -#ifdef ESP_PLATFORM ble_gatts_clt_cfg_mem = nimble_platform_mem_malloc( -#else - ble_gatts_clt_cfg_mem = malloc( -#endif OS_MEMPOOL_BYTES(ble_hs_max_client_configs, sizeof (struct ble_gatts_clt_cfg))); if (ble_gatts_clt_cfg_mem == NULL) { @@ -1240,11 +1221,7 @@ ble_gatts_start(void) if (ble_hs_max_services > 0) { ble_gatts_svc_entries = -#ifdef ESP_PLATFORM nimble_platform_mem_malloc(ble_hs_max_services * sizeof *ble_gatts_svc_entries); -#else - malloc(ble_hs_max_services * sizeof *ble_gatts_svc_entries); -#endif if (ble_gatts_svc_entries == NULL) { rc = BLE_HS_ENOMEM; goto done; diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gatts_lcl.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gatts_lcl.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gatts_lcl.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gatts_lcl.c index 989eb5c27..a45f397bc 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_gatts_lcl.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_gatts_lcl.c @@ -19,9 +19,9 @@ #include #include -#include "nimble/nimble/host/include/host/ble_uuid.h" -#include "nimble/console/console.h" -#include "nimble/nimble/include/nimble/ble.h" +#include "host/ble_uuid.h" +#include "console/console.h" +#include "nimble/ble.h" #include "ble_hs_priv.h" static const ble_uuid_t *uuid_ccc = diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs.c similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs.c index 4a7087b15..d819e20df 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs.c @@ -20,15 +20,15 @@ #include #include #include -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/stats/stats.h" -#include "nimble/nimble/include/nimble/ble_hci_trans.h" +#include "sysinit/sysinit.h" +#include "syscfg/syscfg.h" +#include "stats/stats.h" +#include "nimble/ble_hci_trans.h" #include "ble_hs_priv.h" #include "ble_monitor_priv.h" -#include "nimble/nimble/include/nimble/nimble_npl.h" +#include "nimble/nimble_npl.h" #ifndef MYNEWT -#include "nimble/porting/nimble/include/nimble/nimble_port.h" +#include "nimble/nimble_port.h" #endif #define BLE_HS_HCI_EVT_COUNT \ @@ -86,10 +86,8 @@ uint16_t ble_hs_max_services; uint16_t ble_hs_max_client_configs; #if MYNEWT_VAL(BLE_HS_DEBUG) -#ifdef ESP_PLATFORM static uint8_t ble_hs_mutex_locked; static TaskHandle_t ble_hs_task_handle; -#endif static uint8_t ble_hs_dbg_mutex_locked; #endif @@ -133,10 +131,8 @@ ble_hs_locked_by_cur_task(void) owner = ble_hs_mutex.mu.mu_owner; return owner != NULL && owner == os_sched_get_current_task(); -#elif ESP_PLATFORM - return (ble_hs_mutex_locked && ble_hs_task_handle == xTaskGetCurrentTaskHandle()); #else - return 1; + return (ble_hs_mutex_locked && ble_hs_task_handle == xTaskGetCurrentTaskHandle()); #endif } #endif @@ -168,7 +164,7 @@ ble_hs_lock_nested(void) rc = ble_npl_mutex_pend(&ble_hs_mutex, 0xffffffff); -#if MYNEWT_VAL(BLE_HS_DEBUG) && defined(ESP_PLATFORM) +#if MYNEWT_VAL(BLE_HS_DEBUG) ble_hs_mutex_locked = 1; ble_hs_task_handle = xTaskGetCurrentTaskHandle(); #endif @@ -188,12 +184,10 @@ ble_hs_unlock_nested(void) ble_hs_dbg_mutex_locked = 0; return; } -#ifdef ESP_PLATFORM if(ble_hs_task_handle == xTaskGetCurrentTaskHandle()) { ble_hs_task_handle = NULL; ble_hs_mutex_locked = 0; } -#endif #endif rc = ble_npl_mutex_release(&ble_hs_mutex); diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_adv.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_adv.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_adv.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_adv.c index 1fe183977..1d938b958 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_adv.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_adv.c @@ -19,8 +19,8 @@ #include #include -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/host/include/host/ble_hs_adv.h" +#include "nimble/ble.h" +#include "host/ble_hs_adv.h" #include "ble_hs_priv.h" struct find_field_data { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_utils.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_adv_priv.h similarity index 58% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_utils.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_adv_priv.h index 248309009..5c8a6ecc9 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_utils.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_adv_priv.h @@ -17,13 +17,20 @@ * under the License. */ -#include +#ifndef H_BLE_HS_ADV_PRIV_ +#define H_BLE_HS_ADV_PRIV_ -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); +#ifdef __cplusplus +extern "C" { +#endif + +int ble_hs_adv_set_flat(uint8_t type, int data_len, const void *data, + uint8_t *dst, uint8_t *dst_len, uint8_t max_len); +int ble_hs_adv_find_field(uint8_t type, const uint8_t *data, uint8_t length, + const struct ble_hs_adv_field **out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_atomic.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_atomic.c similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_atomic.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_atomic.c diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_atomic_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_atomic_priv.h new file mode 100644 index 000000000..9f7d8d16b --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_atomic_priv.h @@ -0,0 +1,41 @@ +/* + * 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_HS_ATOMIC_ +#define H_BLE_HS_ATOMIC_ + +#include "ble_hs_conn_priv.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int ble_hs_atomic_conn_delete(uint16_t conn_handle); +void ble_hs_atomic_conn_insert(struct ble_hs_conn *conn); +int ble_hs_atomic_conn_flags(uint16_t conn_handle, + ble_hs_conn_flags_t *out_flags); +int ble_hs_atomic_conn_set_flags(uint16_t conn_handle, + ble_hs_conn_flags_t flags, int on); +uint16_t ble_hs_atomic_first_conn_handle(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_cfg.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_cfg.c similarity index 92% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_cfg.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_cfg.c index 0569ccee8..a46a604ac 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_cfg.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_cfg.c @@ -17,8 +17,8 @@ * under the License. */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/nimble/host/include/host/ble_hs.h" +#include "syscfg/syscfg.h" +#include "host/ble_hs.h" struct ble_hs_cfg ble_hs_cfg = { /** Security manager settings. */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_conn.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_conn.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_conn.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_conn.c index 1625e7305..31830c98a 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_conn.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_conn.c @@ -19,9 +19,9 @@ #include #include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/nimble/host/include/host/ble_hs_id.h" +#include "syscfg/syscfg.h" +#include "os/os.h" +#include "host/ble_hs_id.h" #include "ble_hs_priv.h" #include "ble_hs_resolv_priv.h" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_conn_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_conn_priv.h new file mode 100644 index 000000000..0e451194d --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_conn_priv.h @@ -0,0 +1,148 @@ +/* + * 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_HS_CONN_ +#define H_BLE_HS_CONN_ + +#include +#include "ble_l2cap_priv.h" +#include "ble_gatt_priv.h" +#include "ble_att_priv.h" +#ifdef __cplusplus +extern "C" { +#endif + +struct hci_le_conn_complete; +struct hci_create_conn; +struct ble_l2cap_chan; + +typedef uint8_t ble_hs_conn_flags_t; + +#define BLE_HS_CONN_F_MASTER 0x01 +#define BLE_HS_CONN_F_TERMINATING 0x02 +#define BLE_HS_CONN_F_TX_FRAG 0x04 /* Cur ACL packet partially txed. */ + +#if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) +#define BLE_HS_CONN_L2CAP_COC_CID_MASK_LEN_REM \ + ((MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) % (8 * sizeof(uint32_t))) ? 1 : 0) + +#define BLE_HS_CONN_L2CAP_COC_CID_MASK_LEN \ + (MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) / (8 * sizeof(uint32_t)) + \ + BLE_HS_CONN_L2CAP_COC_CID_MASK_LEN_REM) +#endif + +struct ble_hs_conn { + SLIST_ENTRY(ble_hs_conn) bhc_next; + uint16_t bhc_handle; + uint8_t bhc_our_addr_type; +#if MYNEWT_VAL(BLE_EXT_ADV) + uint8_t bhc_our_rnd_addr[6]; +#endif + ble_addr_t bhc_peer_addr; + ble_addr_t bhc_our_rpa_addr; + ble_addr_t bhc_peer_rpa_addr; + + uint16_t bhc_itvl; + uint16_t bhc_latency; + uint16_t bhc_supervision_timeout; + uint8_t bhc_master_clock_accuracy; + + uint32_t supported_feat; + + ble_hs_conn_flags_t bhc_flags; + + struct ble_l2cap_chan_list bhc_channels; + struct ble_l2cap_chan *bhc_rx_chan; /* Channel rxing current packet. */ + ble_npl_time_t bhc_rx_timeout; +#if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) + uint32_t l2cap_coc_cid_mask[BLE_HS_CONN_L2CAP_COC_CID_MASK_LEN]; +#endif + + /** + * Count of packets sent over this connection that the controller has not + * transmitted or flushed yet. + */ + uint16_t bhc_outstanding_pkts; + +#if MYNEWT_VAL(BLE_HS_FLOW_CTRL) + /** + * Count of packets received over this connection that have been processed + * and freed. + */ + uint16_t bhc_completed_pkts; +#endif + + /** Queue of outgoing packets that could not be sent. */ + STAILQ_HEAD(, os_mbuf_pkthdr) bhc_tx_q; + + struct ble_att_svr_conn bhc_att_svr; + struct ble_gatts_conn bhc_gatt_svr; + + struct ble_gap_sec_state bhc_sec_state; + + ble_gap_event_fn *bhc_cb; + void *bhc_cb_arg; + +#if MYNEWT_VAL(BLE_PERIODIC_ADV) + struct ble_hs_periodic_sync *psync; +#endif +}; + +struct ble_hs_conn_addrs { + ble_addr_t our_id_addr; + ble_addr_t peer_id_addr; + ble_addr_t our_ota_addr; + ble_addr_t peer_ota_addr; +}; + +int ble_hs_conn_can_alloc(void); +struct ble_hs_conn *ble_hs_conn_alloc(uint16_t conn_handle); +void ble_hs_conn_free(struct ble_hs_conn *conn); +void ble_hs_conn_insert(struct ble_hs_conn *conn); +void ble_hs_conn_remove(struct ble_hs_conn *conn); +struct ble_hs_conn *ble_hs_conn_find(uint16_t conn_handle); +struct ble_hs_conn *ble_hs_conn_find_assert(uint16_t conn_handle); +struct ble_hs_conn *ble_hs_conn_find_by_addr(const ble_addr_t *addr); +struct ble_hs_conn *ble_hs_conn_find_by_idx(int idx); +int ble_hs_conn_exists(uint16_t conn_handle); +struct ble_hs_conn *ble_hs_conn_first(void); +struct ble_l2cap_chan *ble_hs_conn_chan_find_by_scid(struct ble_hs_conn *conn, + uint16_t cid); +struct ble_l2cap_chan *ble_hs_conn_chan_find_by_dcid(struct ble_hs_conn *conn, + uint16_t cid); +bool ble_hs_conn_chan_exist(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan); +int ble_hs_conn_chan_insert(struct ble_hs_conn *conn, + struct ble_l2cap_chan *chan); +void ble_hs_conn_delete_chan(struct ble_hs_conn *conn, + struct ble_l2cap_chan *chan); + +void ble_hs_conn_addrs(const struct ble_hs_conn *conn, + struct ble_hs_conn_addrs *addrs); +int32_t ble_hs_conn_timer(void); + +typedef int ble_hs_conn_foreach_fn(struct ble_hs_conn *conn, void *arg); +void ble_hs_conn_foreach(ble_hs_conn_foreach_fn *cb, void *arg); + +int ble_hs_conn_init(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_flow.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_flow.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_flow.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_flow.c index e74f5da36..2520c8541 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_flow.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_flow.c @@ -17,8 +17,8 @@ * under the License. */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/nimble/include/nimble/ble_hci_trans.h" +#include "syscfg/syscfg.h" +#include "nimble/ble_hci_trans.h" #include "ble_hs_priv.h" #if MYNEWT_VAL(BLE_HS_FLOW_CTRL) diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/ram/include/transport/ram/ble_hci_ram.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_flow_priv.h similarity index 80% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/ram/include/transport/ram/ble_hci_ram.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_flow_priv.h index 00530798d..753eaf8ff 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/ram/include/transport/ram/ble_hci_ram.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_flow_priv.h @@ -17,16 +17,17 @@ * under the License. */ -#ifndef H_BLE_HCI_RAM_ -#define H_BLE_HCI_RAM_ - -#include "nimble/nimble/include/nimble/ble_hci_trans.h" +#ifndef H_BLE_HS_FLOW_PRIV_ +#define H_BLE_HS_FLOW_PRIV_ +#include #ifdef __cplusplus extern "C" { #endif -void ble_hci_ram_init(void); +void ble_hs_flow_connection_broken(uint16_t conn_handle); +void ble_hs_flow_track_data_mbuf(struct os_mbuf *om); +int ble_hs_flow_startup(void); #ifdef __cplusplus } diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_hci.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_hci.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci.c index 214fc8214..3cfed27e2 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_hci.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci.c @@ -20,10 +20,10 @@ #include #include #include -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/porting/nimble/include/mem/mem.h" -#include "nimble/nimble/include/nimble/ble_hci_trans.h" -#include "nimble/nimble/host/include/host/ble_monitor.h" +#include "os/os.h" +#include "mem/mem.h" +#include "nimble/ble_hci_trans.h" +#include "host/ble_monitor.h" #include "ble_hs_priv.h" #include "ble_monitor_priv.h" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_hci_cmd.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci_cmd.c similarity index 79% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_hci_cmd.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci_cmd.c index 63242ca88..7aa9e4e74 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_hci_cmd.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci_cmd.c @@ -21,13 +21,24 @@ #include #include #include -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/nimble/include/nimble/hci_common.h" -#include "nimble/nimble/include/nimble/ble_hci_trans.h" -#include "nimble/nimble/host/include/host/ble_monitor.h" +#include "os/os.h" +#include "nimble/hci_common.h" +#include "nimble/ble_hci_trans.h" +#include "host/ble_monitor.h" #include "ble_hs_priv.h" #include "ble_monitor_priv.h" +/* + * HCI Command Header + * + * Comprises the following fields + * -> Opcode group field & Opcode command field (2) + * -> Parameter Length (1) + * Length of all the parameters (does not include any part of the hci + * command header + */ +#define BLE_HCI_CMD_HDR_LEN (3) + static int ble_hs_hci_cmd_transport(struct ble_hci_cmd *cmd) { @@ -51,18 +62,6 @@ ble_hs_hci_cmd_transport(struct ble_hci_cmd *cmd) } } -#ifdef ESP_PLATFORM -/* - * HCI Command Header - * - * Comprises the following fields - * -> Opcode group field & Opcode command field (2) - * -> Parameter Length (1) - * Length of all the parameters (does not include any part of the hci - * command header - */ -#define BLE_HCI_CMD_HDR_LEN (3) - static int ble_hs_hci_cmd_send(uint16_t opcode, uint8_t len, const void *cmddata) { @@ -99,34 +98,6 @@ ble_hs_hci_cmd_send(uint16_t opcode, uint8_t len, const void *cmddata) return rc; } -#else -static int -ble_hs_hci_cmd_send(uint16_t opcode, uint8_t len, const void *cmddata) -{ - struct ble_hci_cmd *cmd; - int rc; - - cmd = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_CMD); - BLE_HS_DBG_ASSERT(cmd != NULL); - - cmd->opcode = htole16(opcode); - cmd->length = len; - if (len != 0) { - memcpy(cmd->data, cmddata, len); - } - - rc = ble_hs_hci_cmd_transport(cmd); - - if (rc == 0) { - STATS_INC(ble_hs_stats, hci_cmd); - } else { - BLE_HS_LOG(DEBUG, "ble_hs_hci_cmd_send failure; rc=%d\n", rc); - } - - return rc; -} -#endif - int ble_hs_hci_cmd_send_buf(uint16_t opcode, const void *buf, uint8_t buf_len) { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_hci_evt.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci_evt.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_hci_evt.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci_evt.c index 9b97f433b..4a6b0716e 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_hci_evt.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci_evt.c @@ -20,11 +20,11 @@ #include #include #include -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/nimble/include/nimble/hci_common.h" -#include "nimble/nimble/include/nimble/ble_hci_trans.h" -#include "nimble/nimble/host/include/host/ble_gap.h" -#include "nimble/nimble/host/include/host/ble_monitor.h" +#include "os/os.h" +#include "nimble/hci_common.h" +#include "nimble/ble_hci_trans.h" +#include "host/ble_gap.h" +#include "host/ble_monitor.h" #include "ble_hs_priv.h" #include "ble_hs_resolv_priv.h" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci_priv.h new file mode 100644 index 000000000..362f12cbd --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci_priv.h @@ -0,0 +1,124 @@ +/* + * 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_HS_HCI_PRIV_ +#define H_BLE_HS_HCI_PRIV_ + +#include "nimble/hci_common.h" +#ifdef __cplusplus +extern "C" { +#endif + +struct ble_hs_conn; +struct os_mbuf; + +#define BLE_HS_HCI_LE_FEAT_ENCRYPTION (0x00000001) +#define BLE_HS_HCI_LE_FEAT_CONN_PARAM_REQUEST (0x00000002) +#define BLE_HS_HCI_LE_FEAT_EXT_REJECT (0x00000004) +#define BLE_HS_HCI_LE_FEAT_SLAVE_FEAT_EXCHANGE (0x00000008) +#define BLE_HS_HCI_LE_FEAT_PING (0x00000010) +#define BLE_HS_HCI_LE_FEAT_DATA_PACKET_LENGTH_EXT (0x00000020) +#define BLE_HS_HCI_LE_FEAT_LL_PRIVACY (0x00000040) +#define BLE_HS_HCI_LE_FEAT_EXT_SCANNER_FILTER_POLICIES (0x00000080) +#define BLE_HS_HCI_LE_FEAT_2M_PHY (0x00000100) +#define BLE_HS_HCI_LE_FEAT_STABLE_MOD_INDEX_TX (0x00000200) +#define BLE_HS_HCI_LE_FEAT_STABLE_MOD_INDEX_RX (0x00000400) +#define BLE_HS_HCI_LE_FEAT_CODED_PHY (0x00000800) +#define BLE_HS_HCI_LE_FEAT_EXT_ADV (0x00001000) +#define BLE_HS_HCI_LE_FEAT_PERIODIC_ADV (0x00002000) +#define BLE_HS_HCI_LE_FEAT_CSA2 (0x00004000) +#define BLE_HS_HCI_LE_FEAT_POWER_CLASS_1 (0x00008000) +#define BLE_HS_HCI_LE_FEAT_MIN_NUM_USED_CHAN (0x00010000) + +struct ble_hs_hci_ack { + int bha_status; /* A BLE_HS_E<...> error; NOT a naked HCI code. */ + const uint8_t *bha_params; + int bha_params_len; + uint16_t bha_opcode; + uint8_t bha_hci_handle; +}; + +#if MYNEWT_VAL(BLE_EXT_ADV) +struct ble_hs_hci_ext_scan_param { + uint8_t scan_type; + uint16_t scan_itvl; + uint16_t scan_window; +}; + +struct ble_hs_hci_ext_conn_params { + uint16_t scan_itvl; + uint16_t scan_window; + uint16_t conn_itvl; + uint16_t conn_windows; +}; + +#if MYNEWT_VAL(BLE_PERIODIC_ADV) +/* Periodic Advertising Parameters */ +struct hci_periodic_adv_params +{ + uint16_t min_interval; + uint16_t max_interval; + uint16_t properties; +}; +#endif +#endif + +extern uint16_t ble_hs_hci_avail_pkts; + +int ble_hs_hci_cmd_tx(uint16_t opcode, const void *cmd, uint8_t cmd_len, + void *rsp, uint8_t rsp_len); +void ble_hs_hci_init(void); +void ble_hs_hci_deinit(void); + +void ble_hs_hci_set_le_supported_feat(uint32_t feat); +uint32_t ble_hs_hci_get_le_supported_feat(void); +void ble_hs_hci_set_hci_version(uint8_t hci_version); +uint8_t ble_hs_hci_get_hci_version(void); + +#if MYNEWT_VAL(BLE_HS_PHONY_HCI_ACKS) +typedef int ble_hs_hci_phony_ack_fn(uint8_t *ack, int ack_buf_len); +void ble_hs_hci_set_phony_ack_cb(ble_hs_hci_phony_ack_fn *cb); +#endif + +int ble_hs_hci_util_read_adv_tx_pwr(int8_t *out_pwr); +int ble_hs_hci_util_rand(void *dst, int len); +int ble_hs_hci_util_read_rssi(uint16_t conn_handle, int8_t *out_rssi); +int ble_hs_hci_util_set_random_addr(const uint8_t *addr); +int ble_hs_hci_util_data_hdr_strip(struct os_mbuf *om, + struct hci_data_hdr *out_hdr); +int ble_hs_hci_evt_process(const struct ble_hci_ev *ev); + +int ble_hs_hci_cmd_send_buf(uint16_t opcode, const void *buf, uint8_t buf_len); +int ble_hs_hci_set_buf_sz(uint16_t pktlen, uint16_t max_pkts); +void ble_hs_hci_add_avail_pkts(uint16_t delta); + +uint16_t ble_hs_hci_util_handle_pb_bc_join(uint16_t handle, uint8_t pb, + uint8_t bc); + +int ble_hs_hci_acl_tx_now(struct ble_hs_conn *conn, struct os_mbuf **om); +int ble_hs_hci_acl_tx(struct ble_hs_conn *conn, struct os_mbuf **om); + +int ble_hs_hci_frag_num_mbufs(void); +int ble_hs_hci_frag_num_mbufs_free(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_hci_util.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci_util.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_hci_util.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci_util.c index 1f63acc94..996e0fc10 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_hci_util.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_hci_util.c @@ -18,8 +18,8 @@ */ #include -#include "nimble/nimble/include/nimble/hci_common.h" -#include "nimble/nimble/host/include/host/ble_hs_hci.h" +#include "nimble/hci_common.h" +#include "host/ble_hs_hci.h" #include "ble_hs_priv.h" uint16_t diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_id.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_id.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_id.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_id.c index 83ee49393..e30a3a1bc 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_id.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_id.c @@ -18,7 +18,7 @@ */ #include -#include "nimble/nimble/host/include/host/ble_hs_id.h" +#include "host/ble_hs_id.h" #include "ble_hs_priv.h" #include "ble_hs_resolv_priv.h" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_id_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_id_priv.h new file mode 100644 index 000000000..85260ec48 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_id_priv.h @@ -0,0 +1,45 @@ +/* + * 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_HS_ID_PRIV_ +#define H_BLE_HS_ID_PRIV_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void ble_hs_id_set_pub(const uint8_t *pub_addr); +int ble_hs_id_addr(uint8_t id_addr_type, const uint8_t **out_id_addr, + int *out_is_nrpa); +int ble_hs_id_use_addr(uint8_t addr_type); +void ble_hs_id_reset(void); +void ble_hs_id_rnd_reset(void); + +#if MYNEWT_VAL(BLE_HOST_BASED_PRIVACY) +bool ble_hs_is_rpa(uint8_t *addr, uint8_t addr_type); +int ble_hs_id_set_pseudo_rnd(const uint8_t *); +int ble_hs_id_set_nrpa_rnd(void); +#endif +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_log.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_log.c similarity index 92% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_log.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_log.c index b4d496703..7ec69469e 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_log.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_log.c @@ -17,8 +17,8 @@ * under the License. */ -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/nimble/host/include/host/ble_hs.h" +#include "os/os.h" +#include "host/ble_hs.h" struct log ble_hs_log; diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_mbuf.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_mbuf.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_mbuf.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_mbuf.c index 680fbe38a..ea660c633 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_mbuf.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_mbuf.c @@ -17,7 +17,7 @@ * under the License. */ -#include "nimble/nimble/host/include/host/ble_hs.h" +#include "host/ble_hs.h" #include "ble_hs_priv.h" /** diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_mbuf_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_mbuf_priv.h new file mode 100644 index 000000000..8923678a3 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_mbuf_priv.h @@ -0,0 +1,38 @@ +/* + * 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_HS_MBUF_PRIV_ +#define H_BLE_HS_MBUF_PRIV_ + +#ifdef __cplusplus +extern "C" { +#endif + +struct os_mbuf; + +struct os_mbuf *ble_hs_mbuf_bare_pkt(void); +struct os_mbuf *ble_hs_mbuf_acl_pkt(void); +struct os_mbuf *ble_hs_mbuf_l2cap_pkt(void); +int ble_hs_mbuf_pullup_base(struct os_mbuf **om, int base_len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_misc.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_misc.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_misc.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_misc.c index b9567f382..dfb46b741 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_misc.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_misc.c @@ -19,7 +19,7 @@ #include #include -#include "nimble/porting/nimble/include/os/os.h" +#include "os/os.h" #include "ble_hs_priv.h" const uint8_t ble_hs_misc_null_addr[6]; diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_mqueue.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_mqueue.c similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_mqueue.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_mqueue.c diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_periodic_sync.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_periodic_sync.c similarity index 95% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_periodic_sync.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_periodic_sync.c index 05a928201..dad535138 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_periodic_sync.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_periodic_sync.c @@ -19,9 +19,9 @@ #include #include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/nimble/host/include/host/ble_hs_id.h" +#include "syscfg/syscfg.h" +#include "os/os.h" +#include "host/ble_hs_id.h" #include "ble_hs_priv.h" #if MYNEWT_VAL(BLE_PERIODIC_ADV) diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_periodic_sync_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_periodic_sync_priv.h new file mode 100644 index 000000000..c82ea7904 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_periodic_sync_priv.h @@ -0,0 +1,55 @@ +/* + * 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_HS_PERIODIC_SYNC_ +#define H_BLE_HS_PERIODIC_SYNC_ + +#include +#include "os/queue.h" +#ifdef __cplusplus +extern "C" { +#endif + +struct ble_hs_periodic_sync { + SLIST_ENTRY(ble_hs_periodic_sync) next; + uint16_t sync_handle; + ble_addr_t advertiser_addr; + uint8_t adv_sid; + + ble_gap_event_fn *cb; + void *cb_arg; + + struct ble_npl_event lost_ev; +}; + +struct ble_hs_periodic_sync *ble_hs_periodic_sync_alloc(void); +void ble_hs_periodic_sync_free(struct ble_hs_periodic_sync *psync); +void ble_hs_periodic_sync_insert(struct ble_hs_periodic_sync *psync); +void ble_hs_periodic_sync_remove(struct ble_hs_periodic_sync *psync); +struct ble_hs_periodic_sync *ble_hs_periodic_sync_find_by_handle(uint16_t sync_handle); +struct ble_hs_periodic_sync *ble_hs_periodic_sync_find(const ble_addr_t *addr, + uint8_t sid); +struct ble_hs_periodic_sync *ble_hs_periodic_sync_first(void); +int ble_hs_periodic_sync_init(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_priv.h new file mode 100644 index 000000000..538d07a97 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_priv.h @@ -0,0 +1,157 @@ +/* + * 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_HS_PRIV_ +#define H_BLE_HS_PRIV_ + +#include +#include +#include "ble_att_cmd_priv.h" +#include "ble_att_priv.h" +#include "ble_gap_priv.h" +#include "ble_gatt_priv.h" +#include "ble_hs_hci_priv.h" +#include "ble_hs_atomic_priv.h" +#include "ble_hs_conn_priv.h" +#include "ble_hs_atomic_priv.h" +#include "ble_hs_mbuf_priv.h" +#include "ble_hs_startup_priv.h" +#include "ble_l2cap_priv.h" +#include "ble_l2cap_sig_priv.h" +#include "ble_l2cap_coc_priv.h" +#include "ble_sm_priv.h" +#include "ble_hs_adv_priv.h" +#include "ble_hs_flow_priv.h" +#include "ble_hs_pvcy_priv.h" +#include "ble_hs_id_priv.h" +#include "ble_hs_periodic_sync_priv.h" +#include "ble_uuid_priv.h" +#include "host/ble_hs.h" +#include "host/ble_monitor.h" +#include "nimble/nimble_opt.h" +#include "stats/stats.h" +#ifdef __cplusplus +extern "C" { +#endif + +struct ble_hs_conn; +struct ble_l2cap_chan; +struct os_mbuf; +struct os_mempool; +struct os_event; + +#define BLE_HS_SYNC_STATE_BAD 0 +#define BLE_HS_SYNC_STATE_BRINGUP 1 +#define BLE_HS_SYNC_STATE_GOOD 2 + +#define BLE_HS_ENABLED_STATE_OFF 0 +#define BLE_HS_ENABLED_STATE_STOPPING 1 +#define BLE_HS_ENABLED_STATE_ON 2 + +#if NIMBLE_BLE_CONNECT +#define BLE_HS_MAX_CONNECTIONS MYNEWT_VAL(BLE_MAX_CONNECTIONS) +#else +#define BLE_HS_MAX_CONNECTIONS 0 +#endif + +#if !MYNEWT_VAL(BLE_ATT_SVR_QUEUED_WRITE) +#define BLE_HS_ATT_SVR_QUEUED_WRITE_TMO 0 +#else +#define BLE_HS_ATT_SVR_QUEUED_WRITE_TMO \ + MYNEWT_VAL(BLE_ATT_SVR_QUEUED_WRITE_TMO) +#endif + +STATS_SECT_START(ble_hs_stats) + STATS_SECT_ENTRY(conn_create) + STATS_SECT_ENTRY(conn_delete) + STATS_SECT_ENTRY(hci_cmd) + STATS_SECT_ENTRY(hci_event) + STATS_SECT_ENTRY(hci_invalid_ack) + STATS_SECT_ENTRY(hci_unknown_event) + STATS_SECT_ENTRY(hci_timeout) + STATS_SECT_ENTRY(reset) + STATS_SECT_ENTRY(sync) + STATS_SECT_ENTRY(pvcy_add_entry) + STATS_SECT_ENTRY(pvcy_add_entry_fail) +STATS_SECT_END +extern STATS_SECT_DECL(ble_hs_stats) ble_hs_stats; + +extern struct os_mbuf_pool ble_hs_mbuf_pool; +extern uint8_t ble_hs_sync_state; +extern uint8_t ble_hs_enabled_state; + +extern const uint8_t ble_hs_misc_null_addr[6]; + +extern uint16_t ble_hs_max_attrs; +extern uint16_t ble_hs_max_services; +extern uint16_t ble_hs_max_client_configs; + +void ble_hs_process_rx_data_queue(void); +int ble_hs_tx_data(struct os_mbuf *om); +void ble_hs_wakeup_tx(void); +void ble_hs_enqueue_hci_event(uint8_t *hci_evt); +void ble_hs_event_enqueue(struct os_event *ev); + +int ble_hs_hci_rx_evt(uint8_t *hci_ev, void *arg); +int ble_hs_hci_evt_acl_process(struct os_mbuf *om); + +int ble_hs_misc_conn_chan_find(uint16_t conn_handle, uint16_t cid, + struct ble_hs_conn **out_conn, + struct ble_l2cap_chan **out_chan); +int ble_hs_misc_conn_chan_find_reqd(uint16_t conn_handle, uint16_t cid, + struct ble_hs_conn **out_conn, + struct ble_l2cap_chan **out_chan); +uint8_t ble_hs_misc_own_addr_type_to_id(uint8_t addr_type); +uint8_t ble_hs_misc_peer_addr_type_to_id(uint8_t addr_type); +int ble_hs_misc_restore_irks(void); + +int ble_hs_locked_by_cur_task(void); +int ble_hs_is_parent_task(void); +void ble_hs_lock_nested(void); +void ble_hs_unlock_nested(void); +void ble_hs_lock(void); +void ble_hs_unlock(void); +void ble_hs_hw_error(uint8_t hw_code); +void ble_hs_timer_resched(void); +void ble_hs_notifications_sched(void); +struct ble_npl_eventq *ble_hs_evq_get(void); +void ble_hs_stop_init(void); + +struct ble_mqueue { + STAILQ_HEAD(, os_mbuf_pkthdr) head; + struct ble_npl_event ev; +}; + +int ble_mqueue_init(struct ble_mqueue *mq, ble_npl_event_fn *ev_fn, void *ev_arg); +struct os_mbuf *ble_mqueue_get(struct ble_mqueue *mq); +int ble_mqueue_put(struct ble_mqueue *mq, struct ble_npl_eventq *evq, struct os_mbuf *om); + +#if MYNEWT_VAL(BLE_HS_DEBUG) + #define BLE_HS_DBG_ASSERT(x) assert(x) + #define BLE_HS_DBG_ASSERT_EVAL(x) assert(x) +#else + #define BLE_HS_DBG_ASSERT(x) + #define BLE_HS_DBG_ASSERT_EVAL(x) ((void)(x)) +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_pvcy.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_pvcy.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_pvcy.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_pvcy.c index 2d7db0bcc..9e92c660f 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_pvcy.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_pvcy.c @@ -19,10 +19,10 @@ #include #include #include -#include "nimble/porting/nimble/include/stats/stats.h" +#include "stats/stats.h" #include "ble_hs_priv.h" #include "ble_hs_resolv_priv.h" -#include "nimble/nimble/host/include/host/ble_hs_pvcy.h" +#include "host/ble_hs_pvcy.h" static uint8_t ble_hs_pvcy_started; static uint8_t ble_hs_pvcy_irk[16]; diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_pvcy_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_pvcy_priv.h new file mode 100644 index 000000000..86157da0f --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_pvcy_priv.h @@ -0,0 +1,46 @@ +/* + * 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_HS_PVCY_PRIV_ +#define H_BLE_HS_PVCY_PRIV_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern const uint8_t ble_hs_pvcy_default_irk[16]; + +int ble_hs_pvcy_set_our_irk(const uint8_t *irk); +int ble_hs_pvcy_our_irk(const uint8_t **out_irk); +int ble_hs_pvcy_remove_entry(uint8_t addr_type, const uint8_t *addr); +int ble_hs_pvcy_add_entry(const uint8_t *addr, uint8_t addrtype, + const uint8_t *irk); +int ble_hs_pvcy_ensure_started(void); +int ble_hs_pvcy_set_mode(const ble_addr_t *addr, uint8_t priv_mode); +#if MYNEWT_VAL(BLE_HOST_BASED_PRIVACY) +bool ble_hs_pvcy_enabled(void); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_resolv.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_resolv.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_resolv.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_resolv.c index 7ae9ef12b..6add1018b 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_resolv.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_resolv.c @@ -19,17 +19,17 @@ * under the License. */ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" +#include "syscfg/syscfg.h" #if MYNEWT_VAL(BLE_HOST_BASED_PRIVACY) #include #include #include "ble_hs_priv.h" -#include "../include/host/ble_hs_id.h" -#include "../../include/nimble/ble.h" -#include "../../include/nimble/nimble_opt.h" +#include "host/ble_hs_id.h" +#include "nimble/ble.h" +#include "nimble/nimble_opt.h" #include "ble_hs_resolv_priv.h" -#include "../store/config/include/store/config/ble_store_config.h" +#include "store/config/ble_store_config.h" #include "../store/config/src/ble_store_config_priv.h" /* Resolve list size, additional space to save local device's configuration */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_resolv_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_resolv_priv.h new file mode 100644 index 000000000..7bc8a2fe6 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_resolv_priv.h @@ -0,0 +1,111 @@ +/* + * Copyright 2020 Espressif Systems (Shanghai) PTE LTD + * + * 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. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#if MYNEWT_VAL(BLE_HOST_BASED_PRIVACY) +/* + * An entry in the resolving list. + */ +struct ble_hs_resolv_entry { + uint8_t rl_addr_type; + uint8_t rl_local_irk[16]; + uint8_t rl_peer_irk[16]; + uint8_t rl_identity_addr[BLE_DEV_ADDR_LEN]; + uint8_t rl_pseudo_id[BLE_DEV_ADDR_LEN]; + uint8_t rl_local_rpa[BLE_DEV_ADDR_LEN]; + uint8_t rl_peer_rpa[BLE_DEV_ADDR_LEN]; +}; + +#if MYNEWT_VAL(BLE_STORE_CONFIG_PERSIST) +/* Persist peer records in NVS. XXX Need to handle this in `store` module */ +int ble_store_persist_peer_records(void); +#endif + +struct ble_hs_peer_sec { + ble_addr_t peer_addr; + uint8_t irk[16]; + uint8_t irk_present: 1; +}; +/* + * BLE host peer device record, this helps in storing peer RPA before bond is + * created and IRKs are exchanged. + */ +struct ble_hs_dev_records { + bool rec_used; + uint8_t rand_addr_type; + uint8_t pseudo_addr[BLE_DEV_ADDR_LEN]; + uint8_t rand_addr[BLE_DEV_ADDR_LEN]; + uint8_t identity_addr[BLE_DEV_ADDR_LEN]; + struct ble_hs_peer_sec peer_sec; +}; + +/* Add a device to the resolving list */ +int ble_hs_resolv_list_add(uint8_t *cmdbuf); +int ble_hs_gen_own_private_rnd(void); +uint8_t *ble_hs_get_rpa_local(void); + +/* Remove a device from the resolving list */ +int ble_hs_resolv_list_rmv(uint8_t, uint8_t *); +/* Clear the resolving list and peer dev record */ +void ble_hs_resolv_list_clear_all(void); + +/* Address resolution enable command */ +void ble_hs_resolv_enable(bool); +void ble_hs_resolv_nrpa_enable(void); +void ble_hs_resolv_nrpa_disable(void); + +/* Finds 'addr' in resolving list. Doesnt check if address resolution enabled */ +struct ble_hs_resolv_entry * +ble_hs_resolv_list_find(uint8_t *addr); + +/* Returns true if host based RPA (privacy) is enabled */ +bool ble_host_rpa_enabled(void); + +/* Searches peer device records (RPA) and fetches matching RL, peer_address + * into input parameters if RL is found */ +void +ble_rpa_replace_peer_params_with_rl(uint8_t *, uint8_t *, struct ble_hs_resolv_entry **); + +int ble_rpa_resolv_add_peer_rec(uint8_t *); + +struct ble_hs_dev_records *ble_rpa_get_peer_dev_records(void); +int ble_rpa_get_num_peer_dev_records(void); +void ble_rpa_set_num_peer_dev_records(int); +int ble_rpa_remove_peer_dev_rec(struct ble_hs_dev_records *); +struct ble_hs_dev_records *ble_rpa_find_peer_dev_rec(uint8_t *); + +/* Set the resolvable private address timeout */ +int ble_hs_resolv_set_rpa_tmo(uint16_t); + +/* Resolve a resolvable private address */ +int ble_hs_resolv_rpa(uint8_t *rpa, uint8_t *irk); + +/* Initialize resolv*/ +void ble_hs_resolv_init(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_shutdown.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_shutdown.c similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_shutdown.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_shutdown.c index 9dacccbaf..f29d4a669 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_shutdown.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_shutdown.c @@ -19,7 +19,7 @@ #if MYNEWT -#include "nimble/porting/nimble/include/os/mynewt.h" +#include "os/mynewt.h" #include "ble_hs_priv.h" static struct ble_hs_stop_listener ble_hs_shutdown_stop_listener; diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_startup.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_startup.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_startup.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_startup.c index 2ec17a13b..83026ac18 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_startup.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_startup.c @@ -19,8 +19,8 @@ #include #include -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "nimble/nimble/host/include/host/ble_hs_hci.h" +#include "host/ble_hs.h" +#include "host/ble_hs_hci.h" #include "ble_hs_priv.h" #if !MYNEWT_VAL(BLE_CONTROLLER) diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_test.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_startup_priv.h similarity index 90% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_test.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_startup_priv.h index 32984c6b3..a2d328756 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_test.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_startup_priv.h @@ -17,16 +17,14 @@ * under the License. */ -#ifndef H_LL_TEST_ -#define H_LL_TEST_ - -#include +#ifndef H_BLE_HS_STARTUP_ +#define H_BLE_HS_STARTUP_ #ifdef __cplusplus extern "C" { #endif -int ble_ll_csa2_test_all(void); +int ble_hs_startup_go(void); #ifdef __cplusplus } diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_stop.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_stop.c similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_stop.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_stop.c index 92fae1263..b90d3ec6f 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_hs_stop.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_hs_stop.c @@ -18,12 +18,12 @@ */ #include -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "nimble/porting/nimble/include/syscfg/syscfg.h" +#include "sysinit/sysinit.h" +#include "syscfg/syscfg.h" #include "ble_hs_priv.h" -#include "nimble/nimble/include/nimble/nimble_npl.h" +#include "nimble/nimble_npl.h" #ifndef MYNEWT -#include "nimble/porting/nimble/include/nimble/nimble_port.h" +#include "nimble/nimble_port.h" #endif #define BLE_HOST_STOP_TIMEOUT_MS MYNEWT_VAL(BLE_HS_STOP_ON_SHUTDOWN_TIMEOUT) diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_ibeacon.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_ibeacon.c similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_ibeacon.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_ibeacon.c index 62c7bc1d1..0c6ef99d5 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_ibeacon.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_ibeacon.c @@ -18,7 +18,7 @@ */ #include -#include "nimble/nimble/host/include/host/ble_hs_adv.h" +#include "host/ble_hs_adv.h" #include "ble_hs_priv.h" #define BLE_IBEACON_MFG_DATA_SIZE 25 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap.c index a4b98a9e7..0d9f082d4 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap.c @@ -19,10 +19,10 @@ #include #include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/hci_common.h" +#include "syscfg/syscfg.h" +#include "os/os.h" +#include "nimble/ble.h" +#include "nimble/hci_common.h" #include "ble_hs_priv.h" #include "ble_l2cap_coc_priv.h" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_coc.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_coc.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_coc.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_coc.c index 5258da84d..41a831565 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_coc.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_coc.c @@ -19,7 +19,7 @@ #include #include -#include "nimble/nimble/include/nimble/ble.h" +#include "nimble/ble.h" #include "ble_hs_priv.h" #include "ble_l2cap_priv.h" #include "ble_l2cap_coc_priv.h" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_coc_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_coc_priv.h new file mode 100644 index 000000000..5ebdaa050 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_coc_priv.h @@ -0,0 +1,106 @@ +/* + * 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_L2CAP_COC_PRIV_ +#define H_L2CAP_COC_PRIV_ + +#include +#include "syscfg/syscfg.h" +#include "os/queue.h" +#include "os/os_mbuf.h" +#include "host/ble_l2cap.h" +#include "ble_l2cap_sig_priv.h" +#ifdef __cplusplus +extern "C" { +#endif + +#define BLE_L2CAP_COC_CID_START 0x0040 +#define BLE_L2CAP_COC_CID_END 0x007F + +struct ble_l2cap_chan; + +#define BLE_L2CAP_COC_FLAG_STALLED 0x01 + +struct ble_l2cap_coc_endpoint { + struct os_mbuf *sdu; + uint16_t mtu; + uint16_t credits; + uint16_t data_offset; + uint8_t flags; +}; + +struct ble_l2cap_coc_srv { + STAILQ_ENTRY(ble_l2cap_coc_srv) next; + uint16_t psm; + uint16_t mtu; + ble_l2cap_event_fn *cb; + void *cb_arg; +}; + +#if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) != 0 +int ble_l2cap_coc_init(void); +int ble_l2cap_coc_create_server(uint16_t psm, uint16_t mtu, + ble_l2cap_event_fn *cb, void *cb_arg); +int ble_l2cap_coc_create_srv_chan(struct ble_hs_conn *conn, uint16_t psm, + struct ble_l2cap_chan **chan); +struct ble_l2cap_chan * ble_l2cap_coc_chan_alloc(struct ble_hs_conn *conn, + uint16_t psm, uint16_t mtu, + struct os_mbuf *sdu_rx, + ble_l2cap_event_fn *cb, + void *cb_arg); +void ble_l2cap_coc_cleanup_chan(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan); +void ble_l2cap_coc_le_credits_update(uint16_t conn_handle, uint16_t dcid, + uint16_t credits); +int ble_l2cap_coc_recv_ready(struct ble_l2cap_chan *chan, + struct os_mbuf *sdu_rx); +int ble_l2cap_coc_send(struct ble_l2cap_chan *chan, struct os_mbuf *sdu_tx); +void ble_l2cap_coc_set_new_mtu_mps(struct ble_l2cap_chan *chan, uint16_t mtu, uint16_t mps); +#else +static inline int +ble_l2cap_coc_init(void) { + return 0; +} + +static inline int +ble_l2cap_coc_create_server(uint16_t psm, uint16_t mtu, + ble_l2cap_event_fn *cb, void *cb_arg) { + return BLE_HS_ENOTSUP; +} + +static inline int +ble_l2cap_coc_recv_ready(struct ble_l2cap_chan *chan, + struct os_mbuf *sdu_rx) { + return BLE_HS_ENOTSUP; +} + +static inline void +ble_l2cap_coc_cleanup_chan(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan) { +} + +static inline int +ble_l2cap_coc_send(struct ble_l2cap_chan *chan, struct os_mbuf *sdu_tx) { + return BLE_HS_ENOTSUP; +} +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* H_L2CAP_COC_PRIV_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_priv.h new file mode 100644 index 000000000..e3409743b --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_priv.h @@ -0,0 +1,144 @@ +/* + * 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_L2CAP_PRIV_ +#define H_L2CAP_PRIV_ + +#include "ble_l2cap_coc_priv.h" +#include "host/ble_l2cap.h" +#include +#include "stats/stats.h" +#include "os/queue.h" +#include "os/os_mbuf.h" +#ifdef __cplusplus +extern "C" { +#endif + +struct ble_hs_conn; +struct hci_data_hdr; + +STATS_SECT_START(ble_l2cap_stats) + STATS_SECT_ENTRY(chan_create) + STATS_SECT_ENTRY(chan_delete) + STATS_SECT_ENTRY(update_init) + STATS_SECT_ENTRY(update_rx) + STATS_SECT_ENTRY(update_fail) + STATS_SECT_ENTRY(proc_timeout) + STATS_SECT_ENTRY(sig_tx) + STATS_SECT_ENTRY(sig_rx) + STATS_SECT_ENTRY(sm_tx) + STATS_SECT_ENTRY(sm_rx) +STATS_SECT_END +extern STATS_SECT_DECL(ble_l2cap_stats) ble_l2cap_stats; + +extern struct os_mempool ble_l2cap_chan_pool; + +/* This is nimble specific; packets sent to the black hole CID do not elicit + * an "invalid CID" response. + */ +#define BLE_L2CAP_CID_BLACK_HOLE 0xffff + +#define BLE_L2CAP_HDR_SZ 4 + +typedef uint8_t ble_l2cap_chan_flags; + +typedef int ble_l2cap_rx_fn(struct ble_l2cap_chan *chan); + +struct ble_l2cap_chan { + SLIST_ENTRY(ble_l2cap_chan) next; + uint16_t conn_handle; + uint16_t dcid; + uint16_t scid; + + /* Unions just to avoid confusion on MPS/MTU. + * In CoC context, L2CAP MTU is MPS + */ + union { + uint16_t my_mtu; + uint16_t my_coc_mps; + }; + + union { + uint16_t peer_mtu; + uint16_t peer_coc_mps; + }; + + ble_l2cap_chan_flags flags; + + struct os_mbuf *rx_buf; + uint16_t rx_len; /* Length of current reassembled rx packet. */ + + ble_l2cap_rx_fn *rx_fn; + +#if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) != 0 + uint16_t psm; + struct ble_l2cap_coc_endpoint coc_rx; + struct ble_l2cap_coc_endpoint coc_tx; + uint16_t initial_credits; + ble_l2cap_event_fn *cb; + void *cb_arg; +#endif +}; + +struct ble_l2cap_hdr { + uint16_t len; + uint16_t cid; +}; + +typedef int ble_l2cap_tx_fn(struct ble_hs_conn *conn, + struct ble_l2cap_chan *chan); + +#define BLE_L2CAP_CHAN_F_TXED_MTU 0x01 /* We have sent our MTU. */ + +SLIST_HEAD(ble_l2cap_chan_list, ble_l2cap_chan); + +int ble_l2cap_parse_hdr(struct os_mbuf *om, int off, + struct ble_l2cap_hdr *l2cap_hdr); +struct os_mbuf *ble_l2cap_prepend_hdr(struct os_mbuf *om, uint16_t cid, + uint16_t len); + +struct ble_l2cap_chan *ble_l2cap_chan_alloc(uint16_t conn_handle); +void ble_l2cap_chan_free(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan); + +bool ble_l2cap_is_mtu_req_sent(const struct ble_l2cap_chan *chan); + +int ble_l2cap_rx(struct ble_hs_conn *conn, + struct hci_data_hdr *hci_hdr, + struct os_mbuf *om, + ble_l2cap_rx_fn **out_rx_cb, + int *out_reject_cid); +int ble_l2cap_tx(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan, + struct os_mbuf *txom); + +void ble_l2cap_remove_rx(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan); + +int ble_l2cap_init(void); + +/* Below experimental API is available when BLE_VERSION >= 52 */ +int ble_l2cap_enhanced_connect(uint16_t conn_handle, + uint16_t psm, uint16_t mtu, + uint8_t num, struct os_mbuf *sdu_rx[], + ble_l2cap_event_fn *cb, void *cb_arg); +int ble_l2cap_reconfig(struct ble_l2cap_chan *chans[], uint8_t num, uint16_t new_mtu); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_sig.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_sig.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_sig.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_sig.c index f9d32d0ac..58f96b0f3 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_sig.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_sig.c @@ -44,8 +44,8 @@ #include #include -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/host/include/host/ble_monitor.h" +#include "nimble/ble.h" +#include "host/ble_monitor.h" #include "ble_hs_priv.h" /***************************************************************************** diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_sig_cmd.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_sig_cmd.c similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_l2cap_sig_cmd.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_sig_cmd.c diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_sig_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_sig_priv.h new file mode 100644 index 000000000..a698cd0d8 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_l2cap_sig_priv.h @@ -0,0 +1,184 @@ +/* + * 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_L2CAP_SIG_ +#define H_BLE_L2CAP_SIG_ + +#include "syscfg/syscfg.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define BLE_L2CAP_SIG_MTU 100 /* This is our own default. */ + +#define BLE_L2CAP_SIG_HDR_SZ 4 +struct ble_l2cap_sig_hdr { + uint8_t op; + uint8_t identifier; + uint16_t length; + uint8_t data[0]; +} __attribute__((packed)); + +#define BLE_L2CAP_SIG_REJECT_MIN_SZ 2 +struct ble_l2cap_sig_reject { + uint16_t reason; + uint8_t data[0]; +} __attribute__((packed)); + +#define BLE_L2CAP_SIG_UPDATE_REQ_SZ 8 +struct ble_l2cap_sig_update_req { + uint16_t itvl_min; + uint16_t itvl_max; + uint16_t slave_latency; + uint16_t timeout_multiplier; +} __attribute__((packed)); + +#define BLE_L2CAP_SIG_UPDATE_RSP_SZ 2 +struct ble_l2cap_sig_update_rsp { + uint16_t result; +} __attribute__((packed)); + +#define BLE_L2CAP_SIG_UPDATE_RSP_RESULT_ACCEPT 0x0000 +#define BLE_L2CAP_SIG_UPDATE_RSP_RESULT_REJECT 0x0001 + +struct ble_l2cap_sig_le_con_req { + uint16_t psm; + uint16_t scid; + uint16_t mtu; + uint16_t mps; + uint16_t credits; +} __attribute__((packed)); + +struct ble_l2cap_sig_le_con_rsp { + uint16_t dcid; + uint16_t mtu; + uint16_t mps; + uint16_t credits; + uint16_t result; +} __attribute__((packed)); + +struct ble_l2cap_sig_credit_base_connect_req { + uint16_t psm; + uint16_t mtu; + uint16_t mps; + uint16_t credits; + uint16_t scids[0]; +} __attribute__((packed)); + +struct ble_l2cap_sig_credit_base_connect_rsp { + uint16_t mtu; + uint16_t mps; + uint16_t credits; + uint16_t result; + uint16_t dcids[0]; +} __attribute__((packed)); + +struct ble_l2cap_sig_credit_base_reconfig_req { + uint16_t mtu; + uint16_t mps; + uint16_t dcids[0]; +} __attribute__((packed)); + +struct ble_l2cap_sig_credit_base_reconfig_rsp { + uint16_t result; +} __attribute__((packed)); + +struct ble_l2cap_sig_disc_req { + uint16_t dcid; + uint16_t scid; +} __attribute__((packed)); + +struct ble_l2cap_sig_disc_rsp { + uint16_t dcid; + uint16_t scid; +} __attribute__((packed)); + +struct ble_l2cap_sig_le_credits { + uint16_t scid; + uint16_t credits; +} __attribute__((packed)); + +void ble_l2cap_sig_hdr_parse(void *payload, uint16_t len, + struct ble_l2cap_sig_hdr *hdr); +int ble_l2cap_sig_reject_tx(uint16_t conn_handle, + uint8_t id, uint16_t reason, + void *data, int data_len); +int ble_l2cap_sig_reject_invalid_cid_tx(uint16_t conn_handle, uint8_t id, + uint16_t src_cid, uint16_t dst_cid); +int ble_l2cap_sig_tx(uint16_t conn_handle, struct os_mbuf *txom); +void *ble_l2cap_sig_cmd_get(uint8_t opcode, uint8_t id, uint16_t len, + struct os_mbuf **txom); +#if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) != 0 +int ble_l2cap_sig_coc_connect(uint16_t conn_handle, uint16_t psm, uint16_t mtu, + struct os_mbuf *sdu_rx, + ble_l2cap_event_fn *cb, void *cb_arg); +int ble_l2cap_sig_disconnect(struct ble_l2cap_chan *chan); +int ble_l2cap_sig_le_credits(uint16_t conn_handle, uint16_t scid, + uint16_t credits); +#else +static inline int +ble_l2cap_sig_coc_connect(uint16_t conn_handle, uint16_t psm, uint16_t mtu, + struct os_mbuf *sdu_rx, + ble_l2cap_event_fn *cb, void *cb_arg) +{ + return BLE_HS_ENOTSUP; +} + +static inline int +ble_l2cap_sig_disconnect(struct ble_l2cap_chan *chan) +{ + return BLE_HS_ENOTSUP; +} +#endif + +#if MYNEWT_VAL(BLE_L2CAP_ENHANCED_COC) +int ble_l2cap_sig_ecoc_connect(uint16_t conn_handle, + uint16_t psm, uint16_t mtu, + uint8_t num, struct os_mbuf *sdu_rx[], + ble_l2cap_event_fn *cb, void *cb_arg); +int ble_l2cap_sig_coc_reconfig(uint16_t conn_handle, struct ble_l2cap_chan *chans[], + uint8_t num, uint16_t new_mtu); +#else +static inline int +ble_l2cap_sig_ecoc_connect(uint16_t conn_handle, + uint16_t psm, uint16_t mtu, + uint8_t num, struct os_mbuf *sdu_rx[], + ble_l2cap_event_fn *cb, void *cb_arg) +{ + return BLE_HS_ENOTSUP; +} +static inline int +ble_l2cap_sig_coc_reconfig(uint16_t conn_handle, struct ble_l2cap_chan *chans[], + uint8_t num, uint16_t new_mtu) +{ + return BLE_HS_ENOTSUP; +} +#endif + +void ble_l2cap_sig_conn_broken(uint16_t conn_handle, int reason); +int32_t ble_l2cap_sig_timer(void); +struct ble_l2cap_chan *ble_l2cap_sig_create_chan(uint16_t conn_handle); +int ble_l2cap_sig_init(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_monitor.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_monitor.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_monitor.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_monitor.c index d4a468284..e6db48b82 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_monitor.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_monitor.c @@ -17,7 +17,7 @@ * under the License. */ -#include "nimble/nimble/host/include/host/ble_monitor.h" +#include "host/ble_monitor.h" #if BLE_MONITOR @@ -28,10 +28,10 @@ #include #include #include -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/porting/nimble/include/log/log.h" +#include "os/os.h" +#include "log/log.h" #if MYNEWT_VAL(BLE_MONITOR_UART) -#include "nimble/porting/nimble/include/uart/uart.h" +#include "uart/uart.h" #endif #if MYNEWT_VAL(BLE_MONITOR_RTT) #include "rtt/SEGGER_RTT.h" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_monitor_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_monitor_priv.h new file mode 100644 index 000000000..935787040 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_monitor_priv.h @@ -0,0 +1,100 @@ +/* + * 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_MONITOR_PRIV_ +#define H_BLE_MONITOR_PRIV_ + +#ifdef __cplusplus +extern "C" { +#endif + +#define BLE_MONITOR_OPCODE_NEW_INDEX 0 +#define BLE_MONITOR_OPCODE_DEL_INDEX 1 +#define BLE_MONITOR_OPCODE_COMMAND_PKT 2 +#define BLE_MONITOR_OPCODE_EVENT_PKT 3 +#define BLE_MONITOR_OPCODE_ACL_TX_PKT 4 +#define BLE_MONITOR_OPCODE_ACL_RX_PKT 5 +#define BLE_MONITOR_OPCODE_SCO_TX_PKT 6 +#define BLE_MONITOR_OPCODE_SCO_RX_PKT 7 +#define BLE_MONITOR_OPCODE_OPEN_INDEX 8 +#define BLE_MONITOR_OPCODE_CLOSE_INDEX 9 +#define BLE_MONITOR_OPCODE_INDEX_INFO 10 +#define BLE_MONITOR_OPCODE_VENDOR_DIAG 11 +#define BLE_MONITOR_OPCODE_SYSTEM_NOTE 12 +#define BLE_MONITOR_OPCODE_USER_LOGGING 13 + +#define BLE_MONITOR_EXTHDR_COMMAND_DROPS 1 +#define BLE_MONITOR_EXTHDR_EVENT_DROPS 2 +#define BLE_MONITOR_EXTHDR_ACL_RX_DROPS 3 +#define BLE_MONITOR_EXTHDR_ACL_TX_DROPS 4 +#define BLE_MONITOR_EXTHDR_SCO_RX_DROPS 5 +#define BLE_MONITOR_EXTHDR_SCO_TX_DROPS 6 +#define BLE_MONITOR_EXTHDR_OTHER_DROPS 7 +#define BLE_MONITOR_EXTHDR_TS32 8 + +struct ble_monitor_hdr { + uint16_t data_len; + uint16_t opcode; + uint8_t flags; + uint8_t hdr_len; +} __attribute__((packed)); + +struct ble_monitor_drops_hdr { + uint8_t type_cmd; + uint8_t cmd; + uint8_t type_evt; + uint8_t evt; + uint8_t type_acl_tx; + uint8_t acl_tx; + uint8_t type_acl_rx; + uint8_t acl_rx; + uint8_t type_other; + uint8_t other; +} __attribute__((packed)); + +struct ble_monitor_ts_hdr { + uint8_t type; + uint32_t ts32; +} __attribute__((packed)); + +struct ble_monitor_new_index { + uint8_t type; + uint8_t bus; + uint8_t bdaddr[6]; + char name[8]; +} __attribute__((packed)); + +struct ble_monitor_user_logging { + uint8_t priority; + uint8_t ident_len; +} __attribute__((packed)); + +int ble_monitor_init(void); + +int ble_monitor_send(uint16_t opcode, const void *data, size_t len); + +int ble_monitor_send_om(uint16_t opcode, const struct os_mbuf *om); + +int ble_monitor_new_index(uint8_t bus, uint8_t *addr, const char *name); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm.c index acbe8a1c1..8422c044f 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm.c @@ -43,9 +43,9 @@ #include #include -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/host/include/host/ble_sm.h" +#include "nimble/ble.h" +#include "nimble/nimble_opt.h" +#include "host/ble_sm.h" #include "ble_hs_priv.h" #include "ble_hs_resolv_priv.h" #include "../store/config/src/ble_store_config_priv.h" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm_alg.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_alg.c similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm_alg.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_alg.c index e17760efe..ee8b937c5 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm_alg.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_alg.c @@ -20,12 +20,12 @@ #include #include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" +#include "syscfg/syscfg.h" +#include "nimble/nimble_opt.h" #if NIMBLE_BLE_SM -#include "nimble/nimble/include/nimble/ble.h" +#include "nimble/ble.h" #include "ble_hs_priv.h" #if MYNEWT_VAL(BLE_CRYPTO_STACK_MBEDTLS) @@ -41,13 +41,13 @@ #endif #else -#include "nimble/ext/tinycrypt/include/tinycrypt/aes.h" -#include "nimble/ext/tinycrypt/include/tinycrypt/constants.h" -#include "nimble/ext/tinycrypt/include/tinycrypt/utils.h" +#include "tinycrypt/aes.h" +#include "tinycrypt/constants.h" +#include "tinycrypt/utils.h" #if MYNEWT_VAL(BLE_SM_SC) -#include "nimble/ext/tinycrypt/include/tinycrypt/cmac_mode.h" -#include "nimble/ext/tinycrypt/include/tinycrypt/ecc_dh.h" +#include "tinycrypt/cmac_mode.h" +#include "tinycrypt/ecc_dh.h" #if MYNEWT_VAL(TRNG) #include "trng/trng.h" #endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm_cmd.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_cmd.c similarity index 92% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm_cmd.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_cmd.c index 92a34ed36..01651f1df 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm_cmd.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_cmd.c @@ -19,9 +19,9 @@ #include #include -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/host/include/host/ble_sm.h" +#include "nimble/ble.h" +#include "nimble/nimble_opt.h" +#include "host/ble_sm.h" #include "ble_hs_priv.h" void * diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm_lgcy.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_lgcy.c similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm_lgcy.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_lgcy.c index 2f150eeb3..bb2d66d5d 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm_lgcy.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_lgcy.c @@ -19,9 +19,9 @@ #include #include -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/host/include/host/ble_sm.h" +#include "nimble/ble.h" +#include "nimble/nimble_opt.h" +#include "host/ble_sm.h" #include "ble_hs_priv.h" #if MYNEWT_VAL(BLE_SM_LEGACY) diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_priv.h new file mode 100644 index 000000000..def0a32f5 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_priv.h @@ -0,0 +1,428 @@ +/* + * 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_SM_PRIV_ +#define H_BLE_SM_PRIV_ + +#include +#include "syscfg/syscfg.h" +#include "os/queue.h" +#include "nimble/nimble_opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct ble_gap_sec_state; +struct hci_le_lt_key_req; +struct hci_encrypt_change; + +#define BLE_SM_MTU 65 + +#define BLE_SM_OP_PAIR_REQ 0x01 +#define BLE_SM_OP_PAIR_RSP 0x02 +#define BLE_SM_OP_PAIR_CONFIRM 0x03 +#define BLE_SM_OP_PAIR_RANDOM 0x04 +#define BLE_SM_OP_PAIR_FAIL 0x05 +#define BLE_SM_OP_ENC_INFO 0x06 +#define BLE_SM_OP_MASTER_ID 0x07 +#define BLE_SM_OP_IDENTITY_INFO 0x08 +#define BLE_SM_OP_IDENTITY_ADDR_INFO 0x09 +#define BLE_SM_OP_SIGN_INFO 0x0a +#define BLE_SM_OP_SEC_REQ 0x0b +#define BLE_SM_OP_PAIR_PUBLIC_KEY 0x0c +#define BLE_SM_OP_PAIR_DHKEY_CHECK 0x0d +#define BLE_SM_OP_PAIR_KEYPRESS_NOTIFY 0x0e + +struct ble_sm_hdr { + uint8_t opcode; + uint8_t data[0]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x01/0x02 [req/rsp]) | 1 | + * | IO Capability | 1 | + * | OOB data flag | 1 | + * | AuthReq | 1 | + * | Maximum Encryption Key Size | 1 | + * | Initiator Key Distribution | 1 | + * | Responder Key Distribution | 1 | + */ + +struct ble_sm_pair_cmd { + uint8_t io_cap; + uint8_t oob_data_flag; + uint8_t authreq; + uint8_t max_enc_key_size; + uint8_t init_key_dist; + uint8_t resp_key_dist; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x03) | 1 | + * | Confirm Value | 16 | + */ + +struct ble_sm_pair_confirm { + uint8_t value[16]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x04) | 1 | + * | Random Value | 16 | + */ +struct ble_sm_pair_random { + uint8_t value[16]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x05) | 1 | + * | Reason | 1 | + */ +struct ble_sm_pair_fail { + uint8_t reason; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x06) | 1 | + * | ltk | 16 | + */ +struct ble_sm_enc_info { + uint8_t ltk[16]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x07) | 1 | + * | EDIV | 2 | + * | RAND | 8 | + */ +struct ble_sm_master_id { + uint16_t ediv; + uint64_t rand_val; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x08) | 1 | + * | irk | 16 | + */ +struct ble_sm_id_info { + uint8_t irk[16]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x09) | 1 | + * | addr_type | 1 | + * | address | 6 | + */ +struct ble_sm_id_addr_info { + uint8_t addr_type; + uint8_t bd_addr[6]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x0A) | 1 | + * | csrk | 16 | + */ +struct ble_sm_sign_info { + uint8_t sig_key[16]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x0B) | 1 | + * | authreq | 1 | + */ +struct ble_sm_sec_req { + uint8_t authreq; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x0c) | 1 | + * | Public Key X | 32 | + * | Public Key Y | 32 | + */ +struct ble_sm_public_key { + uint8_t x[32]; + uint8_t y[32]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x0d) | 1 | + * | DHKey Check | 16 | + */ +struct ble_sm_dhkey_check { + uint8_t value[16]; +} __attribute__((packed)); + +#if NIMBLE_BLE_SM + +#define BLE_SM_PROC_STATE_NONE ((uint8_t)-1) + +#define BLE_SM_PROC_STATE_PAIR 0 +#define BLE_SM_PROC_STATE_CONFIRM 1 +#define BLE_SM_PROC_STATE_RANDOM 2 +#define BLE_SM_PROC_STATE_LTK_START 3 +#define BLE_SM_PROC_STATE_LTK_RESTORE 4 +#define BLE_SM_PROC_STATE_ENC_START 5 +#define BLE_SM_PROC_STATE_ENC_RESTORE 6 +#define BLE_SM_PROC_STATE_KEY_EXCH 7 +#define BLE_SM_PROC_STATE_SEC_REQ 8 +#define BLE_SM_PROC_STATE_PUBLIC_KEY 9 +#define BLE_SM_PROC_STATE_DHKEY_CHECK 10 +#define BLE_SM_PROC_STATE_CNT 11 + +#define BLE_SM_PROC_F_INITIATOR 0x01 +#define BLE_SM_PROC_F_IO_INJECTED 0x02 +#define BLE_SM_PROC_F_ADVANCE_ON_IO 0x04 +#define BLE_SM_PROC_F_AUTHENTICATED 0x08 +#define BLE_SM_PROC_F_SC 0x10 +#define BLE_SM_PROC_F_BONDING 0x20 + +#define BLE_SM_KE_F_ENC_INFO 0x01 +#define BLE_SM_KE_F_MASTER_ID 0x02 +#define BLE_SM_KE_F_ID_INFO 0x04 +#define BLE_SM_KE_F_ADDR_INFO 0x08 +#define BLE_SM_KE_F_SIGN_INFO 0x10 + +typedef uint8_t ble_sm_proc_flags; + +struct ble_sm_keys { + unsigned ltk_valid:1; + unsigned ediv_rand_valid:1; + unsigned irk_valid:1; + unsigned csrk_valid:1; + unsigned addr_valid:1; + uint16_t ediv; + uint64_t rand_val; + uint8_t addr_type; + uint8_t key_size; + uint8_t ltk[16]; /* Little endian. */ + uint8_t irk[16]; /* Little endian. */ + uint8_t csrk[16]; /* Little endian. */ + uint8_t addr[6]; /* Little endian. */ +}; + +struct ble_sm_proc { + STAILQ_ENTRY(ble_sm_proc) next; + + ble_npl_time_t exp_os_ticks; + ble_sm_proc_flags flags; + uint16_t conn_handle; + uint8_t pair_alg; + uint8_t state; + uint8_t rx_key_flags; + uint8_t key_size; + + uint8_t pair_req[sizeof(struct ble_sm_hdr) + sizeof(struct ble_sm_pair_cmd)]; + uint8_t pair_rsp[sizeof(struct ble_sm_hdr) + sizeof(struct ble_sm_pair_cmd)]; + uint8_t tk[16]; + uint8_t confirm_peer[16]; + uint8_t randm[16]; + uint8_t rands[16]; + uint8_t ltk[16]; /* Little endian. */ + struct ble_sm_keys our_keys; + struct ble_sm_keys peer_keys; + +#if MYNEWT_VAL(BLE_SM_SC) + /* Secure connections. */ + uint8_t passkey_bits_exchanged; + uint8_t ri; + struct ble_sm_public_key pub_key_peer; + uint8_t mackey[16]; + uint8_t dhkey[32]; + const struct ble_sm_sc_oob_data *oob_data_local; + const struct ble_sm_sc_oob_data *oob_data_remote; +#endif +}; + +struct ble_sm_result { + int app_status; + uint8_t sm_err; + struct ble_gap_passkey_params passkey_params; + void *state_arg; + unsigned execute : 1; + unsigned enc_cb : 1; + unsigned bonded : 1; + unsigned restore : 1; +}; + +#if MYNEWT_VAL(BLE_HS_DEBUG) +void ble_sm_dbg_set_next_pair_rand(uint8_t *next_pair_rand); +void ble_sm_dbg_set_next_ediv(uint16_t next_ediv); +void ble_sm_dbg_set_next_master_id_rand(uint64_t next_master_id_rand); +void ble_sm_dbg_set_next_ltk(uint8_t *next_ltk); +void ble_sm_dbg_set_next_csrk(uint8_t *next_csrk); +void ble_sm_dbg_set_sc_keys(uint8_t *pubkey, uint8_t *privkey); +#endif + +int ble_sm_num_procs(void); + +int ble_sm_alg_s1(const uint8_t *k, const uint8_t *r1, const uint8_t *r2, + uint8_t *out); +int ble_sm_alg_c1(const uint8_t *k, const uint8_t *r, + const uint8_t *preq, const uint8_t *pres, + uint8_t iat, uint8_t rat, + const uint8_t *ia, const uint8_t *ra, + uint8_t *out_enc_data); +int ble_sm_alg_f4(const uint8_t *u, const uint8_t *v, const uint8_t *x, + uint8_t z, uint8_t *out_enc_data); +int ble_sm_alg_g2(const uint8_t *u, const uint8_t *v, const uint8_t *x, + const uint8_t *y, uint32_t *passkey); +int ble_sm_alg_f5(const uint8_t *w, const uint8_t *n1, const uint8_t *n2, + uint8_t a1t, const uint8_t *a1, uint8_t a2t, + const uint8_t *a2, uint8_t *mackey, uint8_t *ltk); +int ble_sm_alg_f6(const uint8_t *w, const uint8_t *n1, const uint8_t *n2, + const uint8_t *r, const uint8_t *iocap, uint8_t a1t, + const uint8_t *a1, uint8_t a2t, const uint8_t *a2, + uint8_t *check); +int ble_sm_alg_gen_dhkey(const uint8_t *peer_pub_key_x, + const uint8_t *peer_pub_key_y, + const uint8_t *our_priv_key, uint8_t *out_dhkey); +int ble_sm_alg_gen_key_pair(uint8_t *pub, uint8_t *priv); +void ble_sm_alg_ecc_init(void); + +void ble_sm_enc_change_rx(const struct ble_hci_ev_enrypt_chg *ev); +void ble_sm_enc_key_refresh_rx(const struct ble_hci_ev_enc_key_refresh *ev); +int ble_sm_ltk_req_rx(const struct ble_hci_ev_le_subev_lt_key_req *ev); + +#if MYNEWT_VAL(BLE_SM_LEGACY) +int ble_sm_lgcy_io_action(struct ble_sm_proc *proc, uint8_t *action); +void ble_sm_lgcy_confirm_exec(struct ble_sm_proc *proc, + struct ble_sm_result *res); +void ble_sm_lgcy_random_exec(struct ble_sm_proc *proc, + struct ble_sm_result *res); +void ble_sm_lgcy_random_rx(struct ble_sm_proc *proc, + struct ble_sm_result *res); +#else +#define ble_sm_lgcy_io_action(proc, action) (BLE_HS_ENOTSUP) +#define ble_sm_lgcy_confirm_exec(proc, res) +#define ble_sm_lgcy_random_exec(proc, res) +#define ble_sm_lgcy_random_rx(proc, res) +#endif + +#if MYNEWT_VAL(BLE_SM_SC) +int ble_sm_sc_io_action(struct ble_sm_proc *proc, uint8_t *action); +void ble_sm_sc_confirm_exec(struct ble_sm_proc *proc, + struct ble_sm_result *res); +void ble_sm_sc_random_exec(struct ble_sm_proc *proc, + struct ble_sm_result *res); +void ble_sm_sc_random_rx(struct ble_sm_proc *proc, struct ble_sm_result *res); +void ble_sm_sc_public_key_exec(struct ble_sm_proc *proc, + struct ble_sm_result *res, + void *arg); +void ble_sm_sc_public_key_rx(uint16_t conn_handle, struct os_mbuf **rxom, + struct ble_sm_result *res); +void ble_sm_sc_dhkey_check_exec(struct ble_sm_proc *proc, + struct ble_sm_result *res, void *arg); +void ble_sm_sc_dhkey_check_rx(uint16_t conn_handle, struct os_mbuf **rxom, + struct ble_sm_result *res); +bool ble_sm_sc_oob_data_check(struct ble_sm_proc *proc, + bool oob_data_local_present, + bool oob_data_remote_present); +void ble_sm_sc_oob_confirm(struct ble_sm_proc *proc, struct ble_sm_result *res); +void ble_sm_sc_init(void); +#else +#define ble_sm_sc_io_action(proc, action) (BLE_HS_ENOTSUP) +#define ble_sm_sc_confirm_exec(proc, res) +#define ble_sm_sc_random_exec(proc, res) +#define ble_sm_sc_random_rx(proc, res) +#define ble_sm_sc_public_key_exec(proc, res, arg) +#define ble_sm_sc_public_key_rx(conn_handle, op, om, res) +#define ble_sm_sc_dhkey_check_exec(proc, res, arg) +#define ble_sm_sc_dhkey_check_rx(conn_handle, op, om, res) +#define ble_sm_sc_init() + +#endif + +struct ble_sm_proc *ble_sm_proc_find(uint16_t conn_handle, uint8_t state, + int is_initiator, + struct ble_sm_proc **out_prev); +int ble_sm_gen_pair_rand(uint8_t *pair_rand); +uint8_t *ble_sm_our_pair_rand(struct ble_sm_proc *proc); +uint8_t *ble_sm_peer_pair_rand(struct ble_sm_proc *proc); +int ble_sm_ioact_state(uint8_t action); +int ble_sm_proc_can_advance(struct ble_sm_proc *proc); +void ble_sm_process_result(uint16_t conn_handle, struct ble_sm_result *res); +void ble_sm_confirm_advance(struct ble_sm_proc *proc); +void ble_sm_ia_ra(struct ble_sm_proc *proc, + uint8_t *out_iat, uint8_t *out_ia, + uint8_t *out_rat, uint8_t *out_ra); + +int32_t ble_sm_timer(void); +void ble_sm_connection_broken(uint16_t conn_handle); +int ble_sm_pair_initiate(uint16_t conn_handle); +int ble_sm_slave_initiate(uint16_t conn_handle); +int ble_sm_enc_initiate(uint16_t conn_handle, uint8_t key_size, + const uint8_t *ltk, uint16_t ediv, + uint64_t rand_val, int auth); +int ble_sm_alg_encrypt(const uint8_t *key, const uint8_t *plaintext, + uint8_t *enc_data); +int ble_sm_init(void); +#else + +#define ble_sm_enc_change_rx(evt) ((void)(evt)) +#define ble_sm_ltk_req_rx(evt) ((void)(evt)) +#define ble_sm_enc_key_refresh_rx(evt) ((void)(evt)) + +#define ble_sm_timer() BLE_HS_FOREVER +#define ble_sm_connection_broken(conn_handle) +#define ble_sm_pair_initiate(conn_handle) BLE_HS_ENOTSUP +#define ble_sm_slave_initiate(conn_handle) BLE_HS_ENOTSUP +#define ble_sm_enc_initiate(conn_handle, keysize, ltk, ediv, rand_val, auth) \ + BLE_HS_ENOTSUP + +#define ble_sm_init() 0 + +#define ble_sm_alg_encrypt(key, plaintext, enc_data) \ + BLE_HS_ENOTSUP + +#endif + +struct ble_l2cap_chan *ble_sm_create_chan(uint16_t handle); +void *ble_sm_cmd_get(uint8_t opcode, size_t len, struct os_mbuf **txom); +int ble_sm_tx(uint16_t conn_handle, struct os_mbuf *txom); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm_sc.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_sc.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm_sc.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_sc.c index ffc807fa6..333310702 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_sm_sc.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_sm_sc.c @@ -19,8 +19,8 @@ #include -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/host/include/host/ble_sm.h" +#include "nimble/nimble_opt.h" +#include "host/ble_sm.h" #include "ble_hs_priv.h" #include "ble_sm_priv.h" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_store.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_store.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_store.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_store.c index e5a475530..22e608947 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_store.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_store.c @@ -19,7 +19,7 @@ #include -#include "nimble/nimble/host/include/host/ble_store.h" +#include "host/ble_store.h" #include "ble_hs_priv.h" int diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_store_util.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_store_util.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_store_util.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_store_util.c index 033261242..73c71d93b 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_store_util.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_store_util.c @@ -17,7 +17,7 @@ * under the License. */ -#include "nimble/nimble/host/include/host/ble_store.h" +#include "host/ble_store.h" #include "ble_hs_priv.h" #include "ble_hs_resolv_priv.h" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_uuid.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_uuid.c similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_uuid.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_uuid.c index 1b2443683..3a1642480 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/src/ble_uuid.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_uuid.c @@ -22,10 +22,10 @@ #include #include #include -#include "nimble/porting/nimble/include/os/os_mbuf.h" -#include "nimble/nimble/include/nimble/ble.h" +#include "os/os_mbuf.h" +#include "nimble/ble.h" #include "ble_hs_priv.h" -#include "nimble/nimble/host/include/host/ble_uuid.h" +#include "host/ble_uuid.h" static uint8_t ble_uuid_base[16] = { 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_uuid_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_uuid_priv.h new file mode 100644 index 000000000..3dbcc6b8e --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/src/ble_uuid_priv.h @@ -0,0 +1,45 @@ +/* + * 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_UUID_PRIV_ +#define H_BLE_UUID_PRIV_ + +#include "host/ble_uuid.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct os_mbuf; + +int ble_uuid_init_from_att_mbuf(ble_uuid_any_t *uuid, struct os_mbuf *om, + int off, int len); +int ble_uuid_init_from_att_buf(ble_uuid_any_t *uuid, const void *buf, + size_t len); + +int ble_uuid_to_any(const ble_uuid_t *uuid, ble_uuid_any_t *uuid_any); +int ble_uuid_to_mbuf(const ble_uuid_t *uuid, struct os_mbuf *om); +int ble_uuid_flat(const ble_uuid_t *uuid, void *dst); +int ble_uuid_length(const ble_uuid_t *uuid); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/src/ble_store_config.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/store/config/src/ble_store_config.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/src/ble_store_config.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/store/config/src/ble_store_config.c index 4ffaaf4e1..a2c9aaf27 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/src/ble_store_config.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/store/config/src/ble_store_config.c @@ -20,10 +20,10 @@ #include #include -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "../include/store/config/ble_store_config.h" +#include "sysinit/sysinit.h" +#include "syscfg/syscfg.h" +#include "host/ble_hs.h" +#include "store/config/ble_store_config.h" #include "ble_store_config_priv.h" struct ble_store_value_sec diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/src/ble_store_config_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/store/config/src/ble_store_config_priv.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/src/ble_store_config_priv.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/store/config/src/ble_store_config_priv.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/src/ble_store_nvs.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/store/config/src/ble_store_nvs.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/src/ble_store_nvs.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/store/config/src/ble_store_nvs.c index e09182d9f..49ca6ed73 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/src/ble_store_nvs.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/store/config/src/ble_store_nvs.c @@ -19,16 +19,16 @@ * under the License. */ -#ifdef ESP_PLATFORM -#include "nimble/porting/nimble/include/syscfg/syscfg.h" + +#include "syscfg/syscfg.h" #if MYNEWT_VAL(BLE_STORE_CONFIG_PERSIST) #include #include -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "../../../include/host/ble_hs.h" -#include "../include/store/config/ble_store_config.h" +#include "sysinit/sysinit.h" +#include "host/ble_hs.h" +#include "store/config/ble_store_config.h" #include "ble_store_config_priv.h" #include "esp_log.h" #include "nvs.h" @@ -650,4 +650,3 @@ void ble_store_config_conf_init(void) /***************************************************************************************/ #endif /* MYNEWT_VAL(BLE_STORE_CONFIG_PERSIST) */ -#endif /* ESP_PLATFORM */ \ No newline at end of file diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/store/ram/src/ble_store_ram.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/store/ram/src/ble_store_ram.c new file mode 100644 index 000000000..ab5cdb9f6 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/store/ram/src/ble_store_ram.c @@ -0,0 +1,497 @@ +/* + * 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. + */ + +/** + * This file implements a simple in-RAM key database for BLE host security + * material and CCCDs. As this database is only ble_store_ramd in RAM, its + * contents are lost when the application terminates. + */ + +#include +#include + +#include "sysinit/sysinit.h" +#include "syscfg/syscfg.h" +#include "host/ble_hs.h" +#include "store/ram/ble_store_ram.h" + +static struct ble_store_value_sec + ble_store_ram_our_secs[MYNEWT_VAL(BLE_STORE_MAX_BONDS)]; +static int ble_store_ram_num_our_secs; + +static struct ble_store_value_sec + ble_store_ram_peer_secs[MYNEWT_VAL(BLE_STORE_MAX_BONDS)]; +static int ble_store_ram_num_peer_secs; + +static struct ble_store_value_cccd + ble_store_ram_cccds[MYNEWT_VAL(BLE_STORE_MAX_CCCDS)]; +static int ble_store_ram_num_cccds; + +/***************************************************************************** + * $sec * + *****************************************************************************/ + +static void +ble_store_ram_print_value_sec(const struct ble_store_value_sec *sec) +{ + if (sec->ltk_present) { + BLE_HS_LOG(DEBUG, "ediv=%u rand=%llu authenticated=%d ltk=", + sec->ediv, sec->rand_num, sec->authenticated); + ble_hs_log_flat_buf(sec->ltk, 16); + BLE_HS_LOG(DEBUG, " "); + } + if (sec->irk_present) { + BLE_HS_LOG(DEBUG, "irk="); + ble_hs_log_flat_buf(sec->irk, 16); + BLE_HS_LOG(DEBUG, " "); + } + if (sec->csrk_present) { + BLE_HS_LOG(DEBUG, "csrk="); + ble_hs_log_flat_buf(sec->csrk, 16); + BLE_HS_LOG(DEBUG, " "); + } + + BLE_HS_LOG(DEBUG, "\n"); +} + +static void +ble_store_ram_print_key_sec(const struct ble_store_key_sec *key_sec) +{ + if (ble_addr_cmp(&key_sec->peer_addr, BLE_ADDR_ANY)) { + BLE_HS_LOG(DEBUG, "peer_addr_type=%d peer_addr=", + key_sec->peer_addr.type); + ble_hs_log_flat_buf(key_sec->peer_addr.val, 6); + BLE_HS_LOG(DEBUG, " "); + } + if (key_sec->ediv_rand_present) { + BLE_HS_LOG(DEBUG, "ediv=0x%02x rand=0x%llx ", + key_sec->ediv, key_sec->rand_num); + } +} + +static int +ble_store_ram_find_sec(const struct ble_store_key_sec *key_sec, + const struct ble_store_value_sec *value_secs, + int num_value_secs) +{ + const struct ble_store_value_sec *cur; + int skipped; + int i; + + skipped = 0; + + for (i = 0; i < num_value_secs; i++) { + cur = value_secs + i; + + if (ble_addr_cmp(&key_sec->peer_addr, BLE_ADDR_ANY)) { + if (ble_addr_cmp(&cur->peer_addr, &key_sec->peer_addr)) { + continue; + } + } + + if (key_sec->ediv_rand_present) { + if (cur->ediv != key_sec->ediv) { + continue; + } + + if (cur->rand_num != key_sec->rand_num) { + continue; + } + } + + if (key_sec->idx > skipped) { + skipped++; + continue; + } + + return i; + } + + return -1; +} + +static int +ble_store_ram_read_our_sec(const struct ble_store_key_sec *key_sec, + struct ble_store_value_sec *value_sec) +{ + int idx; + + idx = ble_store_ram_find_sec(key_sec, ble_store_ram_our_secs, + ble_store_ram_num_our_secs); + if (idx == -1) { + return BLE_HS_ENOENT; + } + + *value_sec = ble_store_ram_our_secs[idx]; + return 0; +} + +static int +ble_store_ram_write_our_sec(const struct ble_store_value_sec *value_sec) +{ + struct ble_store_key_sec key_sec; + int idx; + + BLE_HS_LOG(DEBUG, "persisting our sec; "); + ble_store_ram_print_value_sec(value_sec); + + ble_store_key_from_value_sec(&key_sec, value_sec); + idx = ble_store_ram_find_sec(&key_sec, ble_store_ram_our_secs, + ble_store_ram_num_our_secs); + if (idx == -1) { + if (ble_store_ram_num_our_secs >= MYNEWT_VAL(BLE_STORE_MAX_BONDS)) { + BLE_HS_LOG(DEBUG, "error persisting our sec; too many entries " + "(%d)\n", ble_store_ram_num_our_secs); + return BLE_HS_ESTORE_CAP; + } + + idx = ble_store_ram_num_our_secs; + ble_store_ram_num_our_secs++; + } + + ble_store_ram_our_secs[idx] = *value_sec; + return 0; +} + +static int +ble_store_ram_delete_obj(void *values, int value_size, int idx, + int *num_values) +{ + uint8_t *dst; + uint8_t *src; + int move_count; + + (*num_values)--; + if (idx < *num_values) { + dst = values; + dst += idx * value_size; + src = dst + value_size; + + move_count = *num_values - idx; + memmove(dst, src, move_count); + } + + return 0; +} + +static int +ble_store_ram_delete_sec(const struct ble_store_key_sec *key_sec, + struct ble_store_value_sec *value_secs, + int *num_value_secs) +{ + int idx; + int rc; + + idx = ble_store_ram_find_sec(key_sec, value_secs, *num_value_secs); + if (idx == -1) { + return BLE_HS_ENOENT; + } + + rc = ble_store_ram_delete_obj(value_secs, sizeof *value_secs, idx, + num_value_secs); + if (rc != 0) { + return rc; + } + + return 0; +} + +static int +ble_store_ram_delete_our_sec(const struct ble_store_key_sec *key_sec) +{ + int rc; + + rc = ble_store_ram_delete_sec(key_sec, ble_store_ram_our_secs, + &ble_store_ram_num_our_secs); + if (rc != 0) { + return rc; + } + + return 0; +} + +static int +ble_store_ram_delete_peer_sec(const struct ble_store_key_sec *key_sec) +{ + int rc; + + rc = ble_store_ram_delete_sec(key_sec, ble_store_ram_peer_secs, + &ble_store_ram_num_peer_secs); + if (rc != 0) { + return rc; + } + + return 0; +} + +static int +ble_store_ram_read_peer_sec(const struct ble_store_key_sec *key_sec, + struct ble_store_value_sec *value_sec) +{ + int idx; + + idx = ble_store_ram_find_sec(key_sec, ble_store_ram_peer_secs, + ble_store_ram_num_peer_secs); + if (idx == -1) { + return BLE_HS_ENOENT; + } + + *value_sec = ble_store_ram_peer_secs[idx]; + return 0; +} + +static int +ble_store_ram_write_peer_sec(const struct ble_store_value_sec *value_sec) +{ + struct ble_store_key_sec key_sec; + int idx; + + BLE_HS_LOG(DEBUG, "persisting peer sec; "); + ble_store_ram_print_value_sec(value_sec); + + ble_store_key_from_value_sec(&key_sec, value_sec); + idx = ble_store_ram_find_sec(&key_sec, ble_store_ram_peer_secs, + ble_store_ram_num_peer_secs); + if (idx == -1) { + if (ble_store_ram_num_peer_secs >= MYNEWT_VAL(BLE_STORE_MAX_BONDS)) { + BLE_HS_LOG(DEBUG, "error persisting peer sec; too many entries " + "(%d)\n", ble_store_ram_num_peer_secs); + return BLE_HS_ESTORE_CAP; + } + + idx = ble_store_ram_num_peer_secs; + ble_store_ram_num_peer_secs++; + } + + ble_store_ram_peer_secs[idx] = *value_sec; + return 0; +} + +/***************************************************************************** + * $cccd * + *****************************************************************************/ + +static int +ble_store_ram_find_cccd(const struct ble_store_key_cccd *key) +{ + struct ble_store_value_cccd *cccd; + int skipped; + int i; + + skipped = 0; + for (i = 0; i < ble_store_ram_num_cccds; i++) { + cccd = ble_store_ram_cccds + i; + + if (ble_addr_cmp(&key->peer_addr, BLE_ADDR_ANY)) { + if (ble_addr_cmp(&cccd->peer_addr, &key->peer_addr)) { + continue; + } + } + + if (key->chr_val_handle != 0) { + if (cccd->chr_val_handle != key->chr_val_handle) { + continue; + } + } + + if (key->idx > skipped) { + skipped++; + continue; + } + + return i; + } + + return -1; +} + +static int +ble_store_ram_delete_cccd(const struct ble_store_key_cccd *key_cccd) +{ + int idx; + int rc; + + idx = ble_store_ram_find_cccd(key_cccd); + if (idx == -1) { + return BLE_HS_ENOENT; + } + + rc = ble_store_ram_delete_obj(ble_store_ram_cccds, + sizeof *ble_store_ram_cccds, + idx, + &ble_store_ram_num_cccds); + if (rc != 0) { + return rc; + } + + return 0; +} + +static int +ble_store_ram_read_cccd(const struct ble_store_key_cccd *key_cccd, + struct ble_store_value_cccd *value_cccd) +{ + int idx; + + idx = ble_store_ram_find_cccd(key_cccd); + if (idx == -1) { + return BLE_HS_ENOENT; + } + + *value_cccd = ble_store_ram_cccds[idx]; + return 0; +} + +static int +ble_store_ram_write_cccd(const struct ble_store_value_cccd *value_cccd) +{ + struct ble_store_key_cccd key_cccd; + int idx; + + ble_store_key_from_value_cccd(&key_cccd, value_cccd); + idx = ble_store_ram_find_cccd(&key_cccd); + if (idx == -1) { + if (ble_store_ram_num_cccds >= MYNEWT_VAL(BLE_STORE_MAX_CCCDS)) { + BLE_HS_LOG(DEBUG, "error persisting cccd; too many entries (%d)\n", + ble_store_ram_num_cccds); + return BLE_HS_ESTORE_CAP; + } + + idx = ble_store_ram_num_cccds; + ble_store_ram_num_cccds++; + } + + ble_store_ram_cccds[idx] = *value_cccd; + return 0; +} + +/***************************************************************************** + * $api * + *****************************************************************************/ + +/** + * Searches the database for an object matching the specified criteria. + * + * @return 0 if a key was found; else BLE_HS_ENOENT. + */ +int +ble_store_ram_read(int obj_type, const union ble_store_key *key, + union ble_store_value *value) +{ + int rc; + + switch (obj_type) { + case BLE_STORE_OBJ_TYPE_PEER_SEC: + /* An encryption procedure (bonding) is being attempted. The nimble + * stack is asking us to look in our key database for a long-term key + * corresponding to the specified ediv and random number. + * + * Perform a key lookup and populate the context object with the + * result. The nimble stack will use this key if this function returns + * success. + */ + BLE_HS_LOG(DEBUG, "looking up peer sec; "); + ble_store_ram_print_key_sec(&key->sec); + BLE_HS_LOG(DEBUG, "\n"); + rc = ble_store_ram_read_peer_sec(&key->sec, &value->sec); + return rc; + + case BLE_STORE_OBJ_TYPE_OUR_SEC: + BLE_HS_LOG(DEBUG, "looking up our sec; "); + ble_store_ram_print_key_sec(&key->sec); + BLE_HS_LOG(DEBUG, "\n"); + rc = ble_store_ram_read_our_sec(&key->sec, &value->sec); + return rc; + + case BLE_STORE_OBJ_TYPE_CCCD: + rc = ble_store_ram_read_cccd(&key->cccd, &value->cccd); + return rc; + + default: + return BLE_HS_ENOTSUP; + } +} + +/** + * Adds the specified object to the database. + * + * @return 0 on success; BLE_HS_ESTORE_CAP if the database + * is full. + */ +int +ble_store_ram_write(int obj_type, const union ble_store_value *val) +{ + int rc; + + switch (obj_type) { + case BLE_STORE_OBJ_TYPE_PEER_SEC: + rc = ble_store_ram_write_peer_sec(&val->sec); + return rc; + + case BLE_STORE_OBJ_TYPE_OUR_SEC: + rc = ble_store_ram_write_our_sec(&val->sec); + return rc; + + case BLE_STORE_OBJ_TYPE_CCCD: + rc = ble_store_ram_write_cccd(&val->cccd); + return rc; + + default: + return BLE_HS_ENOTSUP; + } +} + +int +ble_store_ram_delete(int obj_type, const union ble_store_key *key) +{ + int rc; + + switch (obj_type) { + case BLE_STORE_OBJ_TYPE_PEER_SEC: + rc = ble_store_ram_delete_peer_sec(&key->sec); + return rc; + + case BLE_STORE_OBJ_TYPE_OUR_SEC: + rc = ble_store_ram_delete_our_sec(&key->sec); + return rc; + + case BLE_STORE_OBJ_TYPE_CCCD: + rc = ble_store_ram_delete_cccd(&key->cccd); + return rc; + + default: + return BLE_HS_ENOTSUP; + } +} + +void +ble_store_ram_init(void) +{ + /* Ensure this function only gets called by sysinit. */ + SYSINIT_ASSERT_ACTIVE(); + + ble_hs_cfg.store_read_cb = ble_store_ram_read; + ble_hs_cfg.store_write_cb = ble_store_ram_write; + ble_hs_cfg.store_delete_cb = ble_store_ram_delete; + + /* Re-initialize BSS values in case of unit tests. */ + ble_store_ram_num_our_secs = 0; + ble_store_ram_num_peer_secs = 0; + ble_store_ram_num_cccds = 0; +} diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/util/src/addr.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/util/src/addr.c similarity index 94% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/util/src/addr.c rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/host/util/src/addr.c index b8195a5b7..9b43d237c 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/util/src/addr.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/host/util/src/addr.c @@ -17,11 +17,11 @@ * under the License. */ -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "../include/host/util/util.h" +#include "host/ble_hs.h" +#include "host/util/util.h" #if MYNEWT_VAL(BLE_CONTROLLER) -#include "nimble/nimble/controller/include/controller/ble_hw.h" +#include "controller/ble_hw.h" #endif static int diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_hw.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_hw.h deleted file mode 100644 index dfac69b60..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_hw.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * 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 "nimble/porting/nimble/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/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll.h deleted file mode 100644 index 3b165a706..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll.h +++ /dev/null @@ -1,584 +0,0 @@ -/* - * 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 "nimble/porting/nimble/include/stats/stats.h" -#include "nimble/porting/nimble/include/os/os_cputime.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/include/nimble/nimble_npl.h" -#include "ble_phy.h" - -#ifdef MYNEWT -#include "./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); - -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/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_adv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_adv.h deleted file mode 100644 index eee07cbf0..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_adv.h +++ /dev/null @@ -1,209 +0,0 @@ -/* - * 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 "nimble/porting/nimble/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/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_conn.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_conn.h deleted file mode 100644 index 178d67117..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_conn.h +++ /dev/null @@ -1,425 +0,0 @@ -/* - * 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 "nimble/porting/nimble/include/os/os.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/hci_common.h" -#include "nimble/nimble/include/nimble/nimble_npl.h" -#include "ble_ll_sched.h" -#include "ble_ll_ctrl.h" -#include "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/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_ctrl.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_ctrl.h deleted file mode 100644 index b0da1e736..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_ctrl.h +++ /dev/null @@ -1,313 +0,0 @@ -/* - * 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/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_hci.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_hci.h deleted file mode 100644 index 5806f6737..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_hci.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * 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/nimble/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/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_resolv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_resolv.h deleted file mode 100644 index 228e0a370..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_resolv.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * 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/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_rfmgmt.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_rfmgmt.h deleted file mode 100644 index 37b81a88b..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_rfmgmt.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_scan.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_scan.h deleted file mode 100644 index ca50824d0..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_scan.h +++ /dev/null @@ -1,293 +0,0 @@ -/* - * 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 "ble_ll_sched.h" -#include "nimble/porting/nimble/include/hal/hal_timer.h" -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/nimble/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/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_sched.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_sched.h deleted file mode 100644 index a614cf090..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_sched.h +++ /dev/null @@ -1,216 +0,0 @@ -/* - * 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/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_sync.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_sync.h deleted file mode 100644 index 96c52a92a..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_sync.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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 - -#include "nimble/nimble/include/nimble/ble.h" -#include "ble_ll_hci.h" -#include "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/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_trace.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_trace.h deleted file mode 100644 index f0af4de50..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_trace.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * 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 "nimble/porting/nimble/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/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_whitelist.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_whitelist.h deleted file mode 100644 index 2d3b6c5dd..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_ll_whitelist.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_phy.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_phy.h deleted file mode 100644 index 8a6fd174e..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_phy.h +++ /dev/null @@ -1,242 +0,0 @@ -/* - * 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/nimble/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/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_phy_trace.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_phy_trace.h deleted file mode 100644 index c0dca7a0f..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/include/controller/ble_phy_trace.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * 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 "nimble/porting/nimble/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_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/pkg.yml deleted file mode 100644 index 96c636798..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/pkg.yml +++ /dev/null @@ -1,38 +0,0 @@ -# -# 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. -# - -pkg.name: nimble/controller -pkg.description: Controller side of the nimble Bluetooth Smart stack. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - -pkg.req_apis: - - ble_driver - - ble_transport - - stats - -pkg.deps: - - "@apache-mynewt-core/kernel/os" - - nimble - -pkg.init: - ble_ll_init: 'MYNEWT_VAL(BLE_LL_SYSINIT_STAGE)' diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll.c deleted file mode 100644 index 6a2ca63b9..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll.c +++ /dev/null @@ -1,1720 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include -#include -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/porting/nimble/include/os/os_cputime.h" -#include "nimble/porting/nimble/include/stats/stats.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/include/nimble/hci_common.h" -#include "nimble/nimble/include/nimble/ble_hci_trans.h" -#include "../include/controller/ble_hw.h" -#include "../include/controller/ble_phy.h" -#include "../include/controller/ble_phy_trace.h" -#include "../include/controller/ble_ll.h" -#include "../include/controller/ble_ll_adv.h" -#include "../include/controller/ble_ll_sched.h" -#include "../include/controller/ble_ll_scan.h" -#include "../include/controller/ble_ll_hci.h" -#include "../include/controller/ble_ll_whitelist.h" -#include "../include/controller/ble_ll_resolv.h" -#include "../include/controller/ble_ll_rfmgmt.h" -#include "../include/controller/ble_ll_trace.h" -#include "../include/controller/ble_ll_sync.h" -#include "ble_ll_conn_priv.h" - -#if MYNEWT_VAL(BLE_LL_DTM) -#include "ble_ll_dtm_priv.h" -#endif - -/* XXX: - * - * 1) use the sanity task! - * 2) Need to figure out what to do with packets that we hand up that did - * not pass the filter policy for the given state. Currently I count all - * packets I think. Need to figure out what to do with this. - * 3) For the features defined, we need to conditionally compile code. - * 4) Should look into always disabled the wfr interrupt if we receive the - * start of a frame. Need to look at the various states to see if this is the - * right thing to do. - */ - -/* Supported states */ -#define BLE_LL_S_NCA (0x00000000001) -#define BLE_LL_S_SA (0x00000000002) -#define BLE_LL_S_CA (0x00000000004) -#define BLE_LL_S_HDCA (0x00000000008) -#define BLE_LL_S_PS (0x00000000010) -#define BLE_LL_S_AS (0x00000000020) -#define BLE_LL_S_INIT (0x00000000040) -#define BLE_LL_S_SLAVE (0x00000000080) -#define BLE_LL_S_NCA_PS (0x00000000100) -#define BLE_LL_S_SA_PS (0x00000000200) -#define BLE_LL_S_CA_PS (0x00000000400) -#define BLE_LL_S_HDCA_PS (0x00000000800) -#define BLE_LL_S_NCA_AS (0x00000001000) -#define BLE_LL_S_SA_AS (0x00000002000) -#define BLE_LL_S_CA_AS (0x00000004000) -#define BLE_LL_S_HDCA_AS (0x00000008000) -#define BLE_LL_S_NCA_INIT (0x00000010000) -#define BLE_LL_S_SA_INIT (0x00000020000) -#define BLE_LL_S_NCA_MASTER (0x00000040000) -#define BLE_LL_S_SA_MASTER (0x00000080000) -#define BLE_LL_S_NCA_SLAVE (0x00000100000) -#define BLE_LL_S_SA_SLAVE (0x00000200000) -#define BLE_LL_S_PS_INIT (0x00000400000) -#define BLE_LL_S_AS_INIT (0x00000800000) -#define BLE_LL_S_PS_MASTER (0x00001000000) -#define BLE_LL_S_AS_MASTER (0x00002000000) -#define BLE_LL_S_PS_SLAVE (0x00004000000) -#define BLE_LL_S_AS_SLAVE (0x00008000000) -#define BLE_LL_S_INIT_MASTER (0x00010000000) -#define BLE_LL_S_LDCA (0x00020000000) -#define BLE_LL_S_LDCA_PS (0x00040000000) -#define BLE_LL_S_LDCA_AS (0x00080000000) -#define BLE_LL_S_CA_INIT (0x00100000000) -#define BLE_LL_S_HDCA_INIT (0x00200000000) -#define BLE_LL_S_LDCA_INIT (0x00400000000) -#define BLE_LL_S_CA_MASTER (0x00800000000) -#define BLE_LL_S_HDCA_MASTER (0x01000000000) -#define BLE_LL_S_LDCA_MASTER (0x02000000000) -#define BLE_LL_S_CA_SLAVE (0x04000000000) -#define BLE_LL_S_HDCA_SLAVE (0x08000000000) -#define BLE_LL_S_LDCA_SLAVE (0x10000000000) -#define BLE_LL_S_INIT_SLAVE (0x20000000000) - -#define BLE_LL_SUPPORTED_STATES \ -( \ - BLE_LL_S_NCA | \ - BLE_LL_S_SA | \ - BLE_LL_S_CA | \ - BLE_LL_S_HDCA | \ - BLE_LL_S_PS | \ - BLE_LL_S_AS | \ - BLE_LL_S_INIT | \ - BLE_LL_S_SLAVE | \ - BLE_LL_S_NCA_PS | \ - BLE_LL_S_SA_PS | \ - BLE_LL_S_CA_PS | \ - BLE_LL_S_HDCA_PS | \ - BLE_LL_S_NCA_AS | \ - BLE_LL_S_SA_AS | \ - BLE_LL_S_CA_AS | \ - BLE_LL_S_HDCA_AS | \ - BLE_LL_S_NCA_INIT | \ - BLE_LL_S_SA_INIT | \ - BLE_LL_S_NCA_MASTER | \ - BLE_LL_S_SA_MASTER | \ - BLE_LL_S_NCA_SLAVE | \ - BLE_LL_S_SA_SLAVE | \ - BLE_LL_S_PS_INIT | \ - BLE_LL_S_AS_INIT | \ - BLE_LL_S_PS_MASTER | \ - BLE_LL_S_AS_MASTER | \ - BLE_LL_S_PS_SLAVE | \ - BLE_LL_S_AS_SLAVE | \ - BLE_LL_S_INIT_MASTER | \ - BLE_LL_S_LDCA | \ - BLE_LL_S_LDCA_PS | \ - BLE_LL_S_LDCA_AS | \ - BLE_LL_S_CA_INIT | \ - BLE_LL_S_HDCA_INIT | \ - BLE_LL_S_LDCA_INIT | \ - BLE_LL_S_CA_MASTER | \ - BLE_LL_S_HDCA_MASTER | \ - BLE_LL_S_LDCA_MASTER | \ - BLE_LL_S_CA_SLAVE | \ - BLE_LL_S_HDCA_SLAVE | \ - BLE_LL_S_LDCA_SLAVE | \ - BLE_LL_S_INIT_SLAVE) - -/* The global BLE LL data object */ -struct ble_ll_obj g_ble_ll_data; - -/* Global link layer statistics */ -STATS_SECT_DECL(ble_ll_stats) ble_ll_stats; -STATS_NAME_START(ble_ll_stats) - STATS_NAME(ble_ll_stats, hci_cmds) - STATS_NAME(ble_ll_stats, hci_cmd_errs) - STATS_NAME(ble_ll_stats, hci_events_sent) - STATS_NAME(ble_ll_stats, bad_ll_state) - STATS_NAME(ble_ll_stats, bad_acl_hdr) - STATS_NAME(ble_ll_stats, no_bufs) - STATS_NAME(ble_ll_stats, rx_adv_pdu_crc_ok) - STATS_NAME(ble_ll_stats, rx_adv_pdu_crc_err) - STATS_NAME(ble_ll_stats, rx_adv_bytes_crc_ok) - STATS_NAME(ble_ll_stats, rx_adv_bytes_crc_err) - STATS_NAME(ble_ll_stats, rx_data_pdu_crc_ok) - STATS_NAME(ble_ll_stats, rx_data_pdu_crc_err) - STATS_NAME(ble_ll_stats, rx_data_bytes_crc_ok) - STATS_NAME(ble_ll_stats, rx_data_bytes_crc_err) - STATS_NAME(ble_ll_stats, rx_adv_malformed_pkts) - STATS_NAME(ble_ll_stats, rx_adv_ind) - STATS_NAME(ble_ll_stats, rx_adv_direct_ind) - STATS_NAME(ble_ll_stats, rx_adv_nonconn_ind) - STATS_NAME(ble_ll_stats, rx_adv_ext_ind) - STATS_NAME(ble_ll_stats, rx_scan_reqs) - STATS_NAME(ble_ll_stats, rx_scan_rsps) - STATS_NAME(ble_ll_stats, rx_connect_reqs) - STATS_NAME(ble_ll_stats, rx_scan_ind) - STATS_NAME(ble_ll_stats, rx_aux_connect_rsp) - STATS_NAME(ble_ll_stats, adv_txg) - STATS_NAME(ble_ll_stats, adv_late_starts) - STATS_NAME(ble_ll_stats, adv_resched_pdu_fail) - STATS_NAME(ble_ll_stats, adv_drop_event) - STATS_NAME(ble_ll_stats, sched_state_conn_errs) - STATS_NAME(ble_ll_stats, sched_state_adv_errs) - STATS_NAME(ble_ll_stats, scan_starts) - STATS_NAME(ble_ll_stats, scan_stops) - STATS_NAME(ble_ll_stats, scan_req_txf) - STATS_NAME(ble_ll_stats, scan_req_txg) - STATS_NAME(ble_ll_stats, scan_rsp_txg) - STATS_NAME(ble_ll_stats, aux_missed_adv) - STATS_NAME(ble_ll_stats, aux_scheduled) - STATS_NAME(ble_ll_stats, aux_received) - STATS_NAME(ble_ll_stats, aux_fired_for_read) - STATS_NAME(ble_ll_stats, aux_allocated) - STATS_NAME(ble_ll_stats, aux_freed) - STATS_NAME(ble_ll_stats, aux_sched_cb) - STATS_NAME(ble_ll_stats, aux_conn_req_tx) - STATS_NAME(ble_ll_stats, aux_conn_rsp_tx) - STATS_NAME(ble_ll_stats, aux_conn_rsp_err) - STATS_NAME(ble_ll_stats, aux_scan_req_tx) - STATS_NAME(ble_ll_stats, aux_scan_rsp_err) - STATS_NAME(ble_ll_stats, aux_chain_cnt) - STATS_NAME(ble_ll_stats, aux_chain_err) - STATS_NAME(ble_ll_stats, aux_scan_drop) - STATS_NAME(ble_ll_stats, adv_evt_dropped) - STATS_NAME(ble_ll_stats, scan_timer_stopped) - STATS_NAME(ble_ll_stats, scan_timer_restarted) - STATS_NAME(ble_ll_stats, periodic_adv_drop_event) - STATS_NAME(ble_ll_stats, periodic_chain_drop_event) - STATS_NAME(ble_ll_stats, sync_event_failed) - STATS_NAME(ble_ll_stats, sync_received) - STATS_NAME(ble_ll_stats, sync_chain_failed) - STATS_NAME(ble_ll_stats, sync_missed_err) - STATS_NAME(ble_ll_stats, sync_crc_err) - STATS_NAME(ble_ll_stats, sync_rx_buf_err) - STATS_NAME(ble_ll_stats, sync_scheduled) - STATS_NAME(ble_ll_stats, sched_state_sync_errs) - STATS_NAME(ble_ll_stats, sched_invalid_pdu) -STATS_NAME_END(ble_ll_stats) - -static void ble_ll_event_rx_pkt(struct ble_npl_event *ev); -static void ble_ll_event_tx_pkt(struct ble_npl_event *ev); -static void ble_ll_event_dbuf_overflow(struct ble_npl_event *ev); - -#if MYNEWT - -/* The BLE LL task data structure */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -#define BLE_LL_STACK_SIZE (120) -#else -#define BLE_LL_STACK_SIZE (90) -#endif - -struct os_task g_ble_ll_task; - -OS_TASK_STACK_DEFINE(g_ble_ll_stack, BLE_LL_STACK_SIZE); - -#endif /* MYNEWT */ - -/** Our global device address (public) */ -uint8_t g_dev_addr[BLE_DEV_ADDR_LEN]; - -/** Our random address */ -uint8_t g_random_addr[BLE_DEV_ADDR_LEN]; - -/** Our supported features which can be controller by the host */ -uint64_t g_ble_ll_supported_host_features = 0; - -static const uint16_t g_ble_ll_pdu_header_tx_time[BLE_PHY_NUM_MODE] = -{ - [BLE_PHY_MODE_1M] = - (BLE_LL_PREAMBLE_LEN + BLE_LL_ACC_ADDR_LEN + BLE_LL_CRC_LEN + - BLE_LL_PDU_HDR_LEN) << 3, - [BLE_PHY_MODE_2M] = - (BLE_LL_PREAMBLE_LEN * 2 + BLE_LL_ACC_ADDR_LEN + BLE_LL_CRC_LEN + - BLE_LL_PDU_HDR_LEN) << 2, - /* For Coded PHY we have exact TX times provided by specification: - * - Preamble, Access Address, CI, TERM1 (always coded as S=8) - * - PDU, CRC, TERM2 (coded as S=2 or S=8) - * (Vol 6, Part B, 2.2). - */ - [BLE_PHY_MODE_CODED_125KBPS] = - (80 + 256 + 16 + 24 + 8 * (BLE_LL_PDU_HDR_LEN * 8 + 24 + 3)), - [BLE_PHY_MODE_CODED_500KBPS] = - (80 + 256 + 16 + 24 + 2 * (BLE_LL_PDU_HDR_LEN * 8 + 24 + 3)), -}; - -/** - * Counts the number of advertising PDU's received, by type. For advertising - * PDU's that contain a destination address, we still count these packets even - * if they are not for us. - * - * @param pdu_type - */ -static void -ble_ll_count_rx_adv_pdus(uint8_t pdu_type) -{ - /* Count received packet types */ - switch (pdu_type) { - case BLE_ADV_PDU_TYPE_ADV_EXT_IND: - STATS_INC(ble_ll_stats, rx_adv_ext_ind); - break; - case BLE_ADV_PDU_TYPE_ADV_IND: - STATS_INC(ble_ll_stats, rx_adv_ind); - break; - case BLE_ADV_PDU_TYPE_ADV_DIRECT_IND: - STATS_INC(ble_ll_stats, rx_adv_direct_ind); - break; - case BLE_ADV_PDU_TYPE_ADV_NONCONN_IND: - STATS_INC(ble_ll_stats, rx_adv_nonconn_ind); - break; - case BLE_ADV_PDU_TYPE_SCAN_REQ: - STATS_INC(ble_ll_stats, rx_scan_reqs); - break; - case BLE_ADV_PDU_TYPE_SCAN_RSP: - STATS_INC(ble_ll_stats, rx_scan_rsps); - break; - case BLE_ADV_PDU_TYPE_CONNECT_IND: - STATS_INC(ble_ll_stats, rx_connect_reqs); - break; - case BLE_ADV_PDU_TYPE_AUX_CONNECT_RSP: - STATS_INC(ble_ll_stats, rx_aux_connect_rsp); - break; - case BLE_ADV_PDU_TYPE_ADV_SCAN_IND: - STATS_INC(ble_ll_stats, rx_scan_ind); - break; - default: - break; - } -} - -struct os_mbuf * -ble_ll_rxpdu_alloc(uint16_t len) -{ - struct os_mbuf *om_ret; - struct os_mbuf *om_next; - struct os_mbuf *om; - struct os_mbuf_pkthdr *pkthdr; - uint16_t databuf_len; - int rem_len; - - /* - * Make sure that data in mbuf are word-aligned with and without packet - * header. This is essential for proper and quick copying of received PDUs - * into mbufs. - */ - _Static_assert((offsetof(struct os_mbuf, om_data) & 3) == 0, - "Unaligned om_data"); - _Static_assert(((offsetof(struct os_mbuf, om_data) + - sizeof(struct os_mbuf_pkthdr) + - sizeof(struct ble_mbuf_hdr)) & 3) == 0, - "Unaligned data trailing packet header"); - - om_ret = os_msys_get_pkthdr(len, sizeof(struct ble_mbuf_hdr)); - if (!om_ret) { - goto rxpdu_alloc_fail; - } - - /* Set complete PDU length in packet header */ - pkthdr = OS_MBUF_PKTHDR(om_ret); - pkthdr->omp_len = len; - - rem_len = len; - - /* - * Calculate length of data in memory block. We assume length is rounded - * down to word size so PHY can do word-size aligned data copy to mbufs - * (except for last one) and leave remainder unused. - * - * Note that there likely won't be any remainder here since all pools have - * block size aligned to word size anyway. - */ - databuf_len = om_ret->om_omp->omp_databuf_len & ~3; - - /* - * First mbuf can store less data due to packet header. Also we reserve one - * word for leading space to prepend header when necessary (like for data - * PDU before handing over to HCI) - */ - om_ret->om_data += 4; - rem_len -= databuf_len - om_ret->om_pkthdr_len - 4; - - /* Allocate and chain mbufs until there's enough space to store complete PDU */ - om = om_ret; - while (rem_len > 0) { - om_next = os_msys_get(rem_len, 0); - if (!om_next) { - os_mbuf_free_chain(om_ret); - goto rxpdu_alloc_fail; - } - - SLIST_NEXT(om, om_next) = om_next; - om = om_next; - - rem_len -= databuf_len; - } - - return om_ret; - -rxpdu_alloc_fail: - STATS_INC(ble_ll_stats, no_bufs); - return NULL; -} - -int -ble_ll_chk_txrx_octets(uint16_t octets) -{ - int rc; - - if ((octets < BLE_LL_CONN_SUPP_BYTES_MIN) || - (octets > BLE_LL_CONN_SUPP_BYTES_MAX)) { - rc = 0; - } else { - rc = 1; - } - - return rc; -} - -int -ble_ll_chk_txrx_time(uint16_t time) -{ - int rc; - - if ((time < BLE_LL_CONN_SUPP_TIME_MIN) || - (time > BLE_LL_CONN_SUPP_TIME_MAX)) { - rc = 0; - } else { - rc = 1; - } - - return rc; -} - -/** - * Checks to see if the address is a resolvable private address. - * - * NOTE: the addr_type parameter will be 0 if the address is public; - * any other value is random (all non-zero values). - * - * @param addr - * @param addr_type Public (zero) or Random (non-zero) address - * - * @return int - */ -int -ble_ll_is_rpa(const uint8_t *addr, uint8_t addr_type) -{ - int rc; - - if (addr_type && ((addr[5] & 0xc0) == 0x40)) { - rc = 1; - } else { - rc = 0; - } - return rc; -} - -int -ble_ll_addr_is_id(uint8_t *addr, uint8_t addr_type) -{ - return !addr_type || ((addr[5] & 0xc0) == 0xc0); -} - -int -ble_ll_addr_subtype(const uint8_t *addr, uint8_t addr_type) -{ - if (!addr_type) { - return BLE_LL_ADDR_SUBTYPE_IDENTITY; - } - - switch (addr[5] >> 6) { - case 0: - return BLE_LL_ADDR_SUBTYPE_NRPA; /* NRPA */ - case 1: - return BLE_LL_ADDR_SUBTYPE_RPA; /* RPA */ - default: - return BLE_LL_ADDR_SUBTYPE_IDENTITY; /* static random */ - } -} - -int -ble_ll_is_valid_public_addr(const uint8_t *addr) -{ - int i; - - for (i = 0; i < BLE_DEV_ADDR_LEN; ++i) { - if (addr[i]) { - return 1; - } - } - - return 0; -} - -/* Checks to see that the device is a valid random address */ -int -ble_ll_is_valid_random_addr(const uint8_t *addr) -{ - int i; - int rc; - uint16_t sum; - uint8_t addr_type; - - /* Make sure all bits are neither one nor zero */ - sum = 0; - for (i = 0; i < (BLE_DEV_ADDR_LEN -1); ++i) { - sum += addr[i]; - } - sum += addr[5] & 0x3f; - - if ((sum == 0) || (sum == ((5*255) + 0x3f))) { - return 0; - } - - /* Get the upper two bits of the address */ - rc = 1; - addr_type = addr[5] & 0xc0; - if (addr_type == 0xc0) { - /* Static random address. No other checks needed */ - } else if (addr_type == 0x40) { - /* Resolvable */ - sum = addr[3] + addr[4] + (addr[5] & 0x3f); - if ((sum == 0) || (sum == (255 + 255 + 0x3f))) { - rc = 0; - } - } else if (addr_type == 0) { - /* non-resolvable. Cant be equal to public */ - if (!memcmp(g_dev_addr, addr, BLE_DEV_ADDR_LEN)) { - rc = 0; - } - } else { - /* Invalid upper two bits */ - rc = 0; - } - - return rc; -} -int -ble_ll_is_valid_own_addr_type(uint8_t own_addr_type, const uint8_t *random_addr) -{ - int rc; - - switch (own_addr_type) { - case BLE_HCI_ADV_OWN_ADDR_PUBLIC: -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - case BLE_HCI_ADV_OWN_ADDR_PRIV_PUB: -#endif - rc = ble_ll_is_valid_public_addr(g_dev_addr); - break; - case BLE_HCI_ADV_OWN_ADDR_RANDOM: -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - case BLE_HCI_ADV_OWN_ADDR_PRIV_RAND: -#endif - rc = ble_ll_is_valid_random_addr(random_addr); - break; - default: - rc = 0; - break; - } - - return rc; -} - -int -ble_ll_set_public_addr(const uint8_t *addr) -{ - memcpy(g_dev_addr, addr, BLE_DEV_ADDR_LEN); - - return BLE_ERR_SUCCESS; -} - -/** - * Called from the HCI command parser when the set random address command - * is received. - * - * Context: Link Layer task (HCI command parser) - * - * @param addr Pointer to address - * - * @return int 0: success - */ -int -ble_ll_set_random_addr(const uint8_t *cmdbuf, uint8_t len, bool hci_adv_ext) -{ - const struct ble_hci_le_set_rand_addr_cp *cmd = (const void *) cmdbuf; - - if (len < sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* If the Host issues this command when scanning or legacy advertising is - * enabled, the Controller shall return the error code Command Disallowed. - * - * Test specification extends this also to initiating. - */ - - if (g_ble_ll_conn_create_sm || ble_ll_scan_enabled() || - (!hci_adv_ext && ble_ll_adv_enabled())) { - return BLE_ERR_CMD_DISALLOWED; - } - - if (!ble_ll_is_valid_random_addr(cmd->addr)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - memcpy(g_random_addr, cmd->addr, BLE_DEV_ADDR_LEN); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* For instance 0 we need same address if legacy advertising might be - * used. If extended advertising is in use than this command doesn't - * affect instance 0. - */ - if (!hci_adv_ext) - ble_ll_adv_set_random_addr(cmd->addr, 0); -#endif - - return BLE_ERR_SUCCESS; -} - -/** - * Checks to see if an address is our device address (either public or - * random) - * - * @param addr - * @param addr_type - * - * @return int 0: not our device address. 1: is our device address - */ -int -ble_ll_is_our_devaddr(uint8_t *addr, int addr_type) -{ - int rc; - uint8_t *our_addr; - - if (addr_type) { - our_addr = g_random_addr; - } else { - our_addr = g_dev_addr; - } - - rc = 0; - if (!memcmp(our_addr, addr, BLE_DEV_ADDR_LEN)) { - rc = 1; - } - - return rc; -} - -/** - * Get identity address - * - * @param addr_type Random (1). Public(0) - * - * @return pointer to identity address of given type. - */ -uint8_t* -ble_ll_get_our_devaddr(uint8_t addr_type) -{ - if (addr_type) { - return g_random_addr; - } - - return g_dev_addr; -} - -/** - * Wait for response timeout function - * - * Context: interrupt (ble scheduler) - * - * @param arg - */ -void -ble_ll_wfr_timer_exp(void *arg) -{ - int rx_start; - uint8_t lls; - - rx_start = ble_phy_rx_started(); - lls = g_ble_ll_data.ll_state; - - ble_ll_trace_u32x3(BLE_LL_TRACE_ID_WFR_EXP, lls, ble_phy_xcvr_state_get(), - (uint32_t)rx_start); - - /* If we have started a reception, there is nothing to do here */ - if (!rx_start) { - switch (lls) { - case BLE_LL_STATE_ADV: - ble_ll_adv_wfr_timer_exp(); - break; - case BLE_LL_STATE_CONNECTION: - ble_ll_conn_wfr_timer_exp(); - break; - case BLE_LL_STATE_SCANNING: - ble_ll_scan_wfr_timer_exp(); - break; - case BLE_LL_STATE_INITIATING: - ble_ll_conn_init_wfr_timer_exp(); - break; -#if MYNEWT_VAL(BLE_LL_DTM) - case BLE_LL_STATE_DTM: - ble_ll_dtm_wfr_timer_exp(); - break; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - case BLE_LL_STATE_SYNC: - ble_ll_sync_wfr_timer_exp(); - break; -#endif - default: - break; - } - } -} - -/** - * ll tx pkt in proc - * - * Process ACL data packet input from host - * - * Context: Link layer task - * - */ -static void -ble_ll_tx_pkt_in(void) -{ - uint16_t handle; - uint16_t length; - uint16_t pb; - struct os_mbuf_pkthdr *pkthdr; - struct os_mbuf *om; - - /* Drain all packets off the queue */ - while (STAILQ_FIRST(&g_ble_ll_data.ll_tx_pkt_q)) { - /* Get mbuf pointer from packet header pointer */ - pkthdr = STAILQ_FIRST(&g_ble_ll_data.ll_tx_pkt_q); - om = (struct os_mbuf *)((uint8_t *)pkthdr - sizeof(struct os_mbuf)); - - /* Remove from queue */ - STAILQ_REMOVE_HEAD(&g_ble_ll_data.ll_tx_pkt_q, omp_next); - - /* Strip HCI ACL header to get handle and length */ - handle = get_le16(om->om_data); - length = get_le16(om->om_data + 2); - os_mbuf_adj(om, sizeof(struct hci_data_hdr)); - - /* Do some basic error checking */ - pb = handle & 0x3000; - if ((pkthdr->omp_len != length) || (pb > 0x1000) || (length == 0)) { - /* This is a bad ACL packet. Count a stat and free it */ - STATS_INC(ble_ll_stats, bad_acl_hdr); - os_mbuf_free_chain(om); - continue; - } - - /* Hand to connection state machine */ - ble_ll_conn_tx_pkt_in(om, handle, length); - } -} - -/** - * Count Link Layer statistics for received PDUs - * - * Context: Link layer task - * - * @param hdr - * @param len - */ -static void -ble_ll_count_rx_stats(struct ble_mbuf_hdr *hdr, uint16_t len, uint8_t pdu_type) -{ - uint8_t crcok; - bool connection_data; - - crcok = BLE_MBUF_HDR_CRC_OK(hdr); - connection_data = (BLE_MBUF_HDR_RX_STATE(hdr) == BLE_LL_STATE_CONNECTION); - -#if MYNEWT_VAL(BLE_LL_DTM) - /* Reuse connection stats for DTM */ - if (!connection_data) { - connection_data = (BLE_MBUF_HDR_RX_STATE(hdr) == BLE_LL_STATE_DTM); - } -#endif - - if (crcok) { - if (connection_data) { - STATS_INC(ble_ll_stats, rx_data_pdu_crc_ok); - STATS_INCN(ble_ll_stats, rx_data_bytes_crc_ok, len); - } else { - STATS_INC(ble_ll_stats, rx_adv_pdu_crc_ok); - STATS_INCN(ble_ll_stats, rx_adv_bytes_crc_ok, len); - ble_ll_count_rx_adv_pdus(pdu_type); - } - } else { - if (connection_data) { - STATS_INC(ble_ll_stats, rx_data_pdu_crc_err); - STATS_INCN(ble_ll_stats, rx_data_bytes_crc_err, len); - } else { - STATS_INC(ble_ll_stats, rx_adv_pdu_crc_err); - STATS_INCN(ble_ll_stats, rx_adv_bytes_crc_err, len); - } - } -} - -/** - * ll rx pkt in - * - * Process received packet from PHY. - * - * Context: Link layer task - * - */ -static void -ble_ll_rx_pkt_in(void) -{ - os_sr_t sr; - uint8_t pdu_type; - uint8_t *rxbuf; - struct os_mbuf_pkthdr *pkthdr; - struct ble_mbuf_hdr *ble_hdr; - struct os_mbuf *m; - - /* Drain all packets off the queue */ - while (STAILQ_FIRST(&g_ble_ll_data.ll_rx_pkt_q)) { - /* Get mbuf pointer from packet header pointer */ - pkthdr = STAILQ_FIRST(&g_ble_ll_data.ll_rx_pkt_q); - m = (struct os_mbuf *)((uint8_t *)pkthdr - sizeof(struct os_mbuf)); - - /* Remove from queue */ - OS_ENTER_CRITICAL(sr); - STAILQ_REMOVE_HEAD(&g_ble_ll_data.ll_rx_pkt_q, omp_next); - OS_EXIT_CRITICAL(sr); - - /* Note: pdu type wont get used unless this is an advertising pdu */ - ble_hdr = BLE_MBUF_HDR_PTR(m); - rxbuf = m->om_data; - pdu_type = rxbuf[0] & BLE_ADV_PDU_HDR_TYPE_MASK; - ble_ll_count_rx_stats(ble_hdr, pkthdr->omp_len, pdu_type); - - /* Process the data or advertising pdu */ - /* Process the PDU */ - switch (BLE_MBUF_HDR_RX_STATE(ble_hdr)) { - case BLE_LL_STATE_CONNECTION: - ble_ll_conn_rx_data_pdu(m, ble_hdr); - /* m is going to be free by function above */ - m = NULL; - break; - case BLE_LL_STATE_ADV: - ble_ll_adv_rx_pkt_in(pdu_type, rxbuf, ble_hdr); - break; - case BLE_LL_STATE_SCANNING: - ble_ll_scan_rx_pkt_in(pdu_type, m, ble_hdr); - break; - case BLE_LL_STATE_INITIATING: - ble_ll_init_rx_pkt_in(pdu_type, rxbuf, ble_hdr); - break; -#if MYNEWT_VAL(BLE_LL_DTM) - case BLE_LL_STATE_DTM: - ble_ll_dtm_rx_pkt_in(m, ble_hdr); - break; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - case BLE_LL_STATE_SYNC: - ble_ll_sync_rx_pkt_in(m, ble_hdr); - break; -#endif - default: - /* Any other state should never occur */ - STATS_INC(ble_ll_stats, bad_ll_state); - break; - } - if (m) { - /* Free the packet buffer */ - os_mbuf_free_chain(m); - } - } -} - -/** - * Called to put a packet on the Link Layer receive packet queue. - * - * @param rxpdu Pointer to received PDU - */ -void -ble_ll_rx_pdu_in(struct os_mbuf *rxpdu) -{ - struct os_mbuf_pkthdr *pkthdr; - - pkthdr = OS_MBUF_PKTHDR(rxpdu); - STAILQ_INSERT_TAIL(&g_ble_ll_data.ll_rx_pkt_q, pkthdr, omp_next); - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &g_ble_ll_data.ll_rx_pkt_ev); -} - -/** - * 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) -{ - os_sr_t sr; - struct os_mbuf_pkthdr *pkthdr; - - pkthdr = OS_MBUF_PKTHDR(txpkt); - OS_ENTER_CRITICAL(sr); - STAILQ_INSERT_TAIL(&g_ble_ll_data.ll_tx_pkt_q, pkthdr, omp_next); - OS_EXIT_CRITICAL(sr); - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &g_ble_ll_data.ll_tx_pkt_ev); -} - -/** - * Called to post event to Link Layer when a data buffer overflow has - * occurred. - * - * Context: Interrupt - * - */ -void -ble_ll_data_buffer_overflow(void) -{ - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &g_ble_ll_data.ll_dbuf_overflow_ev); -} - -/** - * Called when a HW error occurs. - * - * Context: Interrupt - */ -void -ble_ll_hw_error(void) -{ - ble_npl_callout_reset(&g_ble_ll_data.ll_hw_err_timer, 0); -} - -/** - * Called when the HW error timer expires. - * - * @param arg - */ -static void -ble_ll_hw_err_timer_cb(struct ble_npl_event *ev) -{ - if (ble_ll_hci_ev_hw_err(BLE_HW_ERR_HCI_SYNC_LOSS)) { - /* - * Restart callout if failed to allocate event. Try to allocate an - * event every 50 milliseconds (or each OS tick if a tick is longer - * than 100 msecs). - */ - ble_npl_callout_reset(&g_ble_ll_data.ll_hw_err_timer, - ble_npl_time_ms_to_ticks32(50)); - } -} - -/** - * Called upon start of received PDU - * - * Context: Interrupt - * - * @param rxpdu - * chan - * - * @return int - * < 0: A frame we dont want to receive. - * = 0: Continue to receive frame. Dont go from rx to tx - * > 0: Continue to receive frame and go from rx to tx when done - */ -int -ble_ll_rx_start(uint8_t *rxbuf, uint8_t chan, struct ble_mbuf_hdr *rxhdr) -{ - int rc; - uint8_t pdu_type; - - /* Advertising channel PDU */ - pdu_type = rxbuf[0] & BLE_ADV_PDU_HDR_TYPE_MASK; - - ble_ll_trace_u32x2(BLE_LL_TRACE_ID_RX_START, g_ble_ll_data.ll_state, - pdu_type); - - switch (g_ble_ll_data.ll_state) { - case BLE_LL_STATE_CONNECTION: - rc = ble_ll_conn_rx_isr_start(rxhdr, ble_phy_access_addr_get()); - break; - case BLE_LL_STATE_ADV: - rc = ble_ll_adv_rx_isr_start(pdu_type); - break; - case BLE_LL_STATE_INITIATING: - rc = ble_ll_init_rx_isr_start(pdu_type, rxhdr); - break; - case BLE_LL_STATE_SCANNING: - rc = ble_ll_scan_rx_isr_start(pdu_type, &rxhdr->rxinfo.flags); - break; -#if MYNEWT_VAL(BLE_LL_DTM) - case BLE_LL_STATE_DTM: - rc = ble_ll_dtm_rx_isr_start(rxhdr, ble_phy_access_addr_get()); - break; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - case BLE_LL_STATE_SYNC: - rc = ble_ll_sync_rx_isr_start(pdu_type, rxhdr); - break; -#endif - default: - /* Should not be in this state! */ - rc = -1; - STATS_INC(ble_ll_stats, bad_ll_state); - break; - } - - return rc; -} - -/** - * Called by the PHY when a receive packet has ended. - * - * NOTE: Called from interrupt context! - * - * @param rxbuf Pointer to received PDU data - * rxhdr Pointer to BLE header of received mbuf - * - * @return int - * < 0: Disable the phy after reception. - * == 0: Success. Do not disable the PHY. - * > 0: Do not disable PHY as that has already been done. - */ -int -ble_ll_rx_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr) -{ - int rc; - int badpkt; - uint8_t pdu_type; - uint8_t len; - uint8_t crcok; - struct os_mbuf *rxpdu; - - /* Get CRC status from BLE header */ - crcok = BLE_MBUF_HDR_CRC_OK(rxhdr); - - /* Get advertising PDU type and length */ - pdu_type = rxbuf[0] & BLE_ADV_PDU_HDR_TYPE_MASK; - len = rxbuf[1]; - - ble_ll_trace_u32x3(BLE_LL_TRACE_ID_RX_END, pdu_type, len, - rxhdr->rxinfo.flags); - -#if MYNEWT_VAL(BLE_LL_DTM) - if (BLE_MBUF_HDR_RX_STATE(rxhdr) == BLE_LL_STATE_DTM) { - rc = ble_ll_dtm_rx_isr_end(rxbuf, rxhdr); - return rc; - } -#endif - - if (BLE_MBUF_HDR_RX_STATE(rxhdr) == BLE_LL_STATE_CONNECTION) { - rc = ble_ll_conn_rx_isr_end(rxbuf, rxhdr); - return rc; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - if (BLE_MBUF_HDR_RX_STATE(rxhdr) == BLE_LL_STATE_SYNC) { - rc = ble_ll_sync_rx_isr_end(rxbuf, rxhdr); - return rc; - } -#endif - - /* If the CRC checks, make sure lengths check! */ - badpkt = 0; - if (crcok) { - switch (pdu_type) { - case BLE_ADV_PDU_TYPE_SCAN_REQ: - case BLE_ADV_PDU_TYPE_ADV_DIRECT_IND: - if (len != BLE_SCAN_REQ_LEN) { - badpkt = 1; - } - break; - case BLE_ADV_PDU_TYPE_SCAN_RSP: - case BLE_ADV_PDU_TYPE_ADV_IND: - case BLE_ADV_PDU_TYPE_ADV_SCAN_IND: - case BLE_ADV_PDU_TYPE_ADV_NONCONN_IND: - if ((len < BLE_DEV_ADDR_LEN) || (len > BLE_ADV_SCAN_IND_MAX_LEN)) { - badpkt = 1; - } - break; - case BLE_ADV_PDU_TYPE_AUX_CONNECT_RSP: - break; - case BLE_ADV_PDU_TYPE_ADV_EXT_IND: - break; - case BLE_ADV_PDU_TYPE_CONNECT_IND: - if (len != BLE_CONNECT_REQ_LEN) { - badpkt = 1; - } - break; - default: - badpkt = 1; - break; - } - - /* If this is a malformed packet, just kill it here */ - if (badpkt) { - STATS_INC(ble_ll_stats, rx_adv_malformed_pkts); - } - } - - /* Hand packet to the appropriate state machine (if crc ok) */ - rxpdu = NULL; - switch (BLE_MBUF_HDR_RX_STATE(rxhdr)) { - case BLE_LL_STATE_ADV: - if (!badpkt) { - rxpdu = ble_ll_rxpdu_alloc(len + BLE_LL_PDU_HDR_LEN); - if (rxpdu) { - ble_phy_rxpdu_copy(rxbuf, rxpdu); - } - } - rc = ble_ll_adv_rx_isr_end(pdu_type, rxpdu, crcok); - break; - case BLE_LL_STATE_SCANNING: - if (!badpkt) { - rxpdu = ble_ll_rxpdu_alloc(len + BLE_LL_PDU_HDR_LEN); - if (rxpdu) { - ble_phy_rxpdu_copy(rxbuf, rxpdu); - } - } - rc = ble_ll_scan_rx_isr_end(rxpdu, crcok); - break; - case BLE_LL_STATE_INITIATING: - rc = ble_ll_init_rx_isr_end(rxbuf, crcok, rxhdr); - break; - default: - rc = -1; - STATS_INC(ble_ll_stats, bad_ll_state); - break; - } - - /* Hand packet up to higher layer (regardless of CRC failure) */ - if (rxpdu) { - ble_ll_rx_pdu_in(rxpdu); - } - - return rc; -} - -uint8_t -ble_ll_tx_mbuf_pducb(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte) -{ - struct os_mbuf *txpdu; - struct ble_mbuf_hdr *ble_hdr; - - txpdu = pducb_arg; - BLE_LL_ASSERT(txpdu); - ble_hdr = BLE_MBUF_HDR_PTR(txpdu); - - os_mbuf_copydata(txpdu, ble_hdr->txinfo.offset, ble_hdr->txinfo.pyld_len, - dptr); - - *hdr_byte = ble_hdr->txinfo.hdr_byte; - - return ble_hdr->txinfo.pyld_len; -} - -uint8_t -ble_ll_tx_flat_mbuf_pducb(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte) -{ - struct os_mbuf *txpdu; - struct ble_mbuf_hdr *ble_hdr; - - txpdu = pducb_arg; - BLE_LL_ASSERT(txpdu); - ble_hdr = BLE_MBUF_HDR_PTR(txpdu); - - memcpy(dptr, txpdu->om_data, ble_hdr->txinfo.pyld_len); - - *hdr_byte = ble_hdr->txinfo.hdr_byte; - - return ble_hdr->txinfo.pyld_len; -} - -static void -ble_ll_event_rx_pkt(struct ble_npl_event *ev) -{ - ble_ll_rx_pkt_in(); -} - -static void -ble_ll_event_tx_pkt(struct ble_npl_event *ev) -{ - ble_ll_tx_pkt_in(); -} - -static void -ble_ll_event_dbuf_overflow(struct ble_npl_event *ev) -{ - ble_ll_hci_ev_databuf_overflow(); -} - -static void -ble_ll_event_comp_pkts(struct ble_npl_event *ev) -{ - ble_ll_conn_num_comp_pkts_event_send(NULL); -} - -/** - * Link Layer task. - * - * This is the task that runs the Link Layer. - * - * @param arg - */ -void -ble_ll_task(void *arg) -{ - struct ble_npl_event *ev; - - /* Init ble phy */ - ble_phy_init(); - - /* Set output power to 1mW (0 dBm) */ - ble_phy_txpwr_set(MYNEWT_VAL(BLE_LL_TX_PWR_DBM)); - - /* Register callback for transport */ - ble_hci_trans_cfg_ll(ble_ll_hci_cmd_rx, NULL, ble_ll_hci_acl_rx, NULL); - - /* Tell the host that we are ready to receive packets */ - ble_ll_hci_send_noop(); - - ble_ll_rand_start(); - - while (1) { - ev = ble_npl_eventq_get(&g_ble_ll_data.ll_evq, BLE_NPL_TIME_FOREVER); - assert(ev); - ble_npl_event_run(ev); - } -} - -/** - * ble ll state set - * - * Called to set the current link layer state. - * - * Context: Interrupt and Link Layer task - * - * @param ll_state - */ -void -ble_ll_state_set(uint8_t ll_state) -{ - g_ble_ll_data.ll_state = ll_state; -} - -/** - * ble ll state get - * - * Called to get the current link layer state. - * - * Context: Link Layer task (can be called from interrupt context though). - * - * @return ll_state - */ -uint8_t -ble_ll_state_get(void) -{ - return g_ble_ll_data.ll_state; -} - -/** - * ble ll event send - * - * Send an event to the Link Layer task - * - * @param ev Event to add to the Link Layer event queue. - */ -void -ble_ll_event_send(struct ble_npl_event *ev) -{ - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, ev); -} - -/** - * Returns the features supported by the link layer - * - * @return uint8_t bitmask of supported features. - */ -uint64_t -ble_ll_read_supp_states(void) -{ - return BLE_LL_SUPPORTED_STATES; -} - -/** - * Returns the features supported by the link layer - * - * @return uint64_t bitmask of supported features. - */ -uint64_t -ble_ll_read_supp_features(void) -{ - return g_ble_ll_data.ll_supp_features; -} - -/** - * Sets the features controlled by the host. - * - * @return HCI command status - */ -int -ble_ll_set_host_feat(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_host_feat_cp *cmd = (const void *) cmdbuf; - uint64_t mask; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (!SLIST_EMPTY(&g_ble_ll_conn_active_list)) { - return BLE_ERR_CMD_DISALLOWED; - } - - if ((cmd->bit_num > 0x3F) || (cmd->val > 1)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - mask = (uint64_t)1 << (cmd->bit_num); - if (!(mask & BLE_LL_HOST_CONTROLLED_FEATURES)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (!(mask & g_ble_ll_supported_host_features)) { - return BLE_ERR_UNSUPPORTED; - } - - if (cmd->val == 0) { - g_ble_ll_data.ll_supp_features &= ~(mask); - } else { - g_ble_ll_data.ll_supp_features |= mask; - } - - return BLE_ERR_SUCCESS; -} -/** - * Flush a link layer packet queue. - * - * @param pktq - */ -static void -ble_ll_flush_pkt_queue(struct ble_ll_pkt_q *pktq) -{ - struct os_mbuf_pkthdr *pkthdr; - struct os_mbuf *om; - - /* FLush all packets from Link layer queues */ - while (STAILQ_FIRST(pktq)) { - /* Get mbuf pointer from packet header pointer */ - pkthdr = STAILQ_FIRST(pktq); - om = OS_MBUF_PKTHDR_TO_MBUF(pkthdr); - - /* Remove from queue and free the mbuf */ - STAILQ_REMOVE_HEAD(pktq, omp_next); - os_mbuf_free_chain(om); - } -} - -/** - * Called to initialize a mbuf used by the controller - * - * NOTE: this is only used when the mbuf is created by the controller; - * it should not be used for data packets (ACL data packets) that come from - * the host. This routine assumes that the entire pdu length can fit in - * one mbuf contiguously. - * - * @param m - * @param pdulen - * @param hdr - */ -void -ble_ll_mbuf_init(struct os_mbuf *m, uint8_t pdulen, uint8_t hdr) -{ - struct ble_mbuf_hdr *ble_hdr; - - /* Set mbuf length and packet length */ - m->om_len = pdulen; - OS_MBUF_PKTHDR(m)->omp_len = pdulen; - - /* Set BLE transmit header */ - ble_hdr = BLE_MBUF_HDR_PTR(m); - ble_hdr->txinfo.flags = 0; - ble_hdr->txinfo.offset = 0; - ble_hdr->txinfo.pyld_len = pdulen; - ble_hdr->txinfo.hdr_byte = hdr; -} - -/** - * Called to reset the controller. This performs a "software reset" of the link - * layer; it does not perform a HW reset of the controller nor does it reset - * the HCI interface. - * - * Context: Link Layer task (HCI command) - * - * @return int The ble error code to place in the command complete event that - * is returned when this command is issued. - */ -int -ble_ll_reset(void) -{ - int rc; - os_sr_t sr; - - OS_ENTER_CRITICAL(sr); - ble_phy_disable(); - ble_ll_sched_stop(); - ble_ll_scan_reset(); - ble_ll_rfmgmt_reset(); - OS_EXIT_CRITICAL(sr); - - /* Stop any advertising */ - ble_ll_adv_reset(); - -#if MYNEWT_VAL(BLE_LL_DTM) - ble_ll_dtm_reset(); -#endif - - /* Stop sync */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - ble_ll_sync_reset(); -#endif - - /* FLush all packets from Link layer queues */ - ble_ll_flush_pkt_queue(&g_ble_ll_data.ll_tx_pkt_q); - ble_ll_flush_pkt_queue(&g_ble_ll_data.ll_rx_pkt_q); - - /* Reset LL stats */ - STATS_RESET(ble_ll_stats); - - /* Reset any preferred PHYs */ - g_ble_ll_data.ll_pref_tx_phys = 0; - g_ble_ll_data.ll_pref_rx_phys = 0; - - /* Reset connection module */ - ble_ll_conn_module_reset(); - - /* All this does is re-initialize the event masks so call the hci init */ - ble_ll_hci_init(); - - /* Reset scheduler */ - ble_ll_sched_init(); - - /* Set state to standby */ - ble_ll_state_set(BLE_LL_STATE_STANDBY); - - /* Reset our random address */ - memset(g_random_addr, 0, BLE_DEV_ADDR_LEN); - - /* Clear the whitelist */ - ble_ll_whitelist_clear(); - - /* Reset resolving list */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - ble_ll_resolv_list_reset(); -#endif - - /* Re-initialize the PHY */ - rc = ble_phy_init(); - - return rc; -} - -static void -ble_ll_seed_prng(void) -{ - uint32_t seed; - int i; - - /* Seed random number generator with least significant bytes of device - * address. - */ - seed = 0; - for (i = 0; i < 4; ++i) { - seed |= g_dev_addr[i]; - seed <<= 8; - } - srand(seed); -} - -uint32_t -ble_ll_pdu_tx_time_get(uint16_t payload_len, int phy_mode) -{ - uint32_t usecs; - -#if (BLE_LL_BT5_PHY_SUPPORTED) - if (phy_mode == BLE_PHY_MODE_1M) { - /* 8 usecs per byte */ - usecs = payload_len << 3; - } else if (phy_mode == BLE_PHY_MODE_2M) { - /* 4 usecs per byte */ - usecs = payload_len << 2; - } else if (phy_mode == BLE_PHY_MODE_CODED_125KBPS) { - /* S=8 => 8 * 8 = 64 usecs per byte */ - usecs = payload_len << 6; - } else if (phy_mode == BLE_PHY_MODE_CODED_500KBPS) { - /* S=2 => 2 * 8 = 16 usecs per byte */ - usecs = payload_len << 4; - } else { - BLE_LL_ASSERT(0); - } - - usecs += g_ble_ll_pdu_header_tx_time[phy_mode]; -#else - usecs = (((payload_len) + BLE_LL_PDU_HDR_LEN + BLE_LL_ACC_ADDR_LEN - + BLE_LL_PREAMBLE_LEN + BLE_LL_CRC_LEN) << 3); -#endif - - return usecs; -} - -uint16_t -ble_ll_pdu_max_tx_octets_get(uint32_t usecs, int phy_mode) -{ - uint32_t header_tx_time; - uint16_t octets = 0; - - BLE_LL_ASSERT(phy_mode < BLE_PHY_NUM_MODE); - - header_tx_time = g_ble_ll_pdu_header_tx_time[phy_mode]; - - /* - * Current conn max tx time can be too short to even send a packet header - * and this can happen if we changed connection form uncoded to coded phy. - * However, the lower bound for conn max tx time (all of them) depends on - * current phy (uncoded/coded) but it always allows to send at least 27 - * bytes of payload thus we alwyas return at least 27 from here. - * - * Reference: - * Core v5.0, Vol 6, Part B, section 4.5.10 - * see connEffectiveMaxTxTime and connEffectiveMaxRxTime definitions - */ - - if (usecs < header_tx_time) { - return 27; - } - - usecs -= header_tx_time; - - if (phy_mode == BLE_PHY_MODE_1M) { - /* 8 usecs per byte */ - octets = usecs >> 3; - } else if (phy_mode == BLE_PHY_MODE_2M) { - /* 4 usecs per byte */ - octets = usecs >> 2; - } else if (phy_mode == BLE_PHY_MODE_CODED_125KBPS) { - /* S=8 => 8 * 8 = 64 usecs per byte */ - octets = usecs >> 6; - } else if (phy_mode == BLE_PHY_MODE_CODED_500KBPS) { - /* S=2 => 2 * 8 = 16 usecs per byte */ - octets = usecs >> 4; - } else { - BLE_LL_ASSERT(0); - } - - /* see comment at the beginning */ - return max(27, octets); -} - -static inline bool -ble_ll_is_addr_empty(const uint8_t *addr) -{ - return memcmp(addr, BLE_ADDR_ANY, BLE_DEV_ADDR_LEN) == 0; -} - -/** - * Initialize the Link Layer. Should be called only once - * - * @return int - */ -void -ble_ll_init(void) -{ - int rc; - uint64_t features; - ble_addr_t addr; - struct ble_ll_obj *lldata; - - /* Ensure this function only gets called by sysinit. */ - SYSINIT_ASSERT_ACTIVE(); - - ble_ll_trace_init(); - ble_phy_trace_init(); - - /* Set public device address if not already set */ - if (ble_ll_is_addr_empty(g_dev_addr)) { - /* Use sycfg address if configured, otherwise try to read from HW */ - if (!ble_ll_is_addr_empty(MYNEWT_VAL(BLE_PUBLIC_DEV_ADDR))) { - memcpy(g_dev_addr, MYNEWT_VAL(BLE_PUBLIC_DEV_ADDR), BLE_DEV_ADDR_LEN); - } else { - rc = ble_hw_get_public_addr(&addr); - if (!rc) { - memcpy(g_dev_addr, &addr.val[0], BLE_DEV_ADDR_LEN); - } - } - } - - ble_ll_rfmgmt_init(); - - /* Get pointer to global data object */ - lldata = &g_ble_ll_data; - - /* Set acl pkt size and number */ - lldata->ll_num_acl_pkts = MYNEWT_VAL(BLE_ACL_BUF_COUNT); - lldata->ll_acl_pkt_size = MYNEWT_VAL(BLE_ACL_BUF_SIZE); - - /* Initialize eventq */ - ble_npl_eventq_init(&lldata->ll_evq); - - /* Initialize the transmit (from host) and receive (from phy) queues */ - STAILQ_INIT(&lldata->ll_tx_pkt_q); - STAILQ_INIT(&lldata->ll_rx_pkt_q); - - /* Initialize transmit (from host) and receive packet (from phy) event */ - ble_npl_event_init(&lldata->ll_rx_pkt_ev, ble_ll_event_rx_pkt, NULL); - ble_npl_event_init(&lldata->ll_tx_pkt_ev, ble_ll_event_tx_pkt, NULL); - - /* Initialize data buffer overflow event and completed packets */ - ble_npl_event_init(&lldata->ll_dbuf_overflow_ev, ble_ll_event_dbuf_overflow, NULL); - ble_npl_event_init(&lldata->ll_comp_pkt_ev, ble_ll_event_comp_pkts, NULL); - - /* Initialize the HW error timer */ - /* NOT USED WITH RAM HCI - * Commented out to prevent creating an unnecessary timer - ble_npl_callout_init(&g_ble_ll_data.ll_hw_err_timer, - &g_ble_ll_data.ll_evq, - ble_ll_hw_err_timer_cb, - NULL); - */ - - /* Initialize LL HCI */ - ble_ll_hci_init(); - - /* Init the scheduler */ - ble_ll_sched_init(); - - /* Initialize advertiser */ - ble_ll_adv_init(); - - /* Initialize a scanner */ - ble_ll_scan_init(); - - /* Initialize the connection module */ - ble_ll_conn_module_init(); - - /* Set the supported features. NOTE: we always support extended reject. */ - features = BLE_LL_FEAT_EXTENDED_REJ; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_DATA_LEN_EXT) - features |= BLE_LL_FEAT_DATA_LEN_EXT; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_CONN_PARAM_REQ) - features |= BLE_LL_FEAT_CONN_PARM_REQ; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_SLAVE_INIT_FEAT_XCHG) - features |= BLE_LL_FEAT_SLAVE_INIT; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - features |= BLE_LL_FEAT_LE_ENCRYPTION; -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - features |= (BLE_LL_FEAT_LL_PRIVACY | BLE_LL_FEAT_EXT_SCAN_FILT); - ble_ll_resolv_init(); -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING) - features |= BLE_LL_FEAT_LE_PING; -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - features |= BLE_LL_FEAT_EXT_ADV; -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) - /* CSA2 */ - features |= BLE_LL_FEAT_CSA2; -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) - features |= BLE_LL_FEAT_LE_2M_PHY; -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - features |= BLE_LL_FEAT_LE_CODED_PHY; -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - features |= BLE_LL_FEAT_PERIODIC_ADV; - ble_ll_sync_init(); -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - features |= BLE_LL_FEAT_SYNC_TRANS_RECV; - features |= BLE_LL_FEAT_SYNC_TRANS_SEND; -#endif - - /* Initialize random number generation */ - ble_ll_rand_init(); - - /* XXX: This really doesn't belong here, as the address probably has not - * been set yet. - */ - ble_ll_seed_prng(); - - lldata->ll_supp_features = features; - - rc = stats_init_and_reg(STATS_HDR(ble_ll_stats), - STATS_SIZE_INIT_PARMS(ble_ll_stats, STATS_SIZE_32), - STATS_NAME_INIT_PARMS(ble_ll_stats), - "ble_ll"); - SYSINIT_PANIC_ASSERT(rc == 0); - -#if MYNEWT_VAL(BLE_LL_DTM) - ble_ll_dtm_init(); -#endif - -#if MYNEWT - /* Initialize the LL task */ - os_task_init(&g_ble_ll_task, "ble_ll", ble_ll_task, NULL, - MYNEWT_VAL(BLE_LL_PRIO), OS_WAIT_FOREVER, g_ble_ll_stack, - BLE_LL_STACK_SIZE); -#else - -/* - * For non-Mynewt OS it is required that OS creates task for LL and run LL - * routine which is wrapped by nimble_port_ll_task_func(). - */ - -#endif -} - -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_adv.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_adv.c deleted file mode 100644 index 83fd2506c..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_adv.c +++ /dev/null @@ -1,5143 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/porting/nimble/include/os/os_cputime.h" - -#if defined(ARDUINO_ARCH_NRF5) && defined(NRF51) -#include "nimble/nimble/drivers/nrf51/include/ble/xcvr.h" -#elif defined(ARDUINO_ARCH_NRF5) && defined(NRF52_SERIES) -#include "nimble/nimble/drivers/nrf52/include/ble/xcvr.h" -#endif - -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/include/nimble/hci_common.h" -#include "nimble/nimble/include/nimble/ble_hci_trans.h" -#include "../include/controller/ble_phy.h" -#include "../include/controller/ble_hw.h" -#include "../include/controller/ble_ll.h" -#include "../include/controller/ble_ll_hci.h" -#include "../include/controller/ble_ll_adv.h" -#include "../include/controller/ble_ll_sched.h" -#include "../include/controller/ble_ll_scan.h" -#include "../include/controller/ble_ll_whitelist.h" -#include "../include/controller/ble_ll_resolv.h" -#include "../include/controller/ble_ll_trace.h" -#include "../include/controller/ble_ll_utils.h" -#include "../include/controller/ble_ll_rfmgmt.h" -#include "ble_ll_conn_priv.h" - -#ifndef ARRAY_SIZE -#define ARRAY_SIZE(array) \ - (sizeof(array) / sizeof((array)[0])) -#endif - -/* XXX: TODO - * 1) Need to look at advertising and scan request PDUs. Do I allocate these - * once? Do I use a different pool for smaller ones? Do I statically declare - * them? - * 3) How do features get supported? What happens if device does not support - * advertising? (for example) - * 4) How to determine the advertising interval we will actually use. As of - * now, we set it to max. - */ - -/* Scheduling data for secondary channel */ -struct ble_ll_adv_aux { - struct ble_ll_sched_item sch; - uint32_t start_time; - uint16_t aux_data_offset; - uint8_t chan; - uint8_t ext_hdr; - uint8_t aux_data_len; - uint8_t payload_len; -}; - -/* Scheduling data for sync PDUs */ -struct ble_ll_adv_sync { - struct ble_ll_sched_item sch; - uint32_t start_time; - uint16_t sync_data_offset; - uint8_t chan; - uint8_t ext_hdr; - uint8_t sync_data_len; - uint8_t payload_len; -}; - -/* - * Advertising state machine - * - * The advertising state machine data structure. - * - * adv_pdu_len - * The length of the advertising PDU that will be sent. This does not - * include the preamble, access address and CRC. - * - * initiator_addr: - * This is the address that we send in directed advertisements (the - * INITA field). If we are using Privacy this is a RPA that we need to - * generate. We reserve space in the advsm to save time when creating - * the ADV_DIRECT_IND. If own address type is not 2 or 3, this is simply - * the peer address from the set advertising parameters. - */ -struct ble_ll_adv_sm -{ - uint8_t adv_enabled; - uint8_t adv_instance; - uint8_t adv_chanmask; - uint8_t adv_filter_policy; - uint8_t own_addr_type; - uint8_t peer_addr_type; - uint8_t adv_chan; - uint8_t adv_pdu_len; - int8_t adv_rpa_index; - int8_t adv_txpwr; - uint16_t flags; - uint16_t props; - uint16_t adv_itvl_min; - uint16_t adv_itvl_max; - uint32_t adv_itvl_usecs; - uint32_t adv_event_start_time; - uint32_t adv_pdu_start_time; - uint32_t adv_end_time; - uint32_t adv_rpa_timer; - uint8_t adva[BLE_DEV_ADDR_LEN]; - uint8_t adv_rpa[BLE_DEV_ADDR_LEN]; - uint8_t peer_addr[BLE_DEV_ADDR_LEN]; - uint8_t initiator_addr[BLE_DEV_ADDR_LEN]; - struct os_mbuf *adv_data; - struct os_mbuf *new_adv_data; - struct os_mbuf *scan_rsp_data; - struct os_mbuf *new_scan_rsp_data; - uint8_t *conn_comp_ev; - struct ble_npl_event adv_txdone_ev; - struct ble_ll_sched_item adv_sch; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) - uint16_t channel_id; - uint16_t event_cntr; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - uint8_t aux_active : 1; - uint8_t aux_index : 1; - uint8_t aux_first_pdu : 1; - uint8_t aux_not_scanned : 1; - struct ble_mbuf_hdr *rx_ble_hdr; - struct os_mbuf **aux_data; - struct ble_ll_adv_aux aux[2]; - struct ble_npl_event adv_sec_txdone_ev; - uint16_t duration; - uint16_t adi; - uint8_t adv_random_addr[BLE_DEV_ADDR_LEN]; - uint8_t events_max; - uint8_t events; - uint8_t pri_phy; - uint8_t sec_phy; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - struct os_mbuf *periodic_adv_data; - struct os_mbuf *periodic_new_data; - uint32_t periodic_crcinit; /* only 3 bytes are used */ - uint32_t periodic_access_addr; - uint16_t periodic_adv_itvl_min; - uint16_t periodic_adv_itvl_max; - uint16_t periodic_adv_props; - uint16_t periodic_channel_id; - uint16_t periodic_event_cntr; - uint16_t periodic_chain_event_cntr; - uint8_t periodic_adv_enabled : 1; - uint8_t periodic_adv_active : 1; - uint8_t periodic_sync_active : 1; - uint8_t periodic_sync_index : 1; - uint8_t periodic_num_used_chans; - uint8_t periodic_chanmap[BLE_LL_CONN_CHMAP_LEN]; - uint32_t periodic_adv_itvl_ticks; - uint8_t periodic_adv_itvl_rem_usec; - uint8_t periodic_adv_event_start_time_remainder; - uint32_t periodic_adv_event_start_time; - struct ble_ll_adv_sync periodic_sync[2]; - struct ble_npl_event adv_periodic_txdone_ev; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - uint16_t periodic_event_cntr_last_sent; -#endif -#endif -#endif -}; - -#define BLE_LL_ADV_SM_FLAG_TX_ADD 0x0001 -#define BLE_LL_ADV_SM_FLAG_RX_ADD 0x0002 -#define BLE_LL_ADV_SM_FLAG_SCAN_REQ_NOTIF 0x0004 -#define BLE_LL_ADV_SM_FLAG_CONN_RSP_TXD 0x0008 -#define BLE_LL_ADV_SM_FLAG_ACTIVE_CHANSET_MASK 0x0030 /* use helpers! */ -#define BLE_LL_ADV_SM_FLAG_ADV_DATA_INCOMPLETE 0x0040 -#define BLE_LL_ADV_SM_FLAG_CONFIGURED 0x0080 -#define BLE_LL_ADV_SM_FLAG_ADV_RPA_TMO 0x0100 -#define BLE_LL_ADV_SM_FLAG_NEW_ADV_DATA 0x0200 -#define BLE_LL_ADV_SM_FLAG_NEW_SCAN_RSP_DATA 0x0400 -#define BLE_LL_ADV_SM_FLAG_PERIODIC_CONFIGURED 0x0800 -#define BLE_LL_ADV_SM_FLAG_PERIODIC_DATA_INCOMPLETE 0x1000 -#define BLE_LL_ADV_SM_FLAG_PERIODIC_SYNC_SENDING 0x2000 -#define BLE_LL_ADV_SM_FLAG_PERIODIC_NEW_DATA 0x4000 - -#define ADV_DATA_LEN(_advsm) \ - ((_advsm->adv_data) ? OS_MBUF_PKTLEN(advsm->adv_data) : 0) -#define SCAN_RSP_DATA_LEN(_advsm) \ - ((_advsm->scan_rsp_data) ? OS_MBUF_PKTLEN(advsm->scan_rsp_data) : 0) -#define AUX_DATA_LEN(_advsm) \ - (*(_advsm->aux_data) ? OS_MBUF_PKTLEN(*advsm->aux_data) : 0) - -#define AUX_CURRENT(_advsm) (&(_advsm->aux[_advsm->aux_index])) -#define AUX_NEXT(_advsm) (&(_advsm->aux[_advsm->aux_index ^ 1])) - -#define SYNC_CURRENT(_advsm) (&(_advsm->periodic_sync[_advsm->periodic_sync_index])) -#define SYNC_NEXT(_advsm) (&(_advsm->periodic_sync[_advsm->periodic_sync_index ^ 1])) -#define SYNC_DATA_LEN(_advsm) \ - (_advsm->periodic_adv_data ? OS_MBUF_PKTLEN(advsm->periodic_adv_data) : 0) - -/* The advertising state machine global object */ -struct ble_ll_adv_sm g_ble_ll_adv_sm[BLE_ADV_INSTANCES]; -struct ble_ll_adv_sm *g_ble_ll_cur_adv_sm; - -static struct ble_ll_adv_sm * -ble_ll_adv_sm_find_configured(uint8_t instance) -{ - struct ble_ll_adv_sm *advsm; - int i; - - /* in legacy mode we only allow instance 0 */ - if (!ble_ll_hci_adv_mode_ext()) { - BLE_LL_ASSERT(instance == 0); - return &g_ble_ll_adv_sm[0]; - } - - for (i = 0; i < ARRAY_SIZE(g_ble_ll_adv_sm); i++) { - advsm = &g_ble_ll_adv_sm[i]; - - if ((advsm->flags & BLE_LL_ADV_SM_FLAG_CONFIGURED) && - (advsm->adv_instance == instance)) { - return advsm; - } - } - - return NULL; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static int -ble_ll_adv_active_chanset_is_pri(struct ble_ll_adv_sm *advsm) -{ - return (advsm->flags & BLE_LL_ADV_SM_FLAG_ACTIVE_CHANSET_MASK) == 0x10; -} - -static int -ble_ll_adv_active_chanset_is_sec(struct ble_ll_adv_sm *advsm) -{ - return (advsm->flags & BLE_LL_ADV_SM_FLAG_ACTIVE_CHANSET_MASK) == 0x20; -} -#endif - -static void -ble_ll_adv_active_chanset_clear(struct ble_ll_adv_sm *advsm) -{ - os_sr_t sr; - - OS_ENTER_CRITICAL(sr); - advsm->flags &= ~BLE_LL_ADV_SM_FLAG_ACTIVE_CHANSET_MASK; - OS_EXIT_CRITICAL(sr); -} - -static void -ble_ll_adv_active_chanset_set_pri(struct ble_ll_adv_sm *advsm) -{ - os_sr_t sr; - - OS_ENTER_CRITICAL(sr); - assert((advsm->flags & BLE_LL_ADV_SM_FLAG_ACTIVE_CHANSET_MASK) == 0); - advsm->flags &= ~BLE_LL_ADV_SM_FLAG_ACTIVE_CHANSET_MASK; - advsm->flags |= 0x10; - OS_EXIT_CRITICAL(sr); -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static void -ble_ll_adv_active_chanset_set_sec(struct ble_ll_adv_sm *advsm) -{ - os_sr_t sr; - - OS_ENTER_CRITICAL(sr); - assert((advsm->flags & BLE_LL_ADV_SM_FLAG_ACTIVE_CHANSET_MASK) == 0); - advsm->flags &= ~BLE_LL_ADV_SM_FLAG_ACTIVE_CHANSET_MASK; - advsm->flags |= 0x20; - OS_EXIT_CRITICAL(sr); -} -#endif - -static void -ble_ll_adv_flags_set(struct ble_ll_adv_sm *advsm, uint16_t flags) -{ - os_sr_t sr; - - OS_ENTER_CRITICAL(sr); - advsm->flags |= flags; - OS_EXIT_CRITICAL(sr); -} - -static void -ble_ll_adv_flags_clear(struct ble_ll_adv_sm *advsm, uint16_t flags) -{ - os_sr_t sr; - - OS_ENTER_CRITICAL(sr); - advsm->flags &= ~flags; - OS_EXIT_CRITICAL(sr); -} - -static void ble_ll_adv_make_done(struct ble_ll_adv_sm *advsm, struct ble_mbuf_hdr *hdr); -static void ble_ll_adv_sm_init(struct ble_ll_adv_sm *advsm); -static void ble_ll_adv_sm_stop_timeout(struct ble_ll_adv_sm *advsm); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) -static void -ble_ll_adv_rpa_update(struct ble_ll_adv_sm *advsm) -{ - if (ble_ll_resolv_gen_rpa(advsm->peer_addr, advsm->peer_addr_type, - advsm->adva, 1)) { - ble_ll_adv_flags_set(advsm, BLE_LL_ADV_SM_FLAG_TX_ADD); - } else { - if (advsm->own_addr_type & 1) { - ble_ll_adv_flags_set(advsm, BLE_LL_ADV_SM_FLAG_TX_ADD); - } else { - ble_ll_adv_flags_clear(advsm, BLE_LL_ADV_SM_FLAG_TX_ADD); - } - } - - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) { - if (ble_ll_resolv_gen_rpa(advsm->peer_addr, advsm->peer_addr_type, - advsm->initiator_addr, 0)) { - ble_ll_adv_flags_set(advsm, BLE_LL_ADV_SM_FLAG_RX_ADD); - } else { - if (advsm->peer_addr_type & 1) { - ble_ll_adv_flags_set(advsm, BLE_LL_ADV_SM_FLAG_RX_ADD); - } else { - ble_ll_adv_flags_clear(advsm, BLE_LL_ADV_SM_FLAG_RX_ADD); - } - } - } -} - -/** - * Called to change advertisers ADVA and INITA (for directed advertisements) - * as an advertiser needs to adhere to the resolvable private address generation - * timer. - * - * NOTE: the resolvable private address code uses its own timer to regenerate - * local resolvable private addresses. The advertising code uses its own - * timer to reset the INITA (for directed advertisements). This code also sets - * the appropriate txadd and rxadd bits that will go into the advertisement. - * - * Another thing to note: it is possible that an IRK is all zeroes in the - * resolving list. That is why we need to check if the generated address is - * in fact a RPA as a resolving list entry with all zeroes will use the - * identity address (which may be a private address or public). - * - * @param advsm - */ -void -ble_ll_adv_chk_rpa_timeout(struct ble_ll_adv_sm *advsm) -{ - if (advsm->own_addr_type < BLE_HCI_ADV_OWN_ADDR_PRIV_PUB) { - return; - } - - if (advsm->flags & BLE_LL_ADV_SM_FLAG_ADV_RPA_TMO) { - ble_ll_adv_rpa_update(advsm); - ble_ll_adv_flags_clear(advsm, BLE_LL_ADV_SM_FLAG_ADV_RPA_TMO); - } -} - -void -ble_ll_adv_rpa_timeout(void) -{ - struct ble_ll_adv_sm *advsm; - int i; - - for (i = 0; i < BLE_ADV_INSTANCES; i++) { - advsm = &g_ble_ll_adv_sm[i]; - - if (advsm->adv_enabled && - advsm->own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) { - /* Mark RPA as timed out so we get a new RPA */ - ble_ll_adv_flags_set(advsm, BLE_LL_ADV_SM_FLAG_ADV_RPA_TMO); - } - } -} -#endif - -/** - * Calculate the first channel that we should advertise upon when we start - * an advertising event. - * - * @param advsm - * - * @return uint8_t The number of the first channel usable for advertising. - */ -static uint8_t -ble_ll_adv_first_chan(struct ble_ll_adv_sm *advsm) -{ - uint8_t adv_chan; - - /* Set first advertising channel */ - if (advsm->adv_chanmask & 0x01) { - adv_chan = BLE_PHY_ADV_CHAN_START; - } else if (advsm->adv_chanmask & 0x02) { - adv_chan = BLE_PHY_ADV_CHAN_START + 1; - } else { - adv_chan = BLE_PHY_ADV_CHAN_START + 2; - } - - return adv_chan; -} - -/** - * Calculate the final channel that we should advertise upon when we start - * an advertising event. - * - * @param advsm - * - * @return uint8_t The number of the final channel usable for advertising. - */ -static uint8_t -ble_ll_adv_final_chan(struct ble_ll_adv_sm *advsm) -{ - uint8_t adv_chan; - - if (advsm->adv_chanmask & 0x04) { - adv_chan = BLE_PHY_ADV_CHAN_START + 2; - } else if (advsm->adv_chanmask & 0x02) { - adv_chan = BLE_PHY_ADV_CHAN_START + 1; - } else { - adv_chan = BLE_PHY_ADV_CHAN_START; - } - - return adv_chan; -} - -/** - * Create the advertising legacy PDU - * - * @param advsm Pointer to advertisement state machine - */ -static uint8_t -ble_ll_adv_legacy_pdu_make(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte) -{ - struct ble_ll_adv_sm *advsm; - uint8_t adv_data_len; - uint8_t pdulen; - uint8_t pdu_type; - - advsm = pducb_arg; - - /* assume this is not a direct ind */ - adv_data_len = ADV_DATA_LEN(advsm); - pdulen = BLE_DEV_ADDR_LEN + adv_data_len; - - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) { - pdu_type = BLE_ADV_PDU_TYPE_ADV_DIRECT_IND; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) - pdu_type |= BLE_ADV_PDU_HDR_CHSEL; -#endif - - if (advsm->flags & BLE_LL_ADV_SM_FLAG_RX_ADD) { - pdu_type |= BLE_ADV_PDU_HDR_RXADD_RAND; - } - - adv_data_len = 0; - pdulen = BLE_ADV_DIRECT_IND_LEN; - } else if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE) { - pdu_type = BLE_ADV_PDU_TYPE_ADV_IND; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) - pdu_type |= BLE_ADV_PDU_HDR_CHSEL; -#endif - } else if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE) { - pdu_type = BLE_ADV_PDU_TYPE_ADV_SCAN_IND; - } else { - pdu_type = BLE_ADV_PDU_TYPE_ADV_NONCONN_IND; - } - - /* An invalid advertising data length indicates a memory overwrite */ - assert(adv_data_len <= BLE_ADV_LEGACY_DATA_MAX_LEN); - - /* Set the PDU length in the state machine (includes header) */ - advsm->adv_pdu_len = pdulen + BLE_LL_PDU_HDR_LEN; - - /* Set TxAdd to random if needed. */ - if (advsm->flags & BLE_LL_ADV_SM_FLAG_TX_ADD) { - pdu_type |= BLE_ADV_PDU_HDR_TXADD_RAND; - } - - *hdr_byte = pdu_type; - - /* Construct advertisement */ - memcpy(dptr, advsm->adva, BLE_DEV_ADDR_LEN); - dptr += BLE_DEV_ADDR_LEN; - - /* For ADV_DIRECT_IND add inita */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) { - memcpy(dptr, advsm->initiator_addr, BLE_DEV_ADDR_LEN); - } - - /* Copy in advertising data, if any */ - if (adv_data_len != 0) { - os_mbuf_copydata(advsm->adv_data, 0, adv_data_len, dptr); - } - - return pdulen; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static void -ble_ll_adv_put_aux_ptr(uint8_t chan, uint8_t phy, uint32_t offset, - uint8_t *dptr) -{ - dptr[0] = chan; - - if (offset > 245700) { - dptr[0] |= 0x80; - offset = offset / 300; - } else { - offset = offset / 30; - } - - if (offset > 0x1fff) { - offset = 0; - } - - /* offset is 13bits and PHY 3 bits */ - dptr[1] = (offset & 0x000000ff); - dptr[2] = ((offset >> 8) & 0x0000001f) | (phy - 1) << 5; -} - -/** - * Create the advertising PDU - */ -static uint8_t -ble_ll_adv_pdu_make(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte) -{ - struct ble_ll_adv_sm *advsm; - uint8_t pdu_type; - uint8_t adv_mode; - uint8_t ext_hdr_len; - uint8_t ext_hdr_flags; - uint32_t offset; - - advsm = pducb_arg; - - assert(ble_ll_adv_active_chanset_is_pri(advsm)); - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - return ble_ll_adv_legacy_pdu_make(dptr, advsm, hdr_byte); - } - - /* only ADV_EXT_IND goes on primary advertising channels */ - pdu_type = BLE_ADV_PDU_TYPE_ADV_EXT_IND; - - /* Set TxAdd to random if needed. */ - if (advsm->flags & BLE_LL_ADV_SM_FLAG_TX_ADD) { - pdu_type |= BLE_ADV_PDU_HDR_TXADD_RAND; - } - - *hdr_byte = pdu_type; - - adv_mode = 0; - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE) { - adv_mode |= BLE_LL_EXT_ADV_MODE_CONN; - } - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE) { - adv_mode |= BLE_LL_EXT_ADV_MODE_SCAN; - } - - ext_hdr_len = BLE_LL_EXT_ADV_FLAGS_SIZE + BLE_LL_EXT_ADV_DATA_INFO_SIZE + - BLE_LL_EXT_ADV_AUX_PTR_SIZE; - ext_hdr_flags = (1 << BLE_LL_EXT_ADV_DATA_INFO_BIT) | - (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT); - - /* ext hdr len and adv mode */ - dptr[0] = ext_hdr_len | (adv_mode << 6); - dptr += 1; - - /* ext hdr flags */ - dptr[0] = ext_hdr_flags; - dptr += 1; - - /* ADI */ - dptr[0] = advsm->adi & 0x00ff; - dptr[1] = advsm->adi >> 8; - dptr += BLE_LL_EXT_ADV_DATA_INFO_SIZE; - - /* AuxPtr */ - if (AUX_CURRENT(advsm)->sch.enqueued) { - offset = os_cputime_ticks_to_usecs(AUX_CURRENT(advsm)->start_time - advsm->adv_pdu_start_time); - } else { - offset = 0; - } - /* Always use channel from 1st AUX */ - ble_ll_adv_put_aux_ptr(AUX_CURRENT(advsm)->chan, advsm->sec_phy, - offset, dptr); - - return BLE_LL_EXT_ADV_HDR_LEN + ext_hdr_len; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) -static void -ble_ll_adv_put_syncinfo(struct ble_ll_adv_sm *advsm, - struct ble_ll_conn_sm *connsm, uint8_t *conn_event_cnt, - uint8_t *dptr) -{ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - uint8_t anchor_usecs; - uint16_t conn_cnt; -#endif - unsigned int event_cnt_off = 0; - uint32_t offset = 0; - uint32_t anchor; - uint8_t units; - - if (connsm) { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - anchor = connsm->anchor_point; - anchor_usecs = connsm->anchor_point_usecs; - conn_cnt = connsm->event_cntr; - - /* get anchor for conn event that is before periodic_adv_event_start_time */ - while (CPUTIME_GT(anchor, advsm->periodic_adv_event_start_time)) { - ble_ll_conn_get_anchor(connsm, --conn_cnt, &anchor, &anchor_usecs); - } - - offset = os_cputime_ticks_to_usecs(advsm->periodic_adv_event_start_time - anchor); - offset -= anchor_usecs; - offset += advsm->periodic_adv_event_start_time_remainder; - - /* connEventCount */ - put_le16(conn_event_cnt, conn_cnt); -#endif - } else { - anchor = advsm->periodic_adv_event_start_time; - - /* Get periodic event that is past AUX start time (so that we always - * provide valid offset if it is not too far in future). This can - * happen if advertising event is interleaved with periodic advertising - * event (when chaining). - */ - while (CPUTIME_GT(AUX_CURRENT(advsm)->start_time, anchor)) { - anchor += advsm->periodic_adv_itvl_ticks; - event_cnt_off++; - } - - offset = os_cputime_ticks_to_usecs(anchor - AUX_CURRENT(advsm)->start_time); - offset += advsm->periodic_adv_event_start_time_remainder; - offset += advsm->periodic_adv_itvl_rem_usec; - } - - /* Sync Packet Offset (13 bits), Offset Units (1 bit), Offset Adjust (1 bit), - * RFU (1 bit) - */ - if (offset > 245700) { - units = 0x20; - offset = offset / 300; - - if (offset >= 0x2000) { - if (connsm) { - offset -= 0x2000; - units |= 0x40; - } else { - /* not able to represent time in offset */ - offset = 0; - units = 0x00; - event_cnt_off = 0; - } - } - - } else { - units = 0x00; - offset = offset / 30; - } - - dptr[0] = (offset & 0x000000ff); - dptr[1] = ((offset >> 8) & 0x0000001f) | units; - - /* Interval (2 bytes) */ - put_le16(&dptr[2], advsm->periodic_adv_itvl_max); - - /* Channels Mask (37 bits) */ - dptr[4] = advsm->periodic_chanmap[0]; - dptr[5] = advsm->periodic_chanmap[1]; - dptr[6] = advsm->periodic_chanmap[2]; - dptr[7] = advsm->periodic_chanmap[3]; - dptr[8] = advsm->periodic_chanmap[4] & 0x1f; - - /* SCA (3 bits) */ - dptr[8] |= MYNEWT_VAL(BLE_LL_MASTER_SCA) << 5; - - /* AA (4 bytes) */ - put_le32(&dptr[9], advsm->periodic_access_addr); - - /* CRCInit (3 bytes) */ - dptr[13] = (uint8_t)advsm->periodic_crcinit; - dptr[14] = (uint8_t)(advsm->periodic_crcinit >> 8); - dptr[15] = (uint8_t)(advsm->periodic_crcinit >> 16); - - /* Event Counter (2 bytes) */ - put_le16(&dptr[16], advsm->periodic_event_cntr + event_cnt_off); -} -#endif - -/** - * Create the AUX PDU - */ -static uint8_t -ble_ll_adv_aux_pdu_make(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte) -{ - struct ble_ll_adv_sm *advsm; - struct ble_ll_adv_aux *aux; - uint8_t adv_mode; - uint8_t pdu_type; - uint8_t ext_hdr_len; - uint32_t offset; - - advsm = pducb_arg; - aux = AUX_CURRENT(advsm); - - assert(!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY)); - assert(ble_ll_adv_active_chanset_is_sec(advsm)); - - /* It's the same for AUX_ADV_IND and AUX_CHAIN_IND */ - pdu_type = BLE_ADV_PDU_TYPE_AUX_ADV_IND; - - /* We do not create scannable PDUs here - this is handled separately */ - adv_mode = 0; - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE) { - adv_mode |= BLE_LL_EXT_ADV_MODE_CONN; - } - - ext_hdr_len = aux->payload_len - BLE_LL_EXT_ADV_HDR_LEN - aux->aux_data_len; - dptr[0] = (adv_mode << 6) | ext_hdr_len; - dptr += 1; - - /* only put flags if needed */ - if (aux->ext_hdr) { - dptr[0] = aux->ext_hdr; - dptr += 1; - } - - if (aux->ext_hdr & (1 << BLE_LL_EXT_ADV_ADVA_BIT)) { - - /* Set TxAdd to random if needed. */ - if (advsm->flags & BLE_LL_ADV_SM_FLAG_TX_ADD) { - pdu_type |= BLE_ADV_PDU_HDR_TXADD_RAND; - } - - memcpy(dptr, advsm->adva, BLE_LL_EXT_ADV_ADVA_SIZE); - dptr += BLE_LL_EXT_ADV_ADVA_SIZE; - } - - if (aux->ext_hdr & (1 << BLE_LL_EXT_ADV_TARGETA_BIT)) { - memcpy(dptr, advsm->initiator_addr, BLE_LL_EXT_ADV_TARGETA_SIZE); - dptr += BLE_LL_EXT_ADV_TARGETA_SIZE; - - /* Set RxAdd to random if needed. */ - if (advsm->flags & BLE_LL_ADV_SM_FLAG_RX_ADD) { - pdu_type |= BLE_ADV_PDU_HDR_RXADD_RAND; - } - } - - if (aux->ext_hdr & (1 << BLE_LL_EXT_ADV_DATA_INFO_BIT)) { - dptr[0] = advsm->adi & 0x00ff; - dptr[1] = advsm->adi >> 8; - dptr += BLE_LL_EXT_ADV_DATA_INFO_SIZE; - } - - if (aux->ext_hdr & (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT)) { - if (!AUX_NEXT(advsm)->sch.enqueued) { - /* - * Trim data here in case we do not have next aux scheduled. This - * can happen if next aux was outside advertising set period and - * was removed from scheduler. - */ - offset = 0; - } else if (advsm->rx_ble_hdr) { - offset = os_cputime_ticks_to_usecs(AUX_NEXT(advsm)->start_time - advsm->rx_ble_hdr->beg_cputime); - offset -= (advsm->rx_ble_hdr->rem_usecs + ble_ll_pdu_tx_time_get(12, advsm->sec_phy) + BLE_LL_IFS); - } else { - offset = os_cputime_ticks_to_usecs(AUX_NEXT(advsm)->start_time - aux->start_time); - } - - ble_ll_adv_put_aux_ptr(AUX_NEXT(advsm)->chan, advsm->sec_phy, - offset, dptr); - - dptr += BLE_LL_EXT_ADV_AUX_PTR_SIZE; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - if (aux->ext_hdr & (1 << BLE_LL_EXT_ADV_SYNC_INFO_BIT)) { - ble_ll_adv_put_syncinfo(advsm, NULL, NULL, dptr); - dptr += BLE_LL_EXT_ADV_SYNC_INFO_SIZE; - } -#endif - - if (aux->ext_hdr & (1 << BLE_LL_EXT_ADV_TX_POWER_BIT)) { - dptr[0] = advsm->adv_txpwr + ble_ll_get_tx_pwr_compensation(); - dptr += BLE_LL_EXT_ADV_TX_POWER_SIZE; - } - - if (aux->aux_data_len) { - os_mbuf_copydata(*advsm->aux_data, aux->aux_data_offset, - aux->aux_data_len, dptr); - } - - *hdr_byte = pdu_type; - - return aux->payload_len; -} - -static uint8_t -ble_ll_adv_aux_scannable_pdu_make(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte) -{ - struct ble_ll_adv_sm *advsm; - uint8_t pdu_type; - uint8_t *ext_hdr_len; - uint8_t *ext_hdr; - uint8_t pdulen; - - advsm = pducb_arg; - - assert(!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY)); - assert(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE); - assert(advsm->aux_first_pdu); - assert(ble_ll_adv_active_chanset_is_sec(advsm)); - - pdu_type = BLE_ADV_PDU_TYPE_AUX_ADV_IND; - - ext_hdr_len = &dptr[0]; - ext_hdr = &dptr[1]; - dptr += 2; - - /* Flags always */ - *ext_hdr_len = BLE_LL_EXT_ADV_FLAGS_SIZE; - *ext_hdr = 0; - - /* AdvA when non anonymous */ - if (!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_ANON_ADV)) { - /* Set TxAdd to random if needed. */ - if (advsm->flags & BLE_LL_ADV_SM_FLAG_TX_ADD) { - pdu_type |= BLE_ADV_PDU_HDR_TXADD_RAND; - } - - *ext_hdr_len += BLE_LL_EXT_ADV_ADVA_SIZE; - *ext_hdr |= (1 << BLE_LL_EXT_ADV_ADVA_BIT); - memcpy(dptr, advsm->adva, BLE_LL_EXT_ADV_ADVA_SIZE); - dptr += BLE_LL_EXT_ADV_ADVA_SIZE; - } - - /* TargetA only for directed */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) { - *ext_hdr_len += BLE_LL_EXT_ADV_TARGETA_SIZE; - *ext_hdr |= (1 << BLE_LL_EXT_ADV_TARGETA_BIT); - memcpy(dptr, advsm->initiator_addr, BLE_LL_EXT_ADV_TARGETA_SIZE); - dptr += BLE_LL_EXT_ADV_TARGETA_SIZE; - - /* Set RxAdd to random if needed. */ - if (advsm->flags & BLE_LL_ADV_SM_FLAG_RX_ADD) { - pdu_type |= BLE_ADV_PDU_HDR_RXADD_RAND; - } - } - - /* ADI always */ - *ext_hdr_len += BLE_LL_EXT_ADV_DATA_INFO_SIZE; - *ext_hdr |= (1 << BLE_LL_EXT_ADV_DATA_INFO_BIT); - dptr[0] = advsm->adi & 0x00ff; - dptr[1] = advsm->adi >> 8; - dptr += BLE_LL_EXT_ADV_DATA_INFO_SIZE; - - /* TxPower if configured */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_INC_TX_PWR) { - *ext_hdr_len += BLE_LL_EXT_ADV_TX_POWER_SIZE; - *ext_hdr |= (1 << BLE_LL_EXT_ADV_TX_POWER_BIT); - dptr[0] = advsm->adv_txpwr + ble_ll_get_tx_pwr_compensation(); - dptr += BLE_LL_EXT_ADV_TX_POWER_SIZE; - } - - pdulen = BLE_LL_EXT_ADV_HDR_LEN + *ext_hdr_len; - - *hdr_byte = pdu_type; - *ext_hdr_len |= (BLE_LL_EXT_ADV_MODE_SCAN << 6); - - return pdulen; -} -#endif - -static uint8_t -ble_ll_adv_scan_rsp_legacy_pdu_make(uint8_t *dptr, void *pducb_arg, - uint8_t *hdr_byte) -{ - struct ble_ll_adv_sm *advsm; - uint8_t scan_rsp_len; - uint8_t pdulen; - uint8_t hdr; - - advsm = pducb_arg; - - /* Make sure that the length is valid */ - scan_rsp_len = SCAN_RSP_DATA_LEN(advsm); - assert(scan_rsp_len <= BLE_SCAN_RSP_LEGACY_DATA_MAX_LEN); - - /* Set BLE transmit header */ - pdulen = BLE_DEV_ADDR_LEN + scan_rsp_len; - hdr = BLE_ADV_PDU_TYPE_SCAN_RSP; - if (advsm->flags & BLE_LL_ADV_SM_FLAG_TX_ADD) { - hdr |= BLE_ADV_PDU_HDR_TXADD_RAND; - } - - *hdr_byte = hdr; - - /* - * The adva in this packet will be the same one that was being advertised - * and is based on the peer identity address in the set advertising - * parameters. If a different peer sends us a scan request (for some reason) - * we will reply with an adva that was not generated based on the local irk - * of the peer sending the scan request. - */ - - /* Construct scan response */ - memcpy(dptr, advsm->adva, BLE_DEV_ADDR_LEN); - if (scan_rsp_len != 0) { - os_mbuf_copydata(advsm->scan_rsp_data, 0, scan_rsp_len, - dptr + BLE_DEV_ADDR_LEN); - } - - return pdulen; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -/** - * Create a scan response PDU - * - * @param advsm - */ -static uint8_t -ble_ll_adv_scan_rsp_pdu_make(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte) -{ - struct ble_ll_adv_sm *advsm; - - advsm = pducb_arg; - - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - return ble_ll_adv_scan_rsp_legacy_pdu_make(dptr, pducb_arg, hdr_byte); - } - - return ble_ll_adv_aux_pdu_make(dptr, pducb_arg, hdr_byte); -} - -struct aux_conn_rsp_data { - struct ble_ll_adv_sm *advsm; - uint8_t *peer; - uint8_t rxadd; -}; - -/** - * Create a AUX connect response PDU - * - * @param advsm - */ -static uint8_t -ble_ll_adv_aux_conn_rsp_pdu_make(uint8_t *dptr, void *pducb_arg, - uint8_t *hdr_byte) -{ - struct aux_conn_rsp_data *rsp_data; - uint8_t pdulen; - uint8_t ext_hdr_len; - uint8_t ext_hdr_flags; - uint8_t hdr; - - rsp_data = pducb_arg; - - /* flags,AdvA and TargetA */ - ext_hdr_len = BLE_LL_EXT_ADV_FLAGS_SIZE + BLE_LL_EXT_ADV_ADVA_SIZE + - BLE_LL_EXT_ADV_TARGETA_SIZE; - ext_hdr_flags = (1 << BLE_LL_EXT_ADV_ADVA_BIT); - ext_hdr_flags |= (1 << BLE_LL_EXT_ADV_TARGETA_BIT); - - pdulen = BLE_LL_EXT_ADV_HDR_LEN + ext_hdr_len; - - /* Set BLE transmit header */ - hdr = BLE_ADV_PDU_TYPE_AUX_CONNECT_RSP; - if (rsp_data->rxadd) { - hdr |= BLE_ADV_PDU_HDR_RXADD_MASK; - } - if (rsp_data->advsm->flags & BLE_LL_ADV_SM_FLAG_TX_ADD) { - hdr |= BLE_ADV_PDU_HDR_TXADD_MASK; - } - - *hdr_byte = hdr; - - /* ext hdr len and adv mode (00b) */ - dptr[0] = ext_hdr_len; - dptr += 1; - - /* ext hdr flags */ - dptr[0] = ext_hdr_flags; - dptr += 1; - - memcpy(dptr, rsp_data->advsm->adva, BLE_LL_EXT_ADV_ADVA_SIZE); - dptr += BLE_LL_EXT_ADV_ADVA_SIZE; - - memcpy(dptr, rsp_data->peer, BLE_LL_EXT_ADV_TARGETA_SIZE); - dptr += BLE_LL_EXT_ADV_ADVA_SIZE; - - return pdulen; -} -#endif - -/** - * Called to indicate the advertising event is over. - * - * Context: Interrupt - * - * @param advsm - * - */ -static void -ble_ll_adv_tx_done(void *arg) -{ - struct ble_ll_adv_sm *advsm; - - /* reset power to max after advertising */ - ble_phy_txpwr_set(MYNEWT_VAL(BLE_LL_TX_PWR_DBM)); - - advsm = (struct ble_ll_adv_sm *)arg; - - ble_ll_trace_u32x2(BLE_LL_TRACE_ID_ADV_TXDONE, advsm->adv_instance, - advsm->flags & BLE_LL_ADV_SM_FLAG_ACTIVE_CHANSET_MASK); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (ble_ll_adv_active_chanset_is_pri(advsm)) { - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &advsm->adv_txdone_ev); - } else if (ble_ll_adv_active_chanset_is_sec(advsm)) { - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &advsm->adv_sec_txdone_ev); - } else { - assert(0); - } -#else - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &advsm->adv_txdone_ev); -#endif - - ble_ll_state_set(BLE_LL_STATE_STANDBY); - - ble_ll_adv_active_chanset_clear(advsm); - - /* We no longer have a current state machine */ - g_ble_ll_cur_adv_sm = NULL; -} - -/* - * 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) -{ - /* - * Need to set advertising channel to final chan so new event gets - * scheduled. - */ - advsm->adv_chan = ble_ll_adv_final_chan(advsm); - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &advsm->adv_txdone_ev); -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) -/* - * 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) -{ - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &advsm->adv_periodic_txdone_ev); -} -#endif - -/** - * This is the scheduler callback (called from interrupt context) which - * transmits an advertisement. - * - * Context: Interrupt (scheduler) - * - * @param sch - * - * @return int - */ -static int -ble_ll_adv_tx_start_cb(struct ble_ll_sched_item *sch) -{ - int rc; - uint8_t end_trans; - uint32_t txstart; - struct ble_ll_adv_sm *advsm; - - /* Get the state machine for the event */ - advsm = (struct ble_ll_adv_sm *)sch->cb_arg; - - /* Set the current advertiser */ - g_ble_ll_cur_adv_sm = advsm; - - ble_ll_adv_active_chanset_set_pri(advsm); - - if ((advsm->flags & BLE_LL_ADV_SM_FLAG_NEW_ADV_DATA) || - (advsm->flags & BLE_LL_ADV_SM_FLAG_NEW_SCAN_RSP_DATA)) { - goto adv_tx_done; - } - - /* Set the power */ - ble_phy_txpwr_set(advsm->adv_txpwr); - - /* Set channel */ - rc = ble_phy_setchan(advsm->adv_chan, BLE_ACCESS_ADDR_ADV, BLE_LL_CRCINIT_ADV); - assert(rc == 0); - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - /* Set phy mode */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - ble_phy_mode_set(BLE_PHY_MODE_1M, BLE_PHY_MODE_1M); - } else { - ble_phy_mode_set(advsm->pri_phy, advsm->pri_phy); - } -#else - ble_phy_mode_set(BLE_PHY_MODE_1M, BLE_PHY_MODE_1M); -#endif -#endif - - /* Set transmit start time. */ - txstart = sch->start_time + g_ble_ll_sched_offset_ticks; - rc = ble_phy_tx_set_start_time(txstart, sch->remainder); - if (rc) { - STATS_INC(ble_ll_stats, adv_late_starts); - goto adv_tx_done; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - ble_phy_encrypt_disable(); -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - advsm->adv_rpa_index = -1; - if (ble_ll_resolv_enabled()) { - ble_phy_resolv_list_enable(); - } else { - ble_phy_resolv_list_disable(); - } -#endif - - /* We switch to RX after connectable or scannable legacy packets. */ - if ((advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) && - ((advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE) || - (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE))) { - end_trans = BLE_PHY_TRANSITION_TX_RX; - ble_phy_set_txend_cb(NULL, NULL); - } else { - end_trans = BLE_PHY_TRANSITION_NONE; - ble_phy_set_txend_cb(ble_ll_adv_tx_done, advsm); - } - - /* Transmit advertisement */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - rc = ble_phy_tx(ble_ll_adv_pdu_make, advsm, end_trans); -#else - rc = ble_phy_tx(ble_ll_adv_legacy_pdu_make, advsm, end_trans); -#endif - if (rc) { - goto adv_tx_done; - } - - /* Enable/disable whitelisting based on filter policy */ - if (advsm->adv_filter_policy != BLE_HCI_ADV_FILT_NONE) { - ble_ll_whitelist_enable(); - } else { - ble_ll_whitelist_disable(); - } - - /* Set link layer state to advertising */ - ble_ll_state_set(BLE_LL_STATE_ADV); - - /* Count # of adv. sent */ - STATS_INC(ble_ll_stats, adv_txg); - - return BLE_LL_SCHED_STATE_RUNNING; - -adv_tx_done: - ble_ll_adv_tx_done(advsm); - return BLE_LL_SCHED_STATE_DONE; -} - -static void -ble_ll_adv_set_sched(struct ble_ll_adv_sm *advsm) -{ - uint32_t max_usecs; - struct ble_ll_sched_item *sch; - - sch = &advsm->adv_sch; - sch->cb_arg = advsm; - sch->sched_cb = ble_ll_adv_tx_start_cb; - sch->sched_type = BLE_LL_SCHED_TYPE_ADV; - - /* Set end time to maximum time this schedule item may take */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - max_usecs = ble_ll_pdu_tx_time_get(advsm->adv_pdu_len, BLE_PHY_MODE_1M); - - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) { - max_usecs += BLE_LL_SCHED_DIRECT_ADV_MAX_USECS; - } else if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE) { - max_usecs += BLE_LL_SCHED_ADV_MAX_USECS; - } - } else { - /* - * In ADV_EXT_IND we always set only ADI and AUX so the payload length - * is always 7 bytes. - */ - max_usecs = ble_ll_pdu_tx_time_get(7, advsm->pri_phy); - } -#else - max_usecs = ble_ll_pdu_tx_time_get(advsm->adv_pdu_len, BLE_PHY_MODE_1M); - - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) { - max_usecs += BLE_LL_SCHED_DIRECT_ADV_MAX_USECS; - } else if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE) { - max_usecs += BLE_LL_SCHED_ADV_MAX_USECS; - } -#endif - - sch->start_time = advsm->adv_pdu_start_time - g_ble_ll_sched_offset_ticks; - sch->remainder = 0; - sch->end_time = advsm->adv_pdu_start_time + - ble_ll_usecs_to_ticks_round_up(max_usecs); -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static int -ble_ll_adv_secondary_tx_start_cb(struct ble_ll_sched_item *sch) -{ - int rc; - uint8_t end_trans; - uint32_t txstart; - struct ble_ll_adv_sm *advsm; - ble_phy_tx_pducb_t pducb; - struct ble_ll_adv_aux *aux; - - /* Get the state machine for the event */ - advsm = (struct ble_ll_adv_sm *)sch->cb_arg; - - /* Set the current advertiser */ - g_ble_ll_cur_adv_sm = advsm; - - ble_ll_adv_active_chanset_set_sec(advsm); - - /* Set the power */ - ble_phy_txpwr_set(advsm->adv_txpwr); - - /* Set channel */ - aux = AUX_CURRENT(advsm); - rc = ble_phy_setchan(aux->chan, BLE_ACCESS_ADDR_ADV, - BLE_LL_CRCINIT_ADV); - assert(rc == 0); - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - /* Set phy mode */ - ble_phy_mode_set(advsm->sec_phy, advsm->sec_phy); -#endif - - /* Set transmit start time. */ - txstart = sch->start_time + g_ble_ll_sched_offset_ticks; - rc = ble_phy_tx_set_start_time(txstart, sch->remainder); - if (rc) { - STATS_INC(ble_ll_stats, adv_late_starts); - goto adv_tx_done; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - ble_phy_encrypt_disable(); -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - advsm->adv_rpa_index = -1; - if (ble_ll_resolv_enabled()) { - ble_phy_resolv_list_enable(); - } else { - ble_phy_resolv_list_disable(); - } -#endif - - /* Set phy mode based on type of advertisement */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE) { - end_trans = BLE_PHY_TRANSITION_TX_RX; - ble_phy_set_txend_cb(NULL, NULL); - pducb = ble_ll_adv_aux_pdu_make; - } else if ((advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE) && - advsm->aux_first_pdu) { - end_trans = BLE_PHY_TRANSITION_TX_RX; - ble_phy_set_txend_cb(NULL, NULL); - pducb = ble_ll_adv_aux_scannable_pdu_make; - } else { - end_trans = BLE_PHY_TRANSITION_NONE; - ble_phy_set_txend_cb(ble_ll_adv_tx_done, advsm); - pducb = ble_ll_adv_aux_pdu_make; - } - - /* Transmit advertisement */ - rc = ble_phy_tx(pducb, advsm, end_trans); - if (rc) { - goto adv_tx_done; - } - - /* Enable/disable whitelisting based on filter policy */ - if (advsm->adv_filter_policy != BLE_HCI_ADV_FILT_NONE) { - ble_ll_whitelist_enable(); - } else { - ble_ll_whitelist_disable(); - } - - /* Set link layer state to advertising */ - ble_ll_state_set(BLE_LL_STATE_ADV); - - /* Count # of adv. sent */ - STATS_INC(ble_ll_stats, adv_txg); - - return BLE_LL_SCHED_STATE_RUNNING; - -adv_tx_done: - ble_ll_adv_tx_done(advsm); - return BLE_LL_SCHED_STATE_DONE; -} - -static uint8_t -ble_ll_adv_aux_scannable_pdu_payload_len(struct ble_ll_adv_sm *advsm) -{ - uint8_t len; - - /* Flags, ADI always */ - len = BLE_LL_EXT_ADV_HDR_LEN + BLE_LL_EXT_ADV_FLAGS_SIZE - + BLE_LL_EXT_ADV_DATA_INFO_SIZE; - - /* AdvA if not anonymous */ - if (!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_ANON_ADV)) { - len += BLE_LL_EXT_ADV_ADVA_SIZE; - } - - /* TargetA only for directed */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) { - len += BLE_LL_EXT_ADV_TARGETA_SIZE; - } - - /* TxPower if configured */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_INC_TX_PWR) { - len += BLE_LL_EXT_ADV_TX_POWER_SIZE; - } - - return len; -} - -static void -ble_ll_adv_aux_calculate(struct ble_ll_adv_sm *advsm, - struct ble_ll_adv_aux *aux, uint16_t aux_data_offset) -{ - uint16_t rem_aux_data_len; - uint8_t hdr_len; - bool chainable; - - assert(!aux->sch.enqueued); - assert((AUX_DATA_LEN(advsm) > aux_data_offset) || - (AUX_DATA_LEN(advsm) == 0 && aux_data_offset == 0)); - - aux->aux_data_offset = aux_data_offset; - aux->aux_data_len = 0; - aux->payload_len = 0; - aux->ext_hdr = 0; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) - aux->chan = ble_ll_utils_calc_dci_csa2(advsm->event_cntr++, - advsm->channel_id, - g_ble_ll_conn_params.num_used_chans, - g_ble_ll_conn_params.master_chan_map); -#else - aux->chan = ble_ll_utils_remapped_channel(rand() % BLE_PHY_NUM_DATA_CHANS, - g_ble_ll_conn_params.master_chan_map); -#endif - - rem_aux_data_len = AUX_DATA_LEN(advsm) - aux_data_offset; - chainable = !(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE); - - hdr_len = BLE_LL_EXT_ADV_HDR_LEN; - - if (!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE)) { - /* ADI */ - aux->ext_hdr |= (1 << BLE_LL_EXT_ADV_DATA_INFO_BIT); - hdr_len += BLE_LL_EXT_ADV_DATA_INFO_SIZE; - } - - /* AdvA for 1st PDU in chain (i.e. AUX_ADV_IND or AUX_SCAN_RSP) */ - if (aux_data_offset == 0 && - !(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_ANON_ADV)) { - aux->ext_hdr |= (1 << BLE_LL_EXT_ADV_ADVA_BIT); - hdr_len += BLE_LL_EXT_ADV_ADVA_SIZE; - } - - /* Note: this function does not calculate AUX_ADV_IND when advertising is - * scannable. Instead it is calculated in ble_ll_adv_aux_schedule_first(). - * - * However this function calculates length of AUX_SCAN_RSP and according - * to BT 5.0 Vol 6 Part B, 2.3.2.3, TargetA shall not be include there. - * - * This is why TargetA is added to all directed advertising here unless it - * is scannable one. - * - * Note. TargetA shall not be also in AUX_CHAIN_IND - */ - if (aux_data_offset == 0 && - (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) && - !(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE)) { - aux->ext_hdr |= (1 << BLE_LL_EXT_ADV_TARGETA_BIT); - hdr_len += BLE_LL_EXT_ADV_TARGETA_SIZE; - } - - /* TxPower if configured. - * Note: TxPower should not be be present in AUX_CHAIN_IND - */ - if (aux_data_offset == 0 && - (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_INC_TX_PWR)) { - aux->ext_hdr |= (1 << BLE_LL_EXT_ADV_TX_POWER_BIT); - hdr_len += BLE_LL_EXT_ADV_TX_POWER_SIZE; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - /* SyncInfo for 1st PDU in chain (i.e. AUX_ADV_IND only) if periodic - * advertising is enabled - */ - if (aux_data_offset == 0 && advsm->periodic_adv_active) { - aux->ext_hdr |= (1 << BLE_LL_EXT_ADV_SYNC_INFO_BIT); - hdr_len += BLE_LL_EXT_ADV_SYNC_INFO_SIZE; - } -#endif - - /* if we have any fields in ext header we need to add flags, note that Aux - * PTR is handled later and it will account for flags if needed - */ - if (aux->ext_hdr) { - hdr_len += BLE_LL_EXT_ADV_FLAGS_SIZE; - } - - /* AdvData always */ - aux->aux_data_len = min(BLE_LL_MAX_PAYLOAD_LEN - hdr_len, rem_aux_data_len); - - /* AuxPtr if there are more AdvData remaining that we can fit here */ - if (chainable && (rem_aux_data_len > aux->aux_data_len)) { - /* adjust for flags that needs to be added if AuxPtr is only field - * in Extended Header - */ - if (!aux->ext_hdr) { - hdr_len += BLE_LL_EXT_ADV_FLAGS_SIZE; - aux->aux_data_len -= BLE_LL_EXT_ADV_FLAGS_SIZE; - } - - aux->ext_hdr |= (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT); - hdr_len += BLE_LL_EXT_ADV_AUX_PTR_SIZE; - aux->aux_data_len -= BLE_LL_EXT_ADV_AUX_PTR_SIZE; - - /* PDU payload should be full if chained */ - assert(hdr_len + aux->aux_data_len == BLE_LL_MAX_PAYLOAD_LEN); - } - - aux->payload_len = hdr_len + aux->aux_data_len; -} - -static void -ble_ll_adv_aux_scheduled(struct ble_ll_adv_sm *advsm, uint32_t sch_start, - void *arg) -{ - struct ble_ll_adv_aux *aux = arg; - - aux->start_time = sch_start + g_ble_ll_sched_offset_ticks; -} - -static void -ble_ll_adv_aux_schedule_next(struct ble_ll_adv_sm *advsm) -{ - struct ble_ll_adv_aux *aux; - struct ble_ll_adv_aux *aux_next; - struct ble_ll_sched_item *sch; - uint16_t rem_aux_data_len; - uint16_t next_aux_data_offset; - uint32_t max_usecs; - - assert(advsm->aux_active); - - aux = AUX_CURRENT(advsm); - aux_next = AUX_NEXT(advsm); - - assert(!aux_next->sch.enqueued); - - /* - * Do not schedule next aux if current aux is no longer scheduled since we - * do not have reference time for scheduling. - */ - if (!aux->sch.enqueued) { - return; - } - - /* - * Do not schedule next aux if current aux does not have AuxPtr in extended - * header as this means we do not need subsequent ADV_CHAIN_IND to be sent. - */ - if (!(aux->ext_hdr & (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT))) { - return; - } - - next_aux_data_offset = aux->aux_data_offset + aux->aux_data_len; - - assert(AUX_DATA_LEN(advsm) >= next_aux_data_offset); - - rem_aux_data_len = AUX_DATA_LEN(advsm) - next_aux_data_offset; - assert(rem_aux_data_len > 0); - - ble_ll_adv_aux_calculate(advsm, aux_next, next_aux_data_offset); - max_usecs = ble_ll_pdu_tx_time_get(aux_next->payload_len, advsm->sec_phy); - - aux_next->start_time = aux->sch.end_time + - ble_ll_usecs_to_ticks_round_up(BLE_LL_MAFS + MYNEWT_VAL(BLE_LL_SCHED_AUX_CHAIN_MAFS_DELAY)); - - sch = &aux_next->sch; - sch->start_time = aux_next->start_time - g_ble_ll_sched_offset_ticks; - sch->remainder = 0; - sch->end_time = aux_next->start_time + - ble_ll_usecs_to_ticks_round_up(max_usecs); - ble_ll_sched_adv_new(&aux_next->sch, ble_ll_adv_aux_scheduled, aux_next); - - /* - * In case duration is set for advertising set we need to check if newly - * scheduled aux will fit inside duration. If not, remove it from scheduler - * so advertising will stop after current aux. - */ - if (advsm->duration && (aux_next->sch.end_time > advsm->adv_end_time)) { - ble_ll_sched_rmv_elem(&aux_next->sch); - } -} - -static void -ble_ll_adv_aux_schedule_first(struct ble_ll_adv_sm *advsm) -{ - struct ble_ll_adv_aux *aux; - struct ble_ll_sched_item *sch; - uint32_t max_usecs; - - assert(!advsm->aux_active); - assert(!advsm->aux[0].sch.enqueued); - assert(!advsm->aux[1].sch.enqueued); - - advsm->aux_active = 1; - advsm->aux_index = 0; - advsm->aux_first_pdu = 1; - advsm->aux_not_scanned = 0; - - aux = AUX_CURRENT(advsm); - ble_ll_adv_aux_calculate(advsm, aux, 0); - - /* Set end time to maximum time this schedule item may take */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE) { - max_usecs = ble_ll_pdu_tx_time_get(aux->payload_len, advsm->sec_phy) + - BLE_LL_IFS + - /* AUX_CONN_REQ */ - ble_ll_pdu_tx_time_get(34 + 14, advsm->sec_phy) + - BLE_LL_IFS + - /* AUX_CONN_RSP */ - ble_ll_pdu_tx_time_get(14, advsm->sec_phy); - } else if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE) { - /* For scannable advertising we need to calculate how much time we - * need for AUX_ADV_IND along with AUX_SCAN_REQ, AUX_SCAN_RSP and - * IFS in between. - * - * Note: - * 1. aux->payload_len, which calculated by above ble_ll_adv_aux_calulcate(), - * contains AUX_SCAN_RSP length. - * 2. length of AUX_ADV_IND is calculated by special function: - * ble_ll_adv_aux_scannable_pdu_payload_len() - */ - max_usecs = ble_ll_pdu_tx_time_get(ble_ll_adv_aux_scannable_pdu_payload_len(advsm), - advsm->sec_phy) + - BLE_LL_IFS + - /* AUX_SCAN_REQ */ - ble_ll_pdu_tx_time_get(12, advsm->sec_phy) + - BLE_LL_IFS + - /* AUX_SCAN_RSP */ - ble_ll_pdu_tx_time_get(aux->payload_len, advsm->sec_phy); - } else { - max_usecs = ble_ll_pdu_tx_time_get(aux->payload_len, advsm->sec_phy); - } - - sch = &aux->sch; - sch->start_time = aux->start_time - g_ble_ll_sched_offset_ticks; - sch->remainder = 0; - sch->end_time = aux->start_time + ble_ll_usecs_to_ticks_round_up(max_usecs); - ble_ll_sched_adv_new(sch, ble_ll_adv_aux_scheduled, aux); -} - -static void -ble_ll_adv_aux_set_start_time(struct ble_ll_adv_sm *advsm) -{ - static const uint8_t bits[8] = {0, 1, 1, 2, 1, 2, 2, 3}; - struct ble_ll_sched_item *sched = &advsm->adv_sch; - uint32_t adv_pdu_dur; - uint32_t adv_event_dur; - uint8_t chans; - - assert(!advsm->aux_active); - assert(!advsm->aux[0].sch.enqueued); - assert(!advsm->aux[1].sch.enqueued); - - assert(advsm->adv_chanmask > 0 && - advsm->adv_chanmask <= BLE_HCI_ADV_CHANMASK_DEF); - - chans = bits[advsm->adv_chanmask]; - - /* - * We want to schedule auxiliary packet as soon as possible after the end - * of advertising event, but no sooner than T_MAFS. The interval between - * advertising packets is 250 usecs (8.19 ticks) on LE Coded and a bit less - * on 1M, but it can vary a bit due to scheduling which we can't really - * control. Since we round ticks up for both interval and T_MAFS, we still - * have some margin here. The worst thing that can happen is that we skip - * last advertising packet which is not a bit problem so leave it as-is, no - * need to make code more complicated. - */ - - /* - * XXX: this could be improved if phy has TX-TX transition with controlled - * or predefined interval, but since it makes advertising code even - * more complicated let's skip it for now... - */ - - adv_pdu_dur = (int32_t)(sched->end_time - sched->start_time) - - g_ble_ll_sched_offset_ticks; - - /* 9 is 8.19 ticks rounded up - see comment above */ - adv_event_dur = (adv_pdu_dur * chans) + (9 * (chans - 1)); - - advsm->aux[0].start_time = advsm->adv_event_start_time + adv_event_dur + - ble_ll_usecs_to_ticks_round_up(BLE_LL_MAFS + MYNEWT_VAL(BLE_LL_SCHED_AUX_MAFS_DELAY)); -} - -static void -ble_ll_adv_aux_schedule(struct ble_ll_adv_sm *advsm) -{ - /* - * For secondary channel we always start by scheduling two consecutive - * auxiliary packets at once. Then, after sending one packet we try to - * schedule another one as long as there are some data left to send. This - * is to make sure we can always calculate AuxPtr to subsequent packet - * without need to scheduled it in an interrupt. - */ - - ble_ll_adv_aux_set_start_time(advsm); - ble_ll_adv_aux_schedule_first(advsm); - ble_ll_adv_aux_schedule_next(advsm); - - /* - * In case duration is set for advertising set we need to check if at least - * 1st aux will fit inside duration. If not, stop advertising now so we do - * not start extended advertising event which we cannot finish in time. - */ - if (advsm->duration && - (AUX_CURRENT(advsm)->sch.end_time > advsm->adv_end_time)) { - ble_ll_adv_sm_stop_timeout(advsm); - } -} -#endif - -/** - * Called when advertising need to be halted. This normally should not be called - * and is only called when a scheduled item executes but advertising is still - * running. - * - * Context: Interrupt - */ -void -ble_ll_adv_halt(void) -{ - struct ble_ll_adv_sm *advsm; - - if (g_ble_ll_cur_adv_sm != NULL) { - advsm = g_ble_ll_cur_adv_sm; - - ble_ll_trace_u32(BLE_LL_TRACE_ID_ADV_HALT, advsm->adv_instance); - - ble_phy_txpwr_set(MYNEWT_VAL(BLE_LL_TX_PWR_DBM)); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - if (advsm->flags & BLE_LL_ADV_SM_FLAG_PERIODIC_SYNC_SENDING) { - ble_ll_adv_flags_clear(advsm, - BLE_LL_ADV_SM_FLAG_PERIODIC_SYNC_SENDING); - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, - &advsm->adv_periodic_txdone_ev); - ble_ll_state_set(BLE_LL_STATE_STANDBY); - g_ble_ll_cur_adv_sm = NULL; - return; - } -#endif - - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &advsm->adv_txdone_ev); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY)) { - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &advsm->adv_sec_txdone_ev); - } -#endif - - ble_ll_state_set(BLE_LL_STATE_STANDBY); - ble_ll_adv_active_chanset_clear(g_ble_ll_cur_adv_sm); - g_ble_ll_cur_adv_sm = NULL; - } else { - ble_ll_trace_u32(BLE_LL_TRACE_ID_ADV_HALT, UINT32_MAX); - } -} - -/** - * Called by the HCI command parser when a set advertising parameters command - * has been received. - * - * Context: Link Layer task (HCI command parser) - * - * @param cmd - * - * @return int - */ -int -ble_ll_adv_set_adv_params(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_adv_params_cp *cmd = (const void *) cmdbuf; - struct ble_ll_adv_sm *advsm; - uint8_t adv_filter_policy; - uint16_t adv_itvl_min; - uint16_t adv_itvl_max; - uint16_t props; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - advsm = &g_ble_ll_adv_sm[0]; - if (advsm->adv_enabled) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* Make sure intervals are OK (along with advertising type */ - adv_itvl_min = le16toh(cmd->min_interval); - adv_itvl_max = le16toh(cmd->max_interval); - - /* - * Get the filter policy now since we will ignore it if we are doing - * directed advertising - */ - adv_filter_policy = cmd->filter_policy; - - switch (cmd->type) { - case BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_HD: - adv_filter_policy = BLE_HCI_ADV_FILT_NONE; - memcpy(advsm->peer_addr, cmd->peer_addr, BLE_DEV_ADDR_LEN); - - /* Ignore min/max interval */ - adv_itvl_min = 0; - adv_itvl_max = 0; - - props = BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_HD_DIR ; - break; - case BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_LD: - adv_filter_policy = BLE_HCI_ADV_FILT_NONE; - memcpy(advsm->peer_addr, cmd->peer_addr, BLE_DEV_ADDR_LEN); - - props = BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_LD_DIR ; - break; - case BLE_HCI_ADV_TYPE_ADV_IND: - props = BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_IND; - break; - case BLE_HCI_ADV_TYPE_ADV_NONCONN_IND: - props = BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_NONCONN; - break; - case BLE_HCI_ADV_TYPE_ADV_SCAN_IND: - props = BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_SCAN; - break; - default: - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Make sure intervals values are valid - * (HD directed advertising ignores those parameters) - */ - if (!(props & BLE_HCI_LE_SET_EXT_ADV_PROP_HD_DIRECTED)) { - if ((adv_itvl_min > adv_itvl_max) || - (adv_itvl_min < BLE_HCI_ADV_ITVL_MIN) || - (adv_itvl_min > BLE_HCI_ADV_ITVL_MAX) || - (adv_itvl_max < BLE_HCI_ADV_ITVL_MIN) || - (adv_itvl_max > BLE_HCI_ADV_ITVL_MAX)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - } - - if ((cmd->own_addr_type > BLE_HCI_ADV_OWN_ADDR_MAX) || - (cmd->peer_addr_type > BLE_HCI_ADV_PEER_ADDR_MAX)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - advsm->adv_txpwr = MYNEWT_VAL(BLE_LL_TX_PWR_DBM); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - if (cmd->own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) { - /* Copy peer address */ - memcpy(advsm->peer_addr, cmd->peer_addr, BLE_DEV_ADDR_LEN); - } -#else - /* If we dont support privacy some address types wont work */ - if (cmd->own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) { - return BLE_ERR_UNSUPPORTED; - } -#endif - - /* There are only three adv channels, so check for any outside the range */ - if (((cmd->chan_map & 0xF8) != 0) || (cmd->chan_map == 0)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Check for valid filter policy */ - if (adv_filter_policy > BLE_HCI_ADV_FILT_MAX) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Fill out rest of advertising state machine */ - advsm->own_addr_type = cmd->own_addr_type; - advsm->peer_addr_type = cmd->peer_addr_type; - advsm->adv_filter_policy = adv_filter_policy; - advsm->adv_chanmask = cmd->chan_map; - advsm->adv_itvl_min = adv_itvl_min; - advsm->adv_itvl_max = adv_itvl_max; - advsm->props = props; - - return 0; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static void -ble_ll_adv_update_did(struct ble_ll_adv_sm *advsm) -{ - uint16_t old_adi = advsm->adi; - - /* - * The Advertising DID for a given advertising set shall be initialized - * with a randomly chosen value. Whenever the Host provides new advertising - * data or scan response data for a given advertising set (whether it is the - * same as the previous data or not), the Advertising DID shall be updated. - * The new value shall be a randomly chosen value that is not the same as - * the previously used value. - */ - do { - advsm->adi = (advsm->adi & 0xf000) | (rand() & 0x0fff); - } while (old_adi == advsm->adi); -} -#endif - -static void -ble_ll_adv_update_adv_scan_rsp_data(struct ble_ll_adv_sm *advsm) -{ - if (!(advsm->flags & BLE_LL_ADV_SM_FLAG_NEW_ADV_DATA) && - !(advsm->flags & BLE_LL_ADV_SM_FLAG_NEW_SCAN_RSP_DATA)) { - return; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (advsm->aux_active) { - return; - } -#endif - - if (advsm->flags & BLE_LL_ADV_SM_FLAG_NEW_ADV_DATA) { - if (advsm->new_adv_data) { - os_mbuf_free_chain(advsm->adv_data); - advsm->adv_data = advsm->new_adv_data; - advsm->new_adv_data = NULL; - } - ble_ll_adv_flags_clear(advsm, BLE_LL_ADV_SM_FLAG_NEW_ADV_DATA); - } else if (advsm->flags & BLE_LL_ADV_SM_FLAG_NEW_SCAN_RSP_DATA) { - os_mbuf_free_chain(advsm->scan_rsp_data); - advsm->scan_rsp_data = advsm->new_scan_rsp_data; - advsm->new_scan_rsp_data = NULL; - ble_ll_adv_flags_clear(advsm, BLE_LL_ADV_SM_FLAG_NEW_SCAN_RSP_DATA); - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* DID shall be updated when host provides new advertising data */ - ble_ll_adv_update_did(advsm); -#endif -} - -/** - * Stop advertising state machine - * - * Context: Link Layer task. - * - * @param advsm - */ -static void -ble_ll_adv_sm_stop(struct ble_ll_adv_sm *advsm) -{ - os_sr_t sr; - - if (advsm->adv_enabled) { - ble_ll_rfmgmt_release(); - - /* Remove any scheduled advertising items */ - ble_ll_sched_rmv_elem(&advsm->adv_sch); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - advsm->aux_active = 0; - ble_ll_sched_rmv_elem(&advsm->aux[0].sch); - ble_ll_sched_rmv_elem(&advsm->aux[1].sch); -#endif - - /* Set to standby if we are no longer advertising */ - OS_ENTER_CRITICAL(sr); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if ((g_ble_ll_cur_adv_sm == advsm) && - !(advsm->flags & BLE_LL_ADV_SM_FLAG_PERIODIC_SYNC_SENDING)) { - ble_phy_disable(); - ble_ll_state_set(BLE_LL_STATE_STANDBY); - g_ble_ll_cur_adv_sm = NULL; - ble_ll_scan_chk_resume(); - } -#else - if (ble_ll_state_get() == BLE_LL_STATE_ADV) { - ble_phy_disable(); - ble_ll_state_set(BLE_LL_STATE_STANDBY); - g_ble_ll_cur_adv_sm = NULL; - ble_ll_scan_chk_resume(); - } -#endif - OS_EXIT_CRITICAL(sr); - - ble_npl_eventq_remove(&g_ble_ll_data.ll_evq, &advsm->adv_txdone_ev); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - ble_npl_eventq_remove(&g_ble_ll_data.ll_evq, &advsm->adv_sec_txdone_ev); -#endif - - /* If there is an event buf we need to free it */ - if (advsm->conn_comp_ev) { - ble_hci_trans_buf_free(advsm->conn_comp_ev); - advsm->conn_comp_ev = NULL; - } - - ble_ll_adv_active_chanset_clear(advsm); - - /* Disable advertising */ - advsm->adv_enabled = 0; - - /* Check if there is outstanding update */ - ble_ll_adv_update_adv_scan_rsp_data(advsm); - } -} - -static void -ble_ll_adv_sm_stop_timeout(struct ble_ll_adv_sm *advsm) -{ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (ble_ll_hci_adv_mode_ext()) { - ble_ll_hci_ev_send_adv_set_terminated(BLE_ERR_DIR_ADV_TMO, - advsm->adv_instance, 0, - advsm->events); - } -#endif - - /* - * For high duty directed advertising we need to send connection - * complete event with proper status - */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_HD_DIRECTED) { - ble_ll_conn_comp_event_send(NULL, BLE_ERR_DIR_ADV_TMO, - advsm->conn_comp_ev, advsm); - advsm->conn_comp_ev = NULL; - } - - /* Disable advertising */ - ble_ll_adv_sm_stop(advsm); -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static void -ble_ll_adv_sm_stop_limit_reached(struct ble_ll_adv_sm *advsm) -{ - ble_ll_hci_ev_send_adv_set_terminated(BLE_ERR_LIMIT_REACHED, - advsm->adv_instance, 0, - advsm->events); - - /* - * For high duty directed advertising we need to send connection - * complete event with proper status - * - * Spec is a bit unambiguous here since it doesn't define what code should - * be used if HD directed advertising was terminated before timeout due to - * events count limit. For now just use same code as with duration timeout. - */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_HD_DIRECTED) { - ble_ll_conn_comp_event_send(NULL, BLE_ERR_DIR_ADV_TMO, - advsm->conn_comp_ev, advsm); - advsm->conn_comp_ev = NULL; - } - - /* Disable advertising */ - ble_ll_adv_sm_stop(advsm); -} -#endif - -static void -ble_ll_adv_scheduled(struct ble_ll_adv_sm *advsm, uint32_t sch_start, void *arg) -{ - /* The event start time is when we start transmission of the adv PDU */ - advsm->adv_event_start_time = sch_start + g_ble_ll_sched_offset_ticks; - advsm->adv_pdu_start_time = advsm->adv_event_start_time; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* this is validated for HD adv so no need to do additional checks here - * duration is in 10ms units - */ - if (advsm->duration) { - advsm->adv_end_time = advsm->adv_event_start_time + - os_cputime_usecs_to_ticks(advsm->duration * 10000); - } -#else - /* Set the time at which we must end directed, high-duty cycle advertising. - */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_HD_DIRECTED) { - advsm->adv_end_time = advsm->adv_event_start_time + - os_cputime_usecs_to_ticks(BLE_LL_ADV_STATE_HD_MAX * 1000); - } -#endif -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) -static uint8_t -ble_ll_adv_sync_pdu_make(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte) -{ - struct ble_ll_adv_sm *advsm; - struct ble_ll_adv_sync *sync; - uint8_t adv_mode; - uint8_t pdu_type; - uint8_t ext_hdr_len; - uint32_t offset; - - advsm = pducb_arg; - sync = SYNC_CURRENT(advsm); - - assert(!ble_ll_adv_active_chanset_is_sec(advsm)); - assert(advsm->flags & BLE_LL_ADV_SM_FLAG_PERIODIC_SYNC_SENDING); - - /* It's the same for AUX_SYNC_IND and AUX_CHAIN_IND */ - pdu_type = BLE_ADV_PDU_TYPE_AUX_SYNC_IND; - - /* non-connectable and non-scannable */ - adv_mode = 0; - - ext_hdr_len = sync->payload_len - BLE_LL_EXT_ADV_HDR_LEN - sync->sync_data_len; - dptr[0] = (adv_mode << 6) | ext_hdr_len; - dptr += 1; - - /* only put flags if needed */ - if (sync->ext_hdr) { - dptr[0] = sync->ext_hdr; - dptr += 1; - } - - if (sync->ext_hdr & (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT)) { - if (!SYNC_NEXT(advsm)->sch.enqueued) { - /* - * Trim data here in case we do not have next sync scheduled. This - * can happen if next sync was outside advertising set period and - * was removed from scheduler. - */ - offset = 0; - } else { - offset = os_cputime_ticks_to_usecs(SYNC_NEXT(advsm)->start_time - sync->start_time); - } - - ble_ll_adv_put_aux_ptr(SYNC_NEXT(advsm)->chan, advsm->sec_phy, - offset, dptr); - - dptr += BLE_LL_EXT_ADV_AUX_PTR_SIZE; - } - - if (sync->ext_hdr & (1 << BLE_LL_EXT_ADV_TX_POWER_BIT)) { - dptr[0] = advsm->adv_txpwr + ble_ll_get_tx_pwr_compensation(); - dptr += BLE_LL_EXT_ADV_TX_POWER_SIZE; - } - - if (sync->sync_data_len) { - os_mbuf_copydata(advsm->periodic_adv_data, sync->sync_data_offset, - sync->sync_data_len, dptr); - } - - *hdr_byte = pdu_type; - - return sync->payload_len; -} - - -static void -ble_ll_adv_sync_tx_done(struct ble_ll_adv_sm *advsm) -{ - /* reset power to max after advertising */ - ble_phy_txpwr_set(MYNEWT_VAL(BLE_LL_TX_PWR_DBM)); - - /* for sync we trace a no pri nor sec set */ - ble_ll_trace_u32x2(BLE_LL_TRACE_ID_ADV_TXDONE, advsm->adv_instance, 0); - - assert(advsm->flags & BLE_LL_ADV_SM_FLAG_PERIODIC_SYNC_SENDING); - assert(!ble_ll_adv_active_chanset_is_sec(advsm)); - - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &advsm->adv_periodic_txdone_ev); - - ble_ll_state_set(BLE_LL_STATE_STANDBY); - ble_ll_adv_flags_clear(advsm, BLE_LL_ADV_SM_FLAG_PERIODIC_SYNC_SENDING); - - /* We no longer have a current state machine */ - g_ble_ll_cur_adv_sm = NULL; -} - -/** - * Called to indicate the advertising sync event is over. - * - * Context: Interrupt - * - * @param advsm - * - */ -static void -ble_ll_adv_sync_tx_end(void *arg) -{ - struct ble_ll_adv_sm *advsm = arg; - - ble_ll_adv_sync_tx_done(advsm); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - /* store last sent periodic counter */ - advsm->periodic_event_cntr_last_sent = advsm->periodic_event_cntr; -#endif -} - -static int -ble_ll_adv_sync_tx_start_cb(struct ble_ll_sched_item *sch) -{ - int rc; - uint32_t txstart; - struct ble_ll_adv_sm *advsm; - struct ble_ll_adv_sync *sync; - - /* Get the state machine for the event */ - advsm = (struct ble_ll_adv_sm *)sch->cb_arg; - - /* Set the current advertiser */ - g_ble_ll_cur_adv_sm = advsm; - - ble_ll_adv_active_chanset_clear(advsm); - ble_ll_adv_flags_set(advsm, BLE_LL_ADV_SM_FLAG_PERIODIC_SYNC_SENDING); - - /* Set the power */ - ble_phy_txpwr_set(advsm->adv_txpwr); - - /* Set channel */ - sync = SYNC_CURRENT(advsm); - rc = ble_phy_setchan(sync->chan, advsm->periodic_access_addr, - advsm->periodic_crcinit); - - assert(rc == 0); - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - /* Set phy mode */ - ble_phy_mode_set(advsm->sec_phy, advsm->sec_phy); -#endif - - /* Set transmit start time. */ - txstart = sch->start_time + g_ble_ll_sched_offset_ticks; - rc = ble_phy_tx_set_start_time(txstart, sch->remainder); - if (rc) { - STATS_INC(ble_ll_stats, adv_late_starts); - goto adv_tx_done; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - ble_phy_encrypt_disable(); -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - ble_phy_resolv_list_disable(); -#endif - - /* Transmit advertisement */ - ble_phy_set_txend_cb(ble_ll_adv_sync_tx_end, advsm); - rc = ble_phy_tx(ble_ll_adv_sync_pdu_make, advsm, BLE_PHY_TRANSITION_NONE); - if (rc) { - goto adv_tx_done; - } - - /* disable whitelisting, we are always non-connectable non-scannable */ - ble_ll_whitelist_disable(); - - /* Set link layer state to advertising */ - ble_ll_state_set(BLE_LL_STATE_ADV); - - /* Count # of adv. sent */ - STATS_INC(ble_ll_stats, adv_txg); - - return BLE_LL_SCHED_STATE_RUNNING; - -adv_tx_done: - ble_ll_adv_sync_tx_done(advsm); - return BLE_LL_SCHED_STATE_DONE; -} - -static void -ble_ll_adv_sync_calculate(struct ble_ll_adv_sm *advsm, - struct ble_ll_adv_sync *sync, - uint16_t sync_data_offset, - uint8_t chan) -{ - uint16_t rem_sync_data_len; - uint8_t hdr_len; - - assert(!sync->sch.enqueued); - assert((SYNC_DATA_LEN(advsm) > sync_data_offset) || - (SYNC_DATA_LEN(advsm) == 0 && sync_data_offset == 0)); - - sync->sync_data_offset = sync_data_offset; - sync->sync_data_len = 0; - sync->payload_len = 0; - sync->ext_hdr = 0; - sync->chan = chan; - - rem_sync_data_len = SYNC_DATA_LEN(advsm) - sync_data_offset; - - hdr_len = BLE_LL_EXT_ADV_HDR_LEN; - - /* TxPower if configured - * Note: TxPower shall not be present in chain PDU for SYNC - */ - if (sync_data_offset == 0 && - (advsm->periodic_adv_props & BLE_HCI_LE_SET_PERIODIC_ADV_PROP_INC_TX_PWR)) { - sync->ext_hdr |= (1 << BLE_LL_EXT_ADV_TX_POWER_BIT); - hdr_len += BLE_LL_EXT_ADV_TX_POWER_SIZE; - } - - /* if we have any fields in ext header we need to add flags, note that Aux - * PTR is handled later and it will account for flags if needed - * - * This could be handled inside TxPower but lets keep code consistent with - * how Aux calculate works and this also make it easier to add more fields - * into flags if needed in future - */ - if (sync->ext_hdr) { - hdr_len += BLE_LL_EXT_ADV_FLAGS_SIZE; - } - - /* AdvData always */ - sync->sync_data_len = min(BLE_LL_MAX_PAYLOAD_LEN - hdr_len, rem_sync_data_len); - - /* AuxPtr if there are more AdvData remaining that we can fit here */ - if ((rem_sync_data_len > sync->sync_data_len)) { - /* adjust for flags that needs to be added if AuxPtr is only field - * in Extended Header - */ - if (!sync->ext_hdr) { - hdr_len += BLE_LL_EXT_ADV_FLAGS_SIZE; - sync->sync_data_len -= BLE_LL_EXT_ADV_FLAGS_SIZE; - } - - sync->ext_hdr |= (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT); - hdr_len += BLE_LL_EXT_ADV_AUX_PTR_SIZE; - sync->sync_data_len -= BLE_LL_EXT_ADV_AUX_PTR_SIZE; - - /* PDU payload should be full if chained */ - assert(hdr_len + sync->sync_data_len == BLE_LL_MAX_PAYLOAD_LEN); - } - - sync->payload_len = hdr_len + sync->sync_data_len; -} - -static void -ble_ll_adv_periodic_schedule_first(struct ble_ll_adv_sm *advsm, - bool first_pdu) -{ - struct ble_ll_adv_sync *sync; - struct ble_ll_sched_item *sch; - uint32_t sch_start; - uint32_t max_usecs; - uint8_t chan; - int rc; - - assert(!advsm->periodic_sync_active); - assert(!advsm->periodic_sync[0].sch.enqueued); - assert(!advsm->periodic_sync[1].sch.enqueued); - - advsm->periodic_sync_active = 1; - advsm->periodic_sync_index = 0; - - sync = SYNC_CURRENT(advsm); - - /* For first SYNC packet in chain we use separate CSA#2 state to maintain - * freq hopping as advertised in SyncInfo - * - * Preincrement event counter as we later send this in PDU so make sure - * same values are used - */ - chan = ble_ll_utils_calc_dci_csa2(++advsm->periodic_event_cntr, - advsm->periodic_channel_id, - advsm->periodic_num_used_chans, - advsm->periodic_chanmap); - - ble_ll_adv_sync_calculate(advsm, sync, 0, chan); - - /* sync is always non-connectable and non-scannable*/ - max_usecs = ble_ll_pdu_tx_time_get(sync->payload_len, advsm->sec_phy); - - sch = &sync->sch; - - advsm->periodic_adv_event_start_time_remainder += advsm->periodic_adv_itvl_rem_usec; - if (advsm->periodic_adv_event_start_time_remainder >= 31) { - advsm->periodic_adv_event_start_time++; - advsm->periodic_adv_event_start_time_remainder -= 31; - } - - sch->start_time = advsm->periodic_adv_event_start_time; - sch->remainder = advsm->periodic_adv_event_start_time_remainder; - sch->end_time = sch->start_time + ble_ll_usecs_to_ticks_round_up(max_usecs); - sch->start_time -= g_ble_ll_sched_offset_ticks; - - rc = ble_ll_sched_periodic_adv(sch, &sch_start, first_pdu); - if (rc) { - STATS_INC(ble_ll_stats, periodic_adv_drop_event); - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, - &advsm->adv_periodic_txdone_ev); - return; - } - - sync->start_time = sch_start + g_ble_ll_sched_offset_ticks; - - assert(first_pdu || - (sync->start_time == advsm->periodic_adv_event_start_time)); - - /* The event start time is when we start transmission of the SYNC PDU */ - advsm->periodic_adv_event_start_time = sync->start_time; -} - -static void -ble_ll_adv_sync_next_scheduled(struct ble_ll_adv_sm *advsm, uint32_t sch_start, - void *arg) -{ - struct ble_ll_adv_sync *sync = arg; - - sync->start_time = sch_start + g_ble_ll_sched_offset_ticks; -} - -static void -ble_ll_adv_periodic_schedule_next(struct ble_ll_adv_sm *advsm) -{ - struct ble_ll_adv_sync *sync; - struct ble_ll_adv_sync *sync_next; - struct ble_ll_sched_item *sch; - uint16_t rem_sync_data_len; - uint16_t next_sync_data_offset; - uint32_t max_usecs; - uint8_t chan; - - assert(advsm->periodic_sync_active); - - sync = SYNC_CURRENT(advsm); - sync_next = SYNC_NEXT(advsm); - - assert(!sync_next->sch.enqueued); - - /* - * Do not schedule next sync if current sync is no longer scheduled since we - * do not have reference time for scheduling. - */ - if (!sync->sch.enqueued) { - return; - } - - /* - * Do not schedule next sync if current sync does not have AuxPtr in extended - * header as this means we do not need subsequent ADV_CHAIN_IND to be sent. - */ - if (!(sync->ext_hdr & (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT))) { - return; - } - - next_sync_data_offset = sync->sync_data_offset + sync->sync_data_len; - - assert(SYNC_DATA_LEN(advsm) >= next_sync_data_offset); - - rem_sync_data_len = SYNC_DATA_LEN(advsm) - next_sync_data_offset; - assert(rem_sync_data_len > 0); - - /* we use separate counter for chaining */ - chan = ble_ll_utils_calc_dci_csa2(advsm->periodic_chain_event_cntr++, - advsm->periodic_channel_id, - advsm->periodic_num_used_chans, - advsm->periodic_chanmap); - - ble_ll_adv_sync_calculate(advsm, sync_next, next_sync_data_offset, chan); - max_usecs = ble_ll_pdu_tx_time_get(sync_next->payload_len, advsm->sec_phy); - - sync_next->start_time = sync->sch.end_time + - ble_ll_usecs_to_ticks_round_up(BLE_LL_MAFS + MYNEWT_VAL(BLE_LL_SCHED_AUX_CHAIN_MAFS_DELAY)); - - sch = &sync_next->sch; - sch->start_time = sync_next->start_time - g_ble_ll_sched_offset_ticks; - - /* adjust for previous packets remainder */ - sch->remainder = sync->sch.remainder; - sch->end_time = sync_next->start_time + - ble_ll_usecs_to_ticks_round_up(max_usecs); - - /* here we can use ble_ll_sched_adv_new as we don't care about timing */ - ble_ll_sched_adv_new(&sync_next->sch, ble_ll_adv_sync_next_scheduled, - sync_next); - - /* if we are pass advertising interval, drop chain */ - if (sch->end_time > advsm->periodic_adv_event_start_time + - advsm->periodic_adv_itvl_ticks) { - STATS_INC(ble_ll_stats, periodic_chain_drop_event); - ble_ll_sched_rmv_elem(&sync->sch); - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, - &advsm->adv_periodic_txdone_ev); - } -} - -static void -ble_ll_adv_sync_schedule(struct ble_ll_adv_sm *advsm, bool first_pdu) -{ - /* - * For secondary channel we always start by scheduling two consecutive - * auxiliary packets at once. Then, after sending one packet we try to - * schedule another one as long as there are some data left to send. This - * is to make sure we can always calculate AuxPtr to subsequent packet - * without need to scheduled it in an interrupt. - */ - - ble_ll_adv_periodic_schedule_first(advsm, first_pdu); - ble_ll_adv_periodic_schedule_next(advsm); -} - -static void -ble_ll_adv_reschedule_periodic_event(struct ble_ll_adv_sm *advsm) -{ - advsm->periodic_adv_event_start_time += advsm->periodic_adv_itvl_ticks; - ble_ll_adv_sync_schedule(advsm, false); -} - -static void -ble_ll_adv_update_periodic_data(struct ble_ll_adv_sm *advsm) -{ - if (!(advsm->flags & BLE_LL_ADV_SM_FLAG_PERIODIC_NEW_DATA)) { - return; - } - - if (advsm->periodic_sync_active) { - return; - } - - if (advsm->periodic_new_data) { - os_mbuf_free_chain(advsm->periodic_adv_data); - advsm->periodic_adv_data = advsm->periodic_new_data; - advsm->periodic_new_data = NULL; - } - - ble_ll_adv_flags_clear(advsm, BLE_LL_ADV_SM_FLAG_PERIODIC_NEW_DATA); -} - -/** - * Called when periodic packet is txd on secondary channel - * - * Context: Link Layer task. - * - * @param ev - */ -static void -ble_ll_adv_periodic_done(struct ble_ll_adv_sm *advsm) -{ - struct ble_ll_adv_sync *sync; - struct ble_ll_adv_sync *sync_next; - - assert(advsm->periodic_adv_enabled); - assert(advsm->periodic_adv_active); - assert(advsm->periodic_sync_active); - - ble_ll_rfmgmt_release(); - - sync = SYNC_CURRENT(advsm); - sync_next = SYNC_NEXT(advsm); - - /* Remove anything else scheduled for periodic */ - ble_ll_sched_rmv_elem(&sync->sch); - ble_npl_eventq_remove(&g_ble_ll_data.ll_evq, &advsm->adv_periodic_txdone_ev); - - /* If we have next SYNC scheduled, try to schedule another one */ - if (sync_next->sch.enqueued) { - advsm->periodic_sync_index ^= 1; - ble_ll_adv_periodic_schedule_next(advsm); - return; - } - - /* Check if we need to resume scanning */ - ble_ll_scan_chk_resume(); - - advsm->periodic_sync_active = 0; - ble_ll_adv_update_periodic_data(advsm); - ble_ll_adv_reschedule_periodic_event(advsm); -} - -static void -ble_ll_adv_periodic_event_done(struct ble_npl_event *ev) -{ - ble_ll_adv_periodic_done(ble_npl_event_get_arg(ev)); -} - -static void -ble_ll_adv_sm_start_periodic(struct ble_ll_adv_sm *advsm) -{ - uint32_t usecs; - uint32_t ticks; - - /* - * The Advertising DID is not required to change when a SyncInfo field is - * added to or removed from an advertising set. However, if it does not - * change, then scanners may fail to synchronize to periodic advertising - * because entries in the Advertising DID cache (see Section 4.3.3) mean - * they ignore the advertisements containing the SyncInfo field. Therefore, - * advertisers should update the Advertising DID when a periodic advertising - * train is enabled. - */ - ble_ll_adv_update_did(advsm); - - advsm->periodic_adv_active = 1; - - /* keep channel map since we cannot change it later on */ - memcpy(advsm->periodic_chanmap, g_ble_ll_conn_params.master_chan_map, - BLE_LL_CONN_CHMAP_LEN); - advsm->periodic_num_used_chans = g_ble_ll_conn_params.num_used_chans; - advsm->periodic_event_cntr = 0; - /* for chaining we start with random counter as we share access addr */ - advsm->periodic_chain_event_cntr = rand(); - advsm->periodic_access_addr = ble_ll_utils_calc_access_addr(); - advsm->periodic_channel_id = ((advsm->periodic_access_addr & 0xffff0000) >> 16) ^ - (advsm->periodic_access_addr & 0x0000ffff); - advsm->periodic_crcinit = rand() & 0xffffff; - - usecs = (uint32_t)advsm->periodic_adv_itvl_max * BLE_LL_ADV_PERIODIC_ITVL; - ticks = os_cputime_usecs_to_ticks(usecs); - - advsm->periodic_adv_itvl_rem_usec = (usecs - os_cputime_ticks_to_usecs(ticks)); - if (advsm->periodic_adv_itvl_rem_usec == 31) { - advsm->periodic_adv_itvl_rem_usec = 0; - ticks++; - } - advsm->periodic_adv_itvl_ticks = ticks; - - /* There is no point in starting periodic advertising until next advertising - * event since SyncInfo is needed for synchronization - */ - advsm->periodic_adv_event_start_time_remainder = 0; - advsm->periodic_adv_event_start_time = advsm->adv_pdu_start_time + - os_cputime_usecs_to_ticks(advsm->adv_itvl_usecs + 5000); - - ble_ll_adv_sync_schedule(advsm, true); -} - -static void -ble_ll_adv_sm_stop_periodic(struct ble_ll_adv_sm *advsm) -{ - os_sr_t sr; - - ble_ll_rfmgmt_release(); - - if (!advsm->periodic_adv_active) { - return; - } - - /* - * The Advertising DID is not required to change when a SyncInfo field is - * added to or removed from an advertising set. However, if it does not - * change, then scanners may unnecessary try to synchronize to instance that - * no longer has periodic advertising enabled because entries in the - * Advertising DID cache (see Section 4.3.3) mean they ignore the - * advertisements no longer containing the SyncInfo field. Therefore, - * advertisers should update the Advertising DID when a periodic advertising - * train is disabled. - */ - ble_ll_adv_update_did(advsm); - - /* Remove any scheduled advertising items */ - advsm->periodic_adv_active = 0; - advsm->periodic_sync_active = 0; - ble_ll_sched_rmv_elem(&advsm->periodic_sync[0].sch); - ble_ll_sched_rmv_elem(&advsm->periodic_sync[1].sch); - - /* Set to standby if we are no longer advertising */ - OS_ENTER_CRITICAL(sr); - if ((g_ble_ll_cur_adv_sm == advsm) && - (advsm->flags & BLE_LL_ADV_SM_FLAG_PERIODIC_SYNC_SENDING)) { - ble_phy_disable(); - ble_ll_state_set(BLE_LL_STATE_STANDBY); - g_ble_ll_cur_adv_sm = NULL; - ble_ll_scan_chk_resume(); - } - OS_EXIT_CRITICAL(sr); - - ble_ll_adv_flags_clear(advsm, BLE_LL_ADV_SM_FLAG_PERIODIC_SYNC_SENDING); - - ble_npl_eventq_remove(&g_ble_ll_data.ll_evq, - &advsm->adv_periodic_txdone_ev); - - ble_ll_adv_update_periodic_data(advsm); -} -#endif - -/** - * Start the advertising state machine. This is called when the host sends - * the "enable advertising" command and is not called again while in the - * advertising state. - * - * Context: Link-layer task. - * - * @param advsm Pointer to advertising state machine - * - * @return int - */ -static int -ble_ll_adv_sm_start(struct ble_ll_adv_sm *advsm) -{ - uint8_t adv_chan; - uint8_t *addr; - uint8_t *evbuf; - uint32_t start_delay_us; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) - uint32_t access_addr; -#endif - const uint8_t *random_addr; - uint32_t earliest_start_time; - int32_t delta; - - /* only clear flags that are not set from HCI */ - ble_ll_adv_flags_clear(advsm, BLE_LL_ADV_SM_FLAG_TX_ADD | - BLE_LL_ADV_SM_FLAG_RX_ADD | - BLE_LL_ADV_SM_FLAG_CONN_RSP_TXD); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - random_addr = advsm->adv_random_addr; -#else - random_addr = g_random_addr; -#endif - - if (!ble_ll_is_valid_own_addr_type(advsm->own_addr_type, random_addr)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* - * Get an event with which to send the connection complete event if - * this is connectable - */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE) { - /* We expect this to be NULL but if not we wont allocate one... */ - if (advsm->conn_comp_ev == NULL) { - evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (!evbuf) { - return BLE_ERR_MEM_CAPACITY; - } - advsm->conn_comp_ev = evbuf; - } - } - - /* Set advertising address */ - if ((advsm->own_addr_type & 1) == 0) { - addr = g_dev_addr; - } else { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - addr = advsm->adv_random_addr; -#else - addr = g_random_addr; -#endif - advsm->flags |= BLE_LL_ADV_SM_FLAG_TX_ADD; - } - memcpy(advsm->adva, addr, BLE_DEV_ADDR_LEN); - - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) { - memcpy(advsm->initiator_addr, advsm->peer_addr, BLE_DEV_ADDR_LEN); - if (advsm->peer_addr_type & 1) { - advsm->flags |= BLE_LL_ADV_SM_FLAG_RX_ADD; - } - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - /* This will generate an RPA for both initiator addr and adva */ - if (advsm->own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) { - ble_ll_adv_rpa_update(advsm); - } -#endif - - /* Set flag telling us that advertising is enabled */ - advsm->adv_enabled = 1; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) - advsm->event_cntr = 0; - access_addr = ble_ll_utils_calc_access_addr(); - advsm->channel_id = ((access_addr & 0xffff0000) >> 16) ^ - (access_addr & 0x0000ffff); -#endif - - /* Determine the advertising interval we will use */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_HD_DIRECTED) { - /* Set it to max. allowed for high duty cycle advertising */ - advsm->adv_itvl_usecs = BLE_LL_ADV_PDU_ITVL_HD_MS_MAX; - } else { - advsm->adv_itvl_usecs = (uint32_t)advsm->adv_itvl_max; - advsm->adv_itvl_usecs *= BLE_LL_ADV_ITVL; - } - - /* Set first advertising channel */ - adv_chan = ble_ll_adv_first_chan(advsm); - advsm->adv_chan = adv_chan; - - /* - * Scheduling 1st PDU is a bit tricky. - * Earliest possible start time is after RF is enabled so just force RF to - * start here to see when if will be fully enabled - it will be too early, - * but this is the only reliable way to have it enabled on time. - * Next we calculate expected start time (randomize it a bit) and this is - * used to setup start time for scheduler item. - * Then we check if start time for scheduler item (which includes scheduler - * overhead) is no earlier than calculated earliest possible start time and - * adjust scheduler item if necessary. - */ - earliest_start_time = ble_ll_rfmgmt_enable_now(); - - start_delay_us = rand() % (BLE_LL_ADV_DELAY_MS_MAX * 1000); - advsm->adv_pdu_start_time = os_cputime_get32() + - os_cputime_usecs_to_ticks(start_delay_us); - - ble_ll_adv_set_sched(advsm); - - delta = (int32_t)(advsm->adv_sch.start_time - earliest_start_time); - if (delta < 0) { - advsm->adv_sch.start_time -= delta; - advsm->adv_sch.end_time -= delta; - } - - /* This does actual scheduling */ - ble_ll_sched_adv_new(&advsm->adv_sch, ble_ll_adv_scheduled, NULL); - - /* we start periodic before AE since we need PDU start time in SyncInfo */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - if (advsm->periodic_adv_enabled && !advsm->periodic_adv_active) { - ble_ll_adv_sm_start_periodic(advsm); - } -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY)) { - ble_ll_adv_aux_schedule(advsm); - } -#endif - - return BLE_ERR_SUCCESS; -} - -/** - * Called when the LE HCI command read advertising channel tx power command - * has been received. Returns the current advertising transmit power. - * - * Context: Link Layer task (HCI command parser) - * - * @return int - */ -int -ble_ll_adv_read_txpwr(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_le_rd_adv_chan_txpwr_rp *rsp = (void *) rspbuf; - - rsp->power_level = MYNEWT_VAL(BLE_LL_TX_PWR_DBM); - - *rsplen = sizeof(*rsp); - return BLE_ERR_SUCCESS; -} - -/** - * Turn advertising on/off. - * - * Context: Link Layer task - * - * @param cmd - * - * @return int - */ -static int -ble_ll_adv_set_enable(uint8_t instance, uint8_t enable, int duration, - uint8_t events) -{ - int rc; - struct ble_ll_adv_sm *advsm; - - advsm = ble_ll_adv_sm_find_configured(instance); - if (!advsm) { - return BLE_ERR_UNK_ADV_INDENT; - } - - rc = BLE_ERR_SUCCESS; - if (enable == 1) { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (advsm->flags & BLE_LL_ADV_SM_FLAG_ADV_DATA_INCOMPLETE) { - return BLE_ERR_CMD_DISALLOWED; - } - - if (ble_ll_hci_adv_mode_ext() && - (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE) && - !(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) && - SCAN_RSP_DATA_LEN(advsm) == 0) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* handle specifics of HD dir adv enabled in legacy way */ - if (duration < 0) { - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_HD_DIRECTED) { - duration = BLE_LL_ADV_STATE_HD_MAX / 10; - } else { - duration = 0; - } - } - advsm->duration = duration; - advsm->events_max = events; - advsm->events = 0; -#endif - - /* If already enabled, do nothing */ - if (!advsm->adv_enabled) { - /* Start the advertising state machine */ - rc = ble_ll_adv_sm_start(advsm); - } - } else if (enable == 0) { - ble_ll_adv_sm_stop(advsm); - } else { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - } - - return rc; -} - -int -ble_ll_hci_adv_set_enable(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_adv_enable_cp *cmd = (const void *) cmdbuf; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - return ble_ll_adv_set_enable(0, cmd->enable, -1, 0); -} - -static void -ble_ll_adv_update_data_mbuf(struct os_mbuf **omp, bool new_data, uint16_t maxlen, - const void *data, uint16_t datalen) -{ - struct os_mbuf *om; - int ret; - - om = *omp; - - if (new_data) { - if (om) { - os_mbuf_free_chain(om); - } - - om = os_msys_get_pkthdr(datalen, 0); - if (!om) { - goto done; - } - } - - assert(om); - - if (OS_MBUF_PKTLEN(om) + datalen > maxlen) { - os_mbuf_free_chain(om); - om = NULL; - goto done; - } - - ret = os_mbuf_append(om, data, datalen); - if (ret) { - os_mbuf_free_chain(om); - om = NULL; - } - -done: - *omp = om; -} - -/** - * Set the scan response data that the controller will send. - * - * @param cmd - * @param len - * - * @return int - */ -static int -ble_ll_adv_set_scan_rsp_data(const uint8_t *data, uint8_t datalen, - uint8_t instance, uint8_t operation) -{ - struct ble_ll_adv_sm *advsm; - bool new_data; - - advsm = ble_ll_adv_sm_find_configured(instance); - if (!advsm) { - return BLE_ERR_UNK_ADV_INDENT; - } - - /* check if type of advertising support scan rsp */ - if (!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE)) { - if (!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - } - - switch (operation) { - case BLE_HCI_LE_SET_DATA_OPER_COMPLETE: - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - if (datalen > BLE_SCAN_RSP_LEGACY_DATA_MAX_LEN) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - } - - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - case BLE_HCI_LE_SET_DATA_OPER_LAST: - /* TODO mark scan rsp as complete? */ - /* fall through */ - case BLE_HCI_LE_SET_DATA_OPER_INT: - if (!advsm->scan_rsp_data) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (advsm->adv_enabled) { - return BLE_ERR_CMD_DISALLOWED; - } - - if (!datalen) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - break; - case BLE_HCI_LE_SET_DATA_OPER_FIRST: - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (advsm->adv_enabled) { - return BLE_ERR_CMD_DISALLOWED; - } - - if (!datalen) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - break; -#endif - default: - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - new_data = (operation == BLE_HCI_LE_SET_DATA_OPER_COMPLETE) || - (operation == BLE_HCI_LE_SET_DATA_OPER_FIRST); - - if (advsm->adv_enabled) { - if (advsm->new_scan_rsp_data) { - ble_ll_adv_flags_clear(advsm, BLE_LL_ADV_SM_FLAG_NEW_SCAN_RSP_DATA); - os_mbuf_free_chain(advsm->new_scan_rsp_data); - advsm->new_scan_rsp_data = NULL; - } - - ble_ll_adv_update_data_mbuf(&advsm->new_scan_rsp_data, new_data, - BLE_ADV_DATA_MAX_LEN, data, datalen); - if (!advsm->new_scan_rsp_data) { - return BLE_ERR_MEM_CAPACITY; - } - ble_ll_adv_flags_set(advsm, BLE_LL_ADV_SM_FLAG_NEW_SCAN_RSP_DATA); - } else { - ble_ll_adv_update_data_mbuf(&advsm->scan_rsp_data, new_data, - BLE_SCAN_RSP_DATA_MAX_LEN, data, datalen); - if (!advsm->scan_rsp_data) { - return BLE_ERR_MEM_CAPACITY; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* DID shall be updated when host provides new scan response data */ - ble_ll_adv_update_did(advsm); -#endif - } - - return BLE_ERR_SUCCESS; -} - -int -ble_ll_hci_set_scan_rsp_data(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_scan_rsp_data_cp *cmd = (const void *) cmdbuf; - - if ((len != sizeof(*cmd)) || (cmd->scan_rsp_len > sizeof(cmd->scan_rsp))) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - return ble_ll_adv_set_scan_rsp_data(cmd->scan_rsp, cmd->scan_rsp_len, 0, - BLE_HCI_LE_SET_DATA_OPER_COMPLETE); -} -/** - * Called by the LL HCI command parser when a set advertising - * data command has been sent from the host to the controller. - * - * @param cmd Pointer to command data - * @param len Length of command data - * - * @return int 0: success; BLE_ERR_INV_HCI_CMD_PARMS otherwise. - */ -static int -ble_ll_adv_set_adv_data(const uint8_t *data, uint8_t datalen, uint8_t instance, - uint8_t operation) -{ - struct ble_ll_adv_sm *advsm; - bool new_data; - - advsm = ble_ll_adv_sm_find_configured(instance); - if (!advsm) { - return BLE_ERR_UNK_ADV_INDENT; - } - - /* check if type of advertising support adv data */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) { - if (ble_ll_hci_adv_mode_ext()) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - } - } else { - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - } - - switch (operation) { - case BLE_HCI_LE_SET_DATA_OPER_COMPLETE: - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - if (datalen > BLE_ADV_LEGACY_DATA_MAX_LEN) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - } - - ble_ll_adv_flags_clear(advsm, BLE_LL_ADV_SM_FLAG_ADV_DATA_INCOMPLETE); - - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - case BLE_HCI_LE_SET_DATA_OPER_UNCHANGED: - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (!advsm->adv_enabled || !ADV_DATA_LEN(advsm) || datalen) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* update DID only */ - ble_ll_adv_update_did(advsm); - return BLE_ERR_SUCCESS; - case BLE_HCI_LE_SET_DATA_OPER_LAST: - ble_ll_adv_flags_clear(advsm, BLE_LL_ADV_SM_FLAG_ADV_DATA_INCOMPLETE); - /* fall through */ - case BLE_HCI_LE_SET_DATA_OPER_INT: - if (!advsm->adv_data) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (!datalen) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (advsm->adv_enabled) { - return BLE_ERR_CMD_DISALLOWED; - } - break; - case BLE_HCI_LE_SET_DATA_OPER_FIRST: - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (advsm->adv_enabled) { - return BLE_ERR_CMD_DISALLOWED; - } - - if (!datalen) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - ble_ll_adv_flags_set(advsm, BLE_LL_ADV_SM_FLAG_ADV_DATA_INCOMPLETE); - break; -#endif - default: - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - new_data = (operation == BLE_HCI_LE_SET_DATA_OPER_COMPLETE) || - (operation == BLE_HCI_LE_SET_DATA_OPER_FIRST); - - if (advsm->adv_enabled) { - if (advsm->new_adv_data) { - ble_ll_adv_flags_clear(advsm, BLE_LL_ADV_SM_FLAG_NEW_ADV_DATA); - os_mbuf_free_chain(advsm->new_adv_data); - advsm->new_adv_data = NULL; - } - - ble_ll_adv_update_data_mbuf(&advsm->new_adv_data, new_data, - BLE_ADV_DATA_MAX_LEN, data, datalen); - if (!advsm->new_adv_data) { - return BLE_ERR_MEM_CAPACITY; - } - ble_ll_adv_flags_set(advsm, BLE_LL_ADV_SM_FLAG_NEW_ADV_DATA); - } else { - ble_ll_adv_update_data_mbuf(&advsm->adv_data, new_data, - BLE_ADV_DATA_MAX_LEN, data, datalen); - if (!advsm->adv_data) { - return BLE_ERR_MEM_CAPACITY; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* DID shall be updated when host provides new advertising data */ - ble_ll_adv_update_did(advsm); -#endif - } - - return BLE_ERR_SUCCESS; -} - -int -ble_ll_hci_set_adv_data(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_adv_data_cp *cmd = (const void *) cmdbuf; - - if ((len != sizeof(*cmd)) || (cmd->adv_data_len > sizeof(cmd->adv_data))) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - return ble_ll_adv_set_adv_data(cmd->adv_data, cmd->adv_data_len, 0, - BLE_HCI_LE_SET_DATA_OPER_COMPLETE); -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static bool -pri_phy_valid(uint8_t phy) -{ - switch (phy) { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - case BLE_HCI_LE_PHY_CODED: -#endif - case BLE_HCI_LE_PHY_1M: - return true; - default: - return false; - } -} - -static bool -sec_phy_valid(uint8_t phy) -{ - switch (phy) { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - case BLE_HCI_LE_PHY_CODED: -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) - case BLE_HCI_LE_PHY_2M: -#endif - case BLE_HCI_LE_PHY_1M: - return true; - default: - return false; - } -} - -static struct ble_ll_adv_sm * -ble_ll_adv_sm_get(uint8_t instance) -{ - struct ble_ll_adv_sm *advsm; - int i; - - advsm = ble_ll_adv_sm_find_configured(instance); - if (advsm) { - return advsm; - } - - for (i = 0; i < ARRAY_SIZE(g_ble_ll_adv_sm); i++) { - advsm = &g_ble_ll_adv_sm[i]; - - if (!(advsm->flags & BLE_LL_ADV_SM_FLAG_CONFIGURED)) { - ble_ll_adv_sm_init(advsm); - - /* configured flag is set by caller on success config */ - advsm->adv_instance = instance; - return advsm; - } - } - - return NULL; -} - -int -ble_ll_adv_ext_set_param(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen) -{ - const struct ble_hci_le_set_ext_adv_params_cp *cmd = (const void *) cmdbuf; - struct ble_hci_le_set_ext_adv_params_rp *rsp = (void *) rspbuf; - struct ble_ll_adv_sm *advsm; - uint32_t adv_itvl_min; - uint32_t adv_itvl_max; - uint16_t props; - int rc; - - if (len != sizeof(*cmd )) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - advsm = ble_ll_adv_sm_get(cmd->adv_handle); - if (!advsm) { - rc = BLE_ERR_MEM_CAPACITY; - goto done; - } - - if (advsm->adv_enabled) { - rc = BLE_ERR_CMD_DISALLOWED; - goto done; - } - - props = le16toh(cmd->props); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - /* If the Host issues this command when periodic advertising is enabled for - * the specified advertising set and connectable, scannable, legacy, or - * anonymous advertising is specified, the Controller shall return the - * error code Invalid HCI Command Parameters (0x12). - */ - if (advsm->flags & BLE_LL_ADV_SM_FLAG_PERIODIC_CONFIGURED) { - if (advsm->periodic_adv_enabled) { - if (props & (BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE | - BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE | - BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY | - BLE_HCI_LE_SET_EXT_ADV_PROP_ANON_ADV)) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - } - } -#endif - - adv_itvl_min = cmd->pri_itvl_min[2] << 16 | cmd->pri_itvl_min[1] << 8 | - cmd->pri_itvl_min[0]; - adv_itvl_max = cmd->pri_itvl_max[2] << 16 | cmd->pri_itvl_max[1] << 8 | - cmd->pri_itvl_max[0]; - - if (props & ~BLE_HCI_LE_SET_EXT_ADV_PROP_MASK) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - if (props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - if (ADV_DATA_LEN(advsm) > BLE_ADV_LEGACY_DATA_MAX_LEN || - SCAN_RSP_DATA_LEN(advsm) > BLE_SCAN_RSP_LEGACY_DATA_MAX_LEN) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - /* if legacy bit is set possible values are limited */ - switch (props) { - case BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_IND: - case BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_LD_DIR: - case BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_HD_DIR: - case BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_SCAN: - case BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_NONCONN: - break; - default: - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - } else { - /* HD directed advertising allowed only on legacy PDUs */ - if (props & BLE_HCI_LE_SET_EXT_ADV_PROP_HD_DIRECTED) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - /* if ext advertising PDUs are used then it shall not be both - * connectable and scanable - */ - if ((props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE) && - (props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE)) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - } - - /* High Duty Directed advertising is special */ - if (props & BLE_HCI_LE_SET_EXT_ADV_PROP_HD_DIRECTED) { - if (ADV_DATA_LEN(advsm) || SCAN_RSP_DATA_LEN(advsm)) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - /* Ignore min/max interval */ - adv_itvl_min = 0; - adv_itvl_max = 0; - } else { - /* validate intervals for non HD-directed advertising */ - if ((adv_itvl_min > adv_itvl_max) || - (adv_itvl_min < BLE_HCI_ADV_ITVL_MIN) || - (adv_itvl_max < BLE_HCI_ADV_ITVL_MIN)) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - /* TODO for now limit those to values from legacy advertising - * - * If the primary advertising interval range is outside the advertising - * interval range supported by the Controller, then the Controller shall - * return the error code Unsupported Feature or Parameter Value (0x11). - */ - if ((adv_itvl_min > BLE_HCI_ADV_ITVL_MAX) || - (adv_itvl_max > BLE_HCI_ADV_ITVL_MAX)) { - rc = BLE_ERR_UNSUPPORTED; - goto done; - } - } - - /* There are only three adv channels, so check for any outside the range */ - if (((cmd->pri_chan_map & 0xF8) != 0) || (cmd->pri_chan_map == 0)) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - if (cmd->own_addr_type > BLE_HCI_ADV_OWN_ADDR_MAX) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - -#if !MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - /* If we dont support privacy some address types wont work */ - if (cmd->own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) { - rc = BLE_ERR_UNSUPPORTED; - goto done; - } -#endif - - /* peer address type is only valid for directed */ - if ((props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) && - (cmd->peer_addr_type > BLE_HCI_ADV_PEER_ADDR_MAX)) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - /* Check filter policy (valid only for undirected) */ - if (!(props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) && - cmd->filter_policy > BLE_HCI_ADV_FILT_MAX) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - if (!pri_phy_valid(cmd->pri_phy)) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - /* check secondary phy only if not using legacy PDUs */ - if (!(props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) && - !sec_phy_valid(cmd->sec_phy)) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - if (cmd->sid > 0x0f) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - if (cmd->scan_req_notif > 0x01) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - rc = BLE_ERR_SUCCESS; - - if (cmd->tx_power == 127) { - /* no preference */ - advsm->adv_txpwr = MYNEWT_VAL(BLE_LL_TX_PWR_DBM); - } else { - advsm->adv_txpwr = ble_phy_txpower_round(cmd->tx_power); - } - - /* we can always store as those are validated and used only when needed */ - advsm->peer_addr_type = cmd->peer_addr_type; - memcpy(advsm->peer_addr, cmd->peer_addr, BLE_DEV_ADDR_LEN); - advsm->own_addr_type = cmd->own_addr_type; - advsm->adv_filter_policy = cmd->filter_policy; - advsm->adv_chanmask = cmd->pri_chan_map; - advsm->adv_itvl_min = adv_itvl_min; - advsm->adv_itvl_max = adv_itvl_max; - advsm->pri_phy = cmd->pri_phy; - advsm->sec_phy = cmd->sec_phy; - /* Update SID only */ - advsm->adi = (advsm->adi & 0x0fff) | ((cmd->sid << 12)); - - advsm->props = props; - - /* Set proper mbuf chain for aux data */ - if (props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - advsm->aux_data = NULL; - } else if (props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE) { - advsm->aux_data = &advsm->scan_rsp_data; - } else { - advsm->aux_data = &advsm->adv_data; - } - - if (cmd->scan_req_notif) { - ble_ll_adv_flags_set(advsm, BLE_LL_ADV_SM_FLAG_SCAN_REQ_NOTIF); - } else { - ble_ll_adv_flags_clear(advsm, BLE_LL_ADV_SM_FLAG_SCAN_REQ_NOTIF); - } - - ble_ll_adv_flags_set(advsm, BLE_LL_ADV_SM_FLAG_CONFIGURED); - -done: - /* Update TX power */ - rsp->tx_power = rc ? 0 : advsm->adv_txpwr; - - *rsplen = sizeof(*rsp); - return rc; -} - -int -ble_ll_adv_ext_set_adv_data(const uint8_t *cmdbuf, uint8_t cmdlen) -{ - const struct ble_hci_le_set_ext_adv_data_cp *cmd = (const void *) cmdbuf; - - if (cmdlen < sizeof(*cmd )) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (cmd->adv_data_len > BLE_HCI_MAX_EXT_ADV_DATA_LEN || - cmd->adv_data_len > cmdlen - sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* TODO fragment preference ignored for now */ - - return ble_ll_adv_set_adv_data(cmd->adv_data, cmd->adv_data_len, - cmd->adv_handle, cmd->operation); -} - -int -ble_ll_adv_ext_set_scan_rsp(const uint8_t *cmdbuf, uint8_t cmdlen) -{ - const struct ble_hci_le_set_ext_scan_rsp_data_cp *cmd = (const void *) cmdbuf; - - if (cmdlen < sizeof(*cmd )) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (cmd->scan_rsp_len > BLE_HCI_MAX_EXT_ADV_DATA_LEN || - cmd->scan_rsp_len > cmdlen - sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* TODO fragment preference ignored for now */ - - return ble_ll_adv_set_scan_rsp_data(cmd->scan_rsp, cmd->scan_rsp_len, - cmd->adv_handle, cmd->operation); -} - -/** - * HCI LE extended advertising enable command - * - * @param cmd Pointer to command data - * @param len Command data length - * - * @return int BLE error code - */ -int -ble_ll_adv_ext_set_enable(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_ext_adv_enable_cp *cmd = (const void *) cmdbuf; - struct ble_ll_adv_sm *advsm; - int i, j, rc; - - if (len < sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* check if length is correct */ - if (len != 2 + (cmd->num_sets * sizeof(cmd->sets[0]))) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (cmd->num_sets > BLE_ADV_INSTANCES) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (cmd->num_sets == 0) { - if (cmd->enable) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* disable all instances */ - for (i = 0; i < BLE_ADV_INSTANCES; i++) { - ble_ll_adv_set_enable(i, 0, 0, 0); - } - - return BLE_ERR_SUCCESS; - } - - /* validate instances */ - for (i = 0; i < cmd->num_sets; i++) { - /* validate duplicated sets */ - for (j = i + 1; j < cmd->num_sets; j++) { - if (cmd->sets[i].adv_handle == cmd->sets[j].adv_handle) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - } - - advsm = ble_ll_adv_sm_find_configured(cmd->sets[i].adv_handle); - if (!advsm) { - return BLE_ERR_UNK_ADV_INDENT; - } - - if (cmd->enable) { - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_HD_DIRECTED) { - if (cmd->sets[i].duration == 0 || - le16toh(cmd->sets[i].duration) > 128) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - } - } - } - - for (i = 0; i < cmd->num_sets; i++) { - rc = ble_ll_adv_set_enable(cmd->sets[i].adv_handle, cmd->enable, - le16toh(cmd->sets[i].duration), - cmd->sets[i].max_events); - if (rc) { - return rc; - } - } - - return BLE_ERR_SUCCESS; -} - -int -ble_ll_adv_set_random_addr(const uint8_t *addr, uint8_t instance) -{ - struct ble_ll_adv_sm *advsm; - - advsm = ble_ll_adv_sm_find_configured(instance); - if (!advsm) { - return BLE_ERR_UNK_ADV_INDENT; - } - - /* - * Reject if connectable advertising is on - * Core Spec Vol. 2 Part E 7.8.52 - */ - if (advsm->adv_enabled && - (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE)) { - return BLE_ERR_CMD_DISALLOWED; - } - - memcpy(advsm->adv_random_addr, addr, BLE_DEV_ADDR_LEN); - return BLE_ERR_SUCCESS; -} - -int -ble_ll_adv_hci_set_random_addr(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_adv_set_rnd_addr_cp *cmd = (const void *) cmdbuf; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - return ble_ll_adv_set_random_addr(cmd->addr, cmd->adv_handle); -} - -/** - * HCI LE extended advertising remove command - * - * @return int BLE error code - */ -int -ble_ll_adv_remove(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_remove_adv_set_cp *cmd = (const void *) cmdbuf; - struct ble_ll_adv_sm *advsm; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - advsm = ble_ll_adv_sm_find_configured(cmd->adv_handle); - if (!advsm) { - return BLE_ERR_UNK_ADV_INDENT; - } - - if (advsm->adv_enabled) { - return BLE_ERR_CMD_DISALLOWED; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - if (advsm->periodic_adv_enabled) { - return BLE_ERR_CMD_DISALLOWED; - } - - if (advsm->periodic_adv_data) { - os_mbuf_free_chain(advsm->periodic_adv_data); - } -#endif - - if (advsm->adv_data) { - os_mbuf_free_chain(advsm->adv_data); - } - if (advsm->scan_rsp_data) { - os_mbuf_free_chain(advsm->scan_rsp_data); - } - - ble_ll_adv_sm_init(advsm); - - return BLE_ERR_SUCCESS; -} - -/** - * HCI LE extended advertising clear command - * - * @return int BLE error code - */ -int -ble_ll_adv_clear_all(void) -{ - int i; - - for (i = 0; i < BLE_ADV_INSTANCES; i++) { - if (g_ble_ll_adv_sm[i].adv_enabled) { - return BLE_ERR_CMD_DISALLOWED; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - if (g_ble_ll_adv_sm[i].periodic_adv_enabled) { - return BLE_ERR_CMD_DISALLOWED; - } -#endif - } - - ble_ll_adv_reset(); - - return BLE_ERR_SUCCESS; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) -static uint16_t -ble_ll_adv_sync_get_pdu_len(uint16_t data_len, uint16_t *data_offset, - uint16_t props) -{ - uint16_t rem_data_len = data_len - *data_offset; - uint8_t hdr_len = BLE_LL_EXT_ADV_HDR_LEN; - uint8_t ext_hdr = 0; - - /* TxPower if configured - * Note: TxPower shall not be present in chain PDU for SYNC - */ - if (*data_offset == 0 && - (props & BLE_HCI_LE_SET_PERIODIC_ADV_PROP_INC_TX_PWR)) { - ext_hdr |= (1 << BLE_LL_EXT_ADV_TX_POWER_BIT); - hdr_len += BLE_LL_EXT_ADV_TX_POWER_SIZE; - } - - /* if we have any fields in ext header we need to add flags, note that Aux - * PTR is handled later and it will account for flags if needed - * - * This could be handled inside TxPower but lets keep code consistent with - * how Aux calculate works and this also make it easier to add more fields - * into flags if needed in future - */ - if (ext_hdr) { - hdr_len += BLE_LL_EXT_ADV_FLAGS_SIZE; - } - - /* AdvData always */ - data_len = min(BLE_LL_MAX_PAYLOAD_LEN - hdr_len, rem_data_len); - - /* AuxPtr if there are more AdvData remaining that we can fit here */ - if (rem_data_len > data_len) { - /* adjust for flags that needs to be added if AuxPtr is only field - * in Extended Header - */ - if (!ext_hdr) { - hdr_len += BLE_LL_EXT_ADV_FLAGS_SIZE; - data_len -= BLE_LL_EXT_ADV_FLAGS_SIZE; - } - - hdr_len += BLE_LL_EXT_ADV_AUX_PTR_SIZE; - data_len -= BLE_LL_EXT_ADV_AUX_PTR_SIZE; - - /* PDU payload should be full if chained */ - BLE_LL_ASSERT(hdr_len + data_len == BLE_LL_MAX_PAYLOAD_LEN); - } - - *data_offset += data_len; - - return hdr_len + data_len; -} - -static bool -ble_ll_adv_periodic_check_data_itvl(uint16_t payload_len, uint16_t props, - uint16_t itvl, uint8_t phy) -{ - uint32_t max_usecs = 0; - uint32_t itvl_usecs; - uint16_t offset = 0; - uint16_t pdu_len; - - while (offset < payload_len) { - pdu_len = ble_ll_adv_sync_get_pdu_len(payload_len, &offset, props); - - max_usecs += ble_ll_pdu_tx_time_get(pdu_len, phy); - max_usecs += ble_ll_usecs_to_ticks_round_up(BLE_LL_MAFS + - MYNEWT_VAL(BLE_LL_SCHED_AUX_CHAIN_MAFS_DELAY)); - } - - itvl_usecs = (uint32_t)itvl * BLE_LL_ADV_PERIODIC_ITVL; - - return max_usecs < itvl_usecs; -} - -int -ble_ll_adv_periodic_set_param(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_periodic_adv_params_cp *cmd = (const void *) cmdbuf; - struct ble_ll_adv_sm *advsm; - uint16_t adv_itvl_min; - uint16_t adv_itvl_max; - uint16_t props; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - adv_itvl_min = le16toh(cmd->min_itvl); - adv_itvl_max = le16toh(cmd->max_itvl); - props = le16toh(cmd->props); - - advsm = ble_ll_adv_sm_find_configured(cmd->adv_handle); - if (!advsm) { - return BLE_ERR_UNK_ADV_INDENT; - } - - /* If the advertising set identified by the Advertising_Handle specified - * scannable, connectable, legacy, or anonymous advertising, the Controller - * shall return the error code Invalid HCI Command Parameters (0x12). - */ - if (advsm->props & (BLE_HCI_LE_SET_EXT_ADV_PROP_ANON_ADV | - BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE | - BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE | - BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* If the Host issues this command when periodic advertising is enabled for - * the specified advertising set, the Controller shall return the error code - * Command Disallowed (0x0C). - */ - if (advsm->periodic_adv_enabled) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* validate intervals */ - if ((adv_itvl_min < 0x0006) || (adv_itvl_max < 0x006) || - (adv_itvl_min > adv_itvl_max)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* validate properties */ - if (props & ~BLE_HCI_LE_SET_PERIODIC_ADV_PROP_MASK) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* If the advertising set already contains periodic advertising data and the - * length of the data is greater than the maximum that the Controller can - * transmit within a periodic advertising interval of - * Periodic_Advertising_Interval_Max, the Controller shall return the error - * code Packet Too Long (0x45). - */ - if (!ble_ll_adv_periodic_check_data_itvl(SYNC_DATA_LEN(advsm), props, - adv_itvl_max, advsm->sec_phy)) { - return BLE_ERR_PACKET_TOO_LONG; - } - - advsm->periodic_adv_itvl_min = adv_itvl_min; - advsm->periodic_adv_itvl_max = adv_itvl_max; - advsm->periodic_adv_props = props; - - ble_ll_adv_flags_set(advsm, BLE_LL_ADV_SM_FLAG_PERIODIC_CONFIGURED); - - return BLE_ERR_SUCCESS; -} - -int -ble_ll_adv_periodic_set_data(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_periodic_adv_data_cp *cmd = (const void *) cmdbuf; - struct ble_ll_adv_sm *advsm; - uint16_t payload_total_len; - bool new_data = false; - - if (len < sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (cmd->adv_data_len > BLE_HCI_MAX_PERIODIC_ADV_DATA_LEN || - cmd->adv_data_len != len - sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - advsm = ble_ll_adv_sm_find_configured(cmd->adv_handle); - if (!advsm) { - return BLE_ERR_UNK_ADV_INDENT; - } - - if (!(advsm->flags & BLE_LL_ADV_SM_FLAG_PERIODIC_CONFIGURED)) { - return BLE_ERR_CMD_DISALLOWED; - } - - switch (cmd->operation) { - case BLE_HCI_LE_SET_DATA_OPER_LAST: - case BLE_HCI_LE_SET_DATA_OPER_INT: - if (!(advsm->flags & BLE_LL_ADV_SM_FLAG_PERIODIC_DATA_INCOMPLETE)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (!advsm->periodic_adv_data || !cmd->adv_data_len) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (advsm->periodic_adv_enabled) { - return BLE_ERR_CMD_DISALLOWED; - } - break; - case BLE_HCI_LE_SET_DATA_OPER_FIRST: - if (advsm->periodic_adv_enabled) { - return BLE_ERR_CMD_DISALLOWED; - } - - if (!cmd->adv_data_len) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - new_data = true; - break; - case BLE_HCI_LE_SET_DATA_OPER_COMPLETE: - new_data = true; - break; - default: - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - payload_total_len = cmd->adv_data_len; - if (!new_data) { - payload_total_len += SYNC_DATA_LEN(advsm); - } - - /* If the combined length of the data is greater than the maximum that the - * Controller can transmit within the current periodic advertising interval - * (if periodic advertising is currently enabled) or the - * Periodic_Advertising_Interval_Max for the advertising set (if currently - * disabled), all the data shall be discarded and the Controller shall - * return the error code Packet Too Long (0x45). - */ - if (!ble_ll_adv_periodic_check_data_itvl(payload_total_len, - advsm->periodic_adv_props, - advsm->periodic_adv_itvl_max, - advsm->sec_phy)) { - return BLE_ERR_PACKET_TOO_LONG; - } - - if (advsm->periodic_adv_active) { - ble_ll_adv_flags_clear(advsm, BLE_LL_ADV_SM_FLAG_PERIODIC_NEW_DATA); - - ble_ll_adv_update_data_mbuf(&advsm->periodic_new_data, true, - BLE_ADV_DATA_MAX_LEN, - cmd->adv_data, cmd->adv_data_len); - if (!advsm->periodic_new_data) { - return BLE_ERR_MEM_CAPACITY; - } - - ble_ll_adv_flags_set(advsm, BLE_LL_ADV_SM_FLAG_PERIODIC_NEW_DATA); - } else { - ble_ll_adv_update_data_mbuf(&advsm->periodic_adv_data, new_data, - BLE_ADV_DATA_MAX_LEN, cmd->adv_data, - cmd->adv_data_len); - if (!advsm->periodic_adv_data) { - return BLE_ERR_MEM_CAPACITY; - } - } - - /* set/clear incomplete data flag only on success */ - switch (cmd->operation) { - case BLE_HCI_LE_SET_DATA_OPER_LAST: - case BLE_HCI_LE_SET_DATA_OPER_COMPLETE: - ble_ll_adv_flags_clear(advsm, - BLE_LL_ADV_SM_FLAG_PERIODIC_DATA_INCOMPLETE); - break; - case BLE_HCI_LE_SET_DATA_OPER_INT: - case BLE_HCI_LE_SET_DATA_OPER_FIRST: - default: - ble_ll_adv_flags_set(advsm, - BLE_LL_ADV_SM_FLAG_PERIODIC_DATA_INCOMPLETE); - break; - } - - return BLE_ERR_SUCCESS; -} - -int -ble_ll_adv_periodic_enable(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_periodic_adv_enable_cp *cmd = (const void *)cmdbuf; - struct ble_ll_adv_sm *advsm; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - advsm = ble_ll_adv_sm_find_configured(cmd->adv_handle); - if (!advsm) { - return BLE_ERR_UNK_ADV_INDENT; - } - - if (cmd->enable) { - if (advsm->flags & BLE_LL_ADV_SM_FLAG_PERIODIC_DATA_INCOMPLETE) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* If Enable is set to 0x01 and the length of the periodic advertising - * data is greater than the maximum that the Controller can transmit - * within the chosen periodicadvertising interval, the Controller shall - * return the error code Packet Too Long (0x45). - */ - if (!ble_ll_adv_periodic_check_data_itvl(SYNC_DATA_LEN(advsm), - advsm->periodic_adv_props, - advsm->periodic_adv_itvl_max, - advsm->sec_phy)) { - return BLE_ERR_PACKET_TOO_LONG; - } - - /* If the advertising set is not currently enabled (see the - * LE_Set_Extended_Advertising_Enable command), the periodic advertising - * is not started until the advertising set is enabled. - */ - if (advsm->adv_enabled && !advsm->periodic_adv_active) { - /* Start the periodic advertising state machine */ - ble_ll_adv_sm_start_periodic(advsm); - } - } else { - /* Stop the periodic advertising state machine */ - ble_ll_adv_sm_stop_periodic(advsm); - } - - advsm->periodic_adv_enabled = cmd->enable; - - return BLE_ERR_SUCCESS; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) -static int -ble_ll_adv_periodic_send_sync_ind(struct ble_ll_adv_sm *advsm, - struct ble_ll_conn_sm *connsm, - uint16_t service_data) -{ - struct os_mbuf *om; - uint8_t *sync_ind; - - om = os_msys_get_pkthdr(BLE_LL_CTRL_MAX_PDU_LEN, - sizeof(struct ble_mbuf_hdr)); - if (!om) { - return BLE_ERR_MEM_CAPACITY; - } - - om->om_data[0] = BLE_LL_CTRL_PERIODIC_SYNC_IND; - - sync_ind = om->om_data + 1; - - /* ID (service_data), already in LE order */ - memcpy(sync_ind, &service_data, sizeof(service_data)); - - /* fill in syncinfo */ - ble_ll_adv_put_syncinfo(advsm, connsm, sync_ind + 20, sync_ind + 2); - - /* lastPaEventCounter */ - put_le16(sync_ind + 22, advsm->periodic_event_cntr_last_sent); - - /* SID, AType, SCA */ - sync_ind[24] = (advsm->adi >> 12); - sync_ind[24] |= !!(advsm->flags & BLE_LL_ADV_SM_FLAG_TX_ADD) << 4 ; - sync_ind[24] |= MYNEWT_VAL(BLE_LL_MASTER_SCA) << 5; - - /* PHY */ - sync_ind[25] = (0x01 << (advsm->sec_phy - 1)); - - /* AdvA */ - memcpy(sync_ind + 26, advsm->adva, BLE_DEV_ADDR_LEN); - - /* syncConnEventCount */ - put_le16(sync_ind + 32, connsm->event_cntr); - - ble_ll_conn_enqueue_pkt(connsm, om, BLE_LL_LLID_CTRL, - BLE_LL_CTRL_PERIODIC_SYNC_IND_LEN + 1); - - return BLE_ERR_SUCCESS; -} - -int -ble_ll_adv_periodic_set_info_transfer(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen) -{ - const struct ble_hci_le_periodic_adv_set_info_transfer_cp *cmd = (const void *)cmdbuf; - struct ble_hci_le_periodic_adv_set_info_transfer_rp *rsp = (void *) rspbuf; - struct ble_ll_conn_sm *connsm; - struct ble_ll_adv_sm *advsm; - uint16_t handle; - int rc; - - if (len != sizeof(*cmd)) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - advsm = ble_ll_adv_sm_find_configured(cmd->adv_handle); - if (!advsm) { - rc = BLE_ERR_UNK_ADV_INDENT; - goto done; - } - - if (!advsm->periodic_adv_active) { - rc = BLE_ERR_CMD_DISALLOWED; - goto done; - } - - handle = le16toh(cmd->conn_handle); - if (handle > 0xeff) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - connsm = ble_ll_conn_find_active_conn(handle); - if (!connsm) { - rc = BLE_ERR_UNK_CONN_ID; - goto done; - } - - /* TODO should not need to shift - * byte 3 (0 byte is conn_feature) , bit 1 - * - * Allow initiate LL procedure only if remote supports it. - */ - if (!(connsm->remote_features[2] & (BLE_LL_FEAT_SYNC_TRANS_RECV >> (8 * 3)))) { - rc = BLE_ERR_UNSUPP_REM_FEATURE; - goto done; - } - - rc = ble_ll_adv_periodic_send_sync_ind(advsm, connsm, cmd->service_data); - done: - rsp->conn_handle = cmd->conn_handle; - *rsplen = sizeof(*rsp); - return rc; -} -#endif -#endif -#endif - -/** - * Says whether the specified address is already connected or not. - * @param [in] addr The peer address. - * @param [in] addr_type Public address (0) or random address (1). - * @return Return 1 if already connected, 0 otherwise. - */ -static int -ble_ll_adv_already_connected(const uint8_t* addr, uint8_t addr_type) -{ - struct ble_ll_conn_sm *connsm; - - /* extracted from ble_ll_conn_slave_start function */ - SLIST_FOREACH(connsm, &g_ble_ll_conn_active_list, act_sle) { - if (!memcmp(&connsm->peer_addr, addr, BLE_DEV_ADDR_LEN)) { - if (addr_type == BLE_ADDR_RANDOM) { - if (connsm->peer_addr_type & 1) { - return 1; - } - } else { - if ((connsm->peer_addr_type & 1) == 0) { - return 1; - } - } - } - } - - return 0; -} - -/** - * Called when the LL receives a scan request or connection request - * - * Context: Called from interrupt context. - * - * @param rxbuf - * - * @return -1: request not for us or is a connect request. - * 0: request (scan) is for us and we successfully went from rx to tx. - * > 0: PHY error attempting to go from rx to tx. - */ -static int -ble_ll_adv_rx_req(uint8_t pdu_type, struct os_mbuf *rxpdu) -{ - int rc; - int resolved; - uint8_t chk_wl; - uint8_t txadd; - uint8_t peer_addr_type; - uint8_t *rxbuf; - uint8_t *adva; - uint8_t *peer; - struct ble_mbuf_hdr *ble_hdr; - struct ble_ll_adv_sm *advsm; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - struct aux_conn_rsp_data rsp_data; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - struct ble_ll_resolv_entry *rl; -#endif - - /* See if adva in the request (scan or connect) matches what we sent */ - advsm = g_ble_ll_cur_adv_sm; - rxbuf = rxpdu->om_data; - adva = rxbuf + BLE_LL_PDU_HDR_LEN + BLE_DEV_ADDR_LEN; - if (memcmp(advsm->adva, adva, BLE_DEV_ADDR_LEN)) { - return -1; - } - - /* Set device match bit if we are whitelisting */ - if (pdu_type == BLE_ADV_PDU_TYPE_SCAN_REQ) { - chk_wl = advsm->adv_filter_policy & 1; - } else { - chk_wl = advsm->adv_filter_policy & 2; - } - - /* Get the peer address type */ - if (rxbuf[0] & BLE_ADV_PDU_HDR_TXADD_MASK) { - txadd = BLE_ADDR_RANDOM; - } else { - txadd = BLE_ADDR_PUBLIC; - } - - ble_hdr = BLE_MBUF_HDR_PTR(rxpdu); - peer = rxbuf + BLE_LL_PDU_HDR_LEN; - peer_addr_type = txadd; - resolved = 0; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - rl = NULL; - if (ble_ll_resolv_enabled()) { - if (ble_ll_is_rpa(peer, txadd)) { - advsm->adv_rpa_index = ble_hw_resolv_list_match(); - if (advsm->adv_rpa_index >= 0) { - ble_hdr->rxinfo.flags |= BLE_MBUF_HDR_F_RESOLVED; - rl = &g_ble_ll_resolv_list[advsm->adv_rpa_index]; - if (chk_wl) { - peer = rl->rl_identity_addr; - peer_addr_type = rl->rl_addr_type; - resolved = 1; - } - } else { - if (chk_wl) { - return -1; - } - } - } else { - /* Verify privacy mode */ - rl = ble_ll_resolv_list_find(peer, peer_addr_type); - if (rl && (rl->rl_priv_mode == BLE_HCI_PRIVACY_NETWORK) && - rl->rl_has_peer) { - return -1; - } - } - } -#endif - - /* Set device match bit if we are whitelisting */ - if (chk_wl && !ble_ll_whitelist_match(peer, peer_addr_type, resolved)) { - return -1; - } - - /* - * We set the device match bit to tell the upper layer that we will - * accept the request - */ - ble_hdr->rxinfo.flags |= BLE_MBUF_HDR_F_DEVMATCH; - - /* Setup to transmit the scan response if appropriate */ - rc = -1; - - if (pdu_type == BLE_ADV_PDU_TYPE_SCAN_REQ) { - /* PHY used for scan requests shall be the same as the PHY used for the - * PDU that they reply to so no need to change PHY mode. - */ - ble_phy_set_txend_cb(ble_ll_adv_tx_done, advsm); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (advsm->flags & BLE_LL_ADV_SM_FLAG_SCAN_REQ_NOTIF) { - ble_ll_hci_ev_send_scan_req_recv(advsm->adv_instance, peer, - peer_addr_type); - } - - /* - * We need to store current rxed packet header temporarily so AuxPtr - * can be calculated (if necessary) relative to AUX_SCAN_RSP instead of - * AUX_ADV_IND. - */ - - advsm->rx_ble_hdr = ble_hdr; - rc = ble_phy_tx(ble_ll_adv_scan_rsp_pdu_make, advsm, - BLE_PHY_TRANSITION_NONE); - advsm->rx_ble_hdr = NULL; -#else - rc = ble_phy_tx(ble_ll_adv_scan_rsp_legacy_pdu_make, advsm, - BLE_PHY_TRANSITION_NONE); -#endif - - if (!rc) { - ble_hdr->rxinfo.flags |= BLE_MBUF_HDR_F_SCAN_RSP_TXD; - STATS_INC(ble_ll_stats, scan_rsp_txg); - } - } else if (pdu_type == BLE_ADV_PDU_TYPE_AUX_CONNECT_REQ) { - /* See if the device is already connected */ - if (ble_ll_adv_already_connected(peer, peer_addr_type)) { - return -1; - } - - /* - * Only accept connect requests from the desired address if we - * are doing directed advertising - */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) { - if (memcmp(advsm->initiator_addr, peer, BLE_DEV_ADDR_LEN)) { - return -1; - } - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - return -1; - } - - /* use remote address used over the air */ - rsp_data.advsm = advsm; - rsp_data.peer = rxbuf + BLE_LL_PDU_HDR_LEN; - rsp_data.rxadd = rxbuf[0] & BLE_ADV_PDU_HDR_TXADD_MASK; - - ble_phy_set_txend_cb(ble_ll_adv_tx_done, advsm); - rc = ble_phy_tx(ble_ll_adv_aux_conn_rsp_pdu_make, &rsp_data, - BLE_PHY_TRANSITION_NONE); - if (!rc) { - ble_ll_adv_flags_set(advsm, BLE_LL_ADV_SM_FLAG_CONN_RSP_TXD); - STATS_INC(ble_ll_stats, aux_conn_rsp_tx); - } -#endif - } - - return rc; -} - -/** - * Called when a connect request has been received. - * - * Context: Link Layer - * - * @param rxbuf - * @param flags - * - * @return 0: no connection started. 1: connection started - */ -static int -ble_ll_adv_conn_req_rxd(uint8_t *rxbuf, struct ble_mbuf_hdr *hdr, - struct ble_ll_adv_sm *advsm) -{ - int valid; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - uint8_t resolved; -#endif - uint8_t addr_type; - uint8_t *inita; - uint8_t *ident_addr; - - /* Don't create connection if AUX_CONNECT_RSP was not send */ - if (!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY)) { - if (!(advsm->flags & BLE_LL_ADV_SM_FLAG_CONN_RSP_TXD)) { - return 0; - } - } - - /* Check filter policy. */ - valid = 0; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - resolved = BLE_MBUF_HDR_RESOLVED(hdr); -#endif - inita = rxbuf + BLE_LL_PDU_HDR_LEN; - if (hdr->rxinfo.flags & BLE_MBUF_HDR_F_DEVMATCH) { - - valid = 1; - if (rxbuf[0] & BLE_ADV_PDU_HDR_TXADD_MASK) { - addr_type = BLE_ADDR_RANDOM; - } else { - addr_type = BLE_ADDR_PUBLIC; - } - - /* - * Only accept connect requests from the desired address if we - * are doing directed advertising - */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) { - ident_addr = inita; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - if (resolved) { - ident_addr = g_ble_ll_resolv_list[advsm->adv_rpa_index].rl_identity_addr; - addr_type = g_ble_ll_resolv_list[advsm->adv_rpa_index].rl_addr_type; - } -#endif - if ((addr_type != advsm->peer_addr_type) || - memcmp(advsm->peer_addr, ident_addr, BLE_DEV_ADDR_LEN)) { - valid = 0; - } - } - } - - if (valid) { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - if (resolved) { - /* Retain the resolvable private address that we received. */ - memcpy(advsm->adv_rpa, inita, BLE_DEV_ADDR_LEN); - - /* Update resolving list with current peer RPA */ - ble_ll_resolv_set_peer_rpa(advsm->adv_rpa_index, inita); - - /* - * Overwrite received inita with identity address since that - * is used from now on. - */ - memcpy(inita, - g_ble_ll_resolv_list[advsm->adv_rpa_index].rl_identity_addr, - BLE_DEV_ADDR_LEN); - - /* Peer address type is an identity address */ - addr_type = g_ble_ll_resolv_list[advsm->adv_rpa_index].rl_addr_type; - addr_type += 2; - } -#endif - - /* Try to start slave connection. If successful, stop advertising */ - valid = ble_ll_conn_slave_start(rxbuf, addr_type, hdr, - !(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY)); - if (valid) { - /* stop advertising only if not transmitting connection response */ - if (!(advsm->flags & BLE_LL_ADV_SM_FLAG_CONN_RSP_TXD)) { - ble_ll_adv_sm_stop(advsm); - } - } - } - - return valid; -} - -/** - * Called on phy rx pdu end when in advertising state. - * - * There are only two pdu types we care about in this state: scan requests - * and connection requests. When we receive a scan request we must determine if - * we need to send a scan response and that needs to be acted on within T_IFS. - * - * When we receive a connection request, we need to determine if we will allow - * this device to start a connection with us. However, no immediate response is - * sent so we handle this at the link layer task. - * - * Context: Interrupt - * - * @param pdu_type Type of pdu received. - * @param rxpdu Pointer to received PDU - * - * @return int - * < 0: Disable the phy after reception. - * == 0: Do not disable the PHY - * > 0: Do not disable PHY as that has already been done. - */ -int -ble_ll_adv_rx_isr_end(uint8_t pdu_type, struct os_mbuf *rxpdu, int crcok) -{ - int rc; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - struct ble_mbuf_hdr *rxhdr; -#endif - - rc = -1; - if (rxpdu == NULL) { - ble_ll_adv_tx_done(g_ble_ll_cur_adv_sm); - } else { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - rxhdr = BLE_MBUF_HDR_PTR(rxpdu); - rxhdr->rxinfo.user_data = g_ble_ll_cur_adv_sm; - if (ble_ll_adv_active_chanset_is_sec(g_ble_ll_cur_adv_sm)) { - rxhdr->rxinfo.flags |= BLE_MBUF_HDR_F_EXT_ADV_SEC; - } else { - assert(ble_ll_adv_active_chanset_is_pri(g_ble_ll_cur_adv_sm)); - } -#endif - if (crcok) { - if ((pdu_type == BLE_ADV_PDU_TYPE_SCAN_REQ) || - (pdu_type == BLE_ADV_PDU_TYPE_CONNECT_IND)) { - /* Process request */ - rc = ble_ll_adv_rx_req(pdu_type, rxpdu); - } - } - - if (rc) { - /* We no longer have a current state machine */ - g_ble_ll_cur_adv_sm = NULL; - } - } - - if (rc) { - ble_ll_state_set(BLE_LL_STATE_STANDBY); - } - - return rc; -} - -/** - * Process a received packet at the link layer task when in the advertising - * state - * - * Context: Link Layer - * - * - * @param ptype - * @param rxbuf - * @param hdr - * - * @return int - */ -void -ble_ll_adv_rx_pkt_in(uint8_t ptype, uint8_t *rxbuf, struct ble_mbuf_hdr *hdr) -{ - int adv_event_over; - struct ble_ll_adv_sm *advsm; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - advsm = (struct ble_ll_adv_sm *)hdr->rxinfo.user_data; -#else - advsm = &g_ble_ll_adv_sm[0]; -#endif - - /* - * It is possible that advertising was stopped and a packet plcaed on the - * LL receive packet queue. In this case, just ignore the received packet - * as the advertising state machine is no longer "valid" - */ - if (!advsm->adv_enabled) { - return; - } - - /* - * If we have received a scan request and we are transmitting a response - * or we have received a valid connect request, dont "end" the advertising - * event. In the case of a connect request we will stop advertising. In - * the case of the scan response transmission we will get a transmit - * end callback. - */ - adv_event_over = 1; - if (BLE_MBUF_HDR_CRC_OK(hdr)) { - if (ptype == BLE_ADV_PDU_TYPE_CONNECT_IND) { - if (ble_ll_adv_conn_req_rxd(rxbuf, hdr, advsm)) { - adv_event_over = 0; - } - } else { - if ((ptype == BLE_ADV_PDU_TYPE_SCAN_REQ) && - (hdr->rxinfo.flags & BLE_MBUF_HDR_F_SCAN_RSP_TXD)) { - adv_event_over = 0; - } - } - } - - if (adv_event_over) { - ble_ll_adv_make_done(advsm, hdr); - } -} - -/** - * Called when a receive PDU has started and we are advertising. - * - * Context: interrupt - * - * @param pdu_type - * @param rxpdu - * - * @return int - * < 0: A frame we dont want to receive. - * = 0: Continue to receive frame. Dont go from rx to tx - * > 0: Continue to receive frame and go from rx to tx when done - */ -int -ble_ll_adv_rx_isr_start(uint8_t pdu_type) -{ - int rc; - struct ble_ll_adv_sm *advsm; - - /* Assume we will abort the frame */ - rc = -1; - - /* If we get a scan request we must tell the phy to go from rx to tx */ - advsm = g_ble_ll_cur_adv_sm; - if (pdu_type == BLE_ADV_PDU_TYPE_SCAN_REQ) { - /* Only accept scan requests if we are indirect adv or scan adv */ - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE) { - rc = 1; - } - } else { - /* Only accept connect requests if connectable advertising event */ - if (pdu_type == BLE_ADV_PDU_TYPE_CONNECT_IND) { - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE) { - /* Need transition to TX if extended adv */ - rc = !(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY); - } - } - } - - /* - * If we abort the frame, we need to post the LL task to check if the - * advertising event is over. - */ - if (rc < 0) { - ble_ll_adv_tx_done(advsm); - } - - return rc; -} - -static void -ble_ll_adv_drop_event(struct ble_ll_adv_sm *advsm) -{ - STATS_INC(ble_ll_stats, adv_drop_event); - - ble_ll_sched_rmv_elem(&advsm->adv_sch); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - ble_ll_sched_rmv_elem(&advsm->aux[0].sch); - ble_ll_sched_rmv_elem(&advsm->aux[1].sch); - - ble_npl_eventq_remove(&g_ble_ll_data.ll_evq, &advsm->adv_sec_txdone_ev); - advsm->aux_active = 0; -#endif - - advsm->adv_chan = ble_ll_adv_final_chan(advsm); - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &advsm->adv_txdone_ev); -} - -static void -ble_ll_adv_reschedule_event(struct ble_ll_adv_sm *advsm) -{ - int rc; - uint32_t start_time; - uint32_t max_delay_ticks; - - assert(advsm->adv_enabled); - - if (!advsm->adv_sch.enqueued) { - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_HD_DIRECTED) { - max_delay_ticks = 0; - } else { - max_delay_ticks = - os_cputime_usecs_to_ticks(BLE_LL_ADV_DELAY_MS_MAX * 1000); - } - - rc = ble_ll_sched_adv_reschedule(&advsm->adv_sch, &start_time, - max_delay_ticks); - if (rc) { - ble_ll_adv_drop_event(advsm); - return; - } - - start_time += g_ble_ll_sched_offset_ticks; - advsm->adv_event_start_time = start_time; - advsm->adv_pdu_start_time = start_time; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) && - !advsm->aux_active) { - ble_ll_adv_aux_schedule(advsm); - } -#endif -} - -/** - * Called when an advertising event is over. - * - * Context: Link Layer task. - * - * @param arg Pointer to advertising state machine. - */ -static void -ble_ll_adv_done(struct ble_ll_adv_sm *advsm) - -{ - int rc; - int resched_pdu; - uint8_t mask; - uint8_t final_adv_chan; - int32_t delta_t; - uint32_t itvl; - uint32_t tick_itvl; - uint32_t start_time; - - assert(advsm->adv_enabled); - - ble_ll_rfmgmt_release(); - - ble_ll_adv_update_adv_scan_rsp_data(advsm); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - /* stop advertising this was due to transmitting connection response */ - if (advsm->flags & BLE_LL_ADV_SM_FLAG_CONN_RSP_TXD) { - ble_ll_adv_sm_stop(advsm); - return; - } - } -#endif - - /* Remove the element from the schedule if it is still there. */ - ble_ll_sched_rmv_elem(&advsm->adv_sch); - - ble_npl_eventq_remove(&g_ble_ll_data.ll_evq, &advsm->adv_txdone_ev); - - /* - * Check if we have ended our advertising event. If our last advertising - * packet was sent on the last channel, it means we are done with this - * event. - */ - final_adv_chan = ble_ll_adv_final_chan(advsm); - - if (advsm->adv_chan == final_adv_chan) { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (advsm->events_max) { - advsm->events++; - } -#endif - - ble_ll_scan_chk_resume(); - - /* This event is over. Set adv channel to first one */ - advsm->adv_chan = ble_ll_adv_first_chan(advsm); - - /* - * Calculate start time of next advertising event. NOTE: we do not - * add the random advDelay as the scheduling code will do that. - */ - itvl = advsm->adv_itvl_usecs; - tick_itvl = os_cputime_usecs_to_ticks(itvl); - advsm->adv_event_start_time += tick_itvl; - advsm->adv_pdu_start_time = advsm->adv_event_start_time; - - /* - * The scheduled time better be in the future! If it is not, we will - * just keep advancing until we the time is in the future - */ - start_time = advsm->adv_pdu_start_time - g_ble_ll_sched_offset_ticks; - - delta_t = (int32_t)(start_time - os_cputime_get32()); - if (delta_t < 0) { - /* - * NOTE: we just the same interval that we calculated earlier. - * No real need to keep recalculating a new interval. - */ - while (delta_t < 0) { - advsm->adv_event_start_time += tick_itvl; - advsm->adv_pdu_start_time = advsm->adv_event_start_time; - delta_t += (int32_t)tick_itvl; - } - } - resched_pdu = 0; - } else { - /* - * Move to next advertising channel. If not in the mask, just - * increment by 1. We can do this because we already checked if we - * just transmitted on the last advertising channel - */ - ++advsm->adv_chan; - mask = 1 << (advsm->adv_chan - BLE_PHY_ADV_CHAN_START); - if ((mask & advsm->adv_chanmask) == 0) { - ++advsm->adv_chan; - } - - /* - * We will transmit right away. Set next pdu start time to now - * plus a xcvr start delay just so we dont count late adv starts - */ - advsm->adv_pdu_start_time = os_cputime_get32() + - g_ble_ll_sched_offset_ticks; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* If we're past aux (unlikely, but can happen), just drop an event */ - if (!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) && - advsm->aux_active && - advsm->adv_pdu_start_time > AUX_CURRENT(advsm)->start_time) { - ble_ll_adv_drop_event(advsm); - return; - } -#endif - - resched_pdu = 1; - } - - /* check if advertising timed out */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (advsm->duration && - advsm->adv_pdu_start_time >= advsm->adv_end_time) { - /* Legacy PDUs need to be stop here. - * For ext adv it will be stopped when AUX is done (unless it was - * dropped so check if AUX is active here as well). - */ - if ((advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) || - !advsm->aux_active) { - ble_ll_adv_sm_stop_timeout(advsm); - } - - return; - } -#else - if ((advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_HD_DIRECTED) && - (advsm->adv_pdu_start_time >= advsm->adv_end_time)) { - ble_ll_adv_sm_stop_timeout(advsm); - return; - } -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (advsm->events_max && (advsm->events >= advsm->events_max)) { - /* Legacy PDUs need to be stop here. - * For ext adv it will be stopped when AUX is done (unless it was - * dropped so check if AUX is active here as well). - */ - if ((advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) || - !advsm->aux_active) { - ble_ll_adv_sm_stop_limit_reached(advsm); - } - - return; - } -#endif - - /* We need to regenerate our RPA's if we have passed timeout */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - ble_ll_adv_chk_rpa_timeout(advsm); -#endif - - /* Schedule advertising transmit */ - ble_ll_adv_set_sched(advsm); - - if (!resched_pdu) { - ble_ll_adv_reschedule_event(advsm); - return; - } - - /* - * In the unlikely event we can't reschedule this, just post a done event - * and we will reschedule the next advertising PDU. - */ - rc = ble_ll_sched_adv_resched_pdu(&advsm->adv_sch); - if (rc) { - STATS_INC(ble_ll_stats, adv_resched_pdu_fail); - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &advsm->adv_txdone_ev); - } -} - -static void -ble_ll_adv_event_done(struct ble_npl_event *ev) -{ - ble_ll_adv_done(ble_npl_event_get_arg(ev)); -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -/** - * Called when auxiliary packet is txd on secondary channel - * - * Context: Link Layer task. - * - * @param ev - */ -static void -ble_ll_adv_sec_done(struct ble_ll_adv_sm *advsm) -{ - struct ble_ll_adv_aux *aux; - struct ble_ll_adv_aux *aux_next; - - assert(advsm->adv_enabled); - assert(advsm->aux_active); - - aux = AUX_CURRENT(advsm); - aux_next = AUX_NEXT(advsm); - - /* We don't need RF anymore */ - ble_ll_rfmgmt_release(); - - if (advsm->aux_not_scanned) { - ble_ll_sched_rmv_elem(&aux_next->sch); - } - - /* Remove anything else scheduled for secondary channel */ - ble_ll_sched_rmv_elem(&aux->sch); - ble_npl_eventq_remove(&g_ble_ll_data.ll_evq, &advsm->adv_sec_txdone_ev); - - /* Stop advertising due to transmitting connection response */ - if (advsm->flags & BLE_LL_ADV_SM_FLAG_CONN_RSP_TXD) { - ble_ll_adv_sm_stop(advsm); - return; - } - - /* If we have next AUX scheduled, try to schedule another one */ - if (aux_next->sch.enqueued) { - advsm->aux_index ^= 1; - advsm->aux_first_pdu = 0; - ble_ll_adv_aux_schedule_next(advsm); - return; - } - - ble_ll_scan_chk_resume(); - - /* Check if advertising timed out */ - if (advsm->duration && (advsm->adv_pdu_start_time >= advsm->adv_end_time)) { - ble_ll_adv_sm_stop_timeout(advsm); - return; - } - - if (advsm->events_max && (advsm->events >= advsm->events_max)) { - ble_ll_adv_sm_stop_limit_reached(advsm); - return; - } - - advsm->aux_active = 0; - ble_ll_adv_update_adv_scan_rsp_data(advsm); - ble_ll_adv_reschedule_event(advsm); -} - -static void -ble_ll_adv_sec_event_done(struct ble_npl_event *ev) -{ - ble_ll_adv_sec_done(ble_npl_event_get_arg(ev)); -} -#endif - -static void -ble_ll_adv_make_done(struct ble_ll_adv_sm *advsm, struct ble_mbuf_hdr *hdr) -{ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (BLE_MBUF_HDR_EXT_ADV_SEC(hdr)) { - assert(!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY)); - assert(ble_ll_adv_active_chanset_is_sec(advsm)); - ble_ll_adv_active_chanset_clear(advsm); - ble_ll_adv_sec_done(advsm); - } else { - assert(ble_ll_adv_active_chanset_is_pri(advsm)); - ble_ll_adv_active_chanset_clear(advsm); - ble_ll_adv_done(advsm); - } -#else - ble_ll_adv_active_chanset_clear(advsm); - ble_ll_adv_done(advsm); -#endif -} - -/** - * Checks if the controller can change the whitelist. If advertising is enabled - * and is using the whitelist the controller is not allowed to change the - * whitelist. - * - * @return int 0: not allowed to change whitelist; 1: change allowed. - */ -int -ble_ll_adv_can_chg_whitelist(void) -{ - struct ble_ll_adv_sm *advsm; - int rc; - int i; - - rc = 1; - for (i = 0; i < BLE_ADV_INSTANCES; ++i) { - advsm = &g_ble_ll_adv_sm[i]; - if (advsm->adv_enabled && - (advsm->adv_filter_policy != BLE_HCI_ADV_FILT_NONE)) { - rc = 0; - break; - } - } - - return rc; -} - -/** - * Sends the connection complete event when advertising a connection starts. - * - * @return uint8_t* Pointer to event buffer - */ -void -ble_ll_adv_send_conn_comp_ev(struct ble_ll_conn_sm *connsm, - struct ble_mbuf_hdr *rxhdr) -{ - uint8_t *evbuf; - struct ble_ll_adv_sm *advsm; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - advsm = (struct ble_ll_adv_sm *)rxhdr->rxinfo.user_data; -#else - advsm = &g_ble_ll_adv_sm[0]; -#endif - - evbuf = advsm->conn_comp_ev; - assert(evbuf != NULL); - advsm->conn_comp_ev = NULL; - - ble_ll_conn_comp_event_send(connsm, BLE_ERR_SUCCESS, evbuf, advsm); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) - ble_ll_hci_ev_le_csa(connsm); -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (ble_ll_hci_adv_mode_ext()) { - ble_ll_hci_ev_send_adv_set_terminated(0, advsm->adv_instance, - connsm->conn_handle, advsm->events); - } -#endif -} - -/** - * Returns the local resolvable private address currently being using by - * the advertiser - * - * @return uint8_t* - */ -uint8_t * -ble_ll_adv_get_local_rpa(struct ble_ll_adv_sm *advsm) -{ - uint8_t *rpa = NULL; - - if (advsm->own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) { - if ((advsm->flags & BLE_LL_ADV_SM_FLAG_TX_ADD) && - ble_ll_is_rpa(advsm->adva, 1)) { - rpa = advsm->adva; - } - } - - return rpa; -} - -/** - * Returns the peer resolvable private address of last device connecting to us - * - * @return uint8_t* - */ -uint8_t * -ble_ll_adv_get_peer_rpa(struct ble_ll_adv_sm *advsm) -{ - /* XXX: should this go into IRK list or connection? */ - return advsm->adv_rpa; -} - -/** - * Called when the LL wait for response timer expires while in the advertising - * state. Disables the phy and - * - */ -void -ble_ll_adv_wfr_timer_exp(void) -{ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - g_ble_ll_cur_adv_sm->aux_not_scanned = 1; -#endif - - ble_phy_disable(); - ble_ll_adv_tx_done(g_ble_ll_cur_adv_sm); -} - -/** - * Reset the advertising state machine. - * - * Context: Link Layer task - * - */ -void -ble_ll_adv_reset(void) -{ - int i; - struct ble_ll_adv_sm *advsm; - - for (i = 0; i < BLE_ADV_INSTANCES; ++i) { - advsm = &g_ble_ll_adv_sm[i]; - - /* Stop advertising state machine */ - ble_ll_adv_sm_stop(advsm); - - /* clear any data present */ - os_mbuf_free_chain(advsm->adv_data); - os_mbuf_free_chain(advsm->scan_rsp_data); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - /* Stop periodic advertising state machine */ - ble_ll_adv_sm_stop_periodic(advsm); - - /* clear any periodic data present */ - os_mbuf_free_chain(advsm->periodic_adv_data); -#endif - - /* re-initialize the advertiser state machine */ - ble_ll_adv_sm_init(advsm); - } -} - -/* Called to determine if advertising is enabled. - */ -uint8_t -ble_ll_adv_enabled(void) -{ - int i; - - for (i = 0; i < BLE_ADV_INSTANCES; i++) { - if (g_ble_ll_adv_sm[i].adv_enabled) { - return 1; - } - } - - return 0; -} - -static void -ble_ll_adv_sm_init(struct ble_ll_adv_sm *advsm) -{ - memset(advsm, 0, sizeof(struct ble_ll_adv_sm)); - - advsm->adv_itvl_min = BLE_HCI_ADV_ITVL_DEF; - advsm->adv_itvl_max = BLE_HCI_ADV_ITVL_DEF; - advsm->adv_chanmask = BLE_HCI_ADV_CHANMASK_DEF; - - /* Initialize advertising tx done event */ - ble_npl_event_init(&advsm->adv_txdone_ev, ble_ll_adv_event_done, advsm); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - ble_npl_event_init(&advsm->adv_sec_txdone_ev, ble_ll_adv_sec_event_done, advsm); -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - ble_npl_event_init(&advsm->adv_periodic_txdone_ev, - ble_ll_adv_periodic_event_done, advsm); -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* Initialize aux schedulers */ - advsm->aux_active = 0; - advsm->aux[0].sch.cb_arg = advsm; - advsm->aux[0].sch.sched_cb = ble_ll_adv_secondary_tx_start_cb; - advsm->aux[0].sch.sched_type = BLE_LL_SCHED_TYPE_ADV; - advsm->aux[1].sch.cb_arg = advsm; - advsm->aux[1].sch.sched_cb = ble_ll_adv_secondary_tx_start_cb; - advsm->aux[1].sch.sched_type = BLE_LL_SCHED_TYPE_ADV; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - /* Initialize sync schedulers */ - advsm->periodic_sync_active = 0; - advsm->periodic_sync[0].sch.cb_arg = advsm; - advsm->periodic_sync[0].sch.sched_cb = ble_ll_adv_sync_tx_start_cb; - advsm->periodic_sync[0].sch.sched_type = BLE_LL_SCHED_TYPE_PERIODIC; - advsm->periodic_sync[1].sch.cb_arg = advsm; - advsm->periodic_sync[1].sch.sched_cb = ble_ll_adv_sync_tx_start_cb; - advsm->periodic_sync[1].sch.sched_type = BLE_LL_SCHED_TYPE_PERIODIC; -#endif -#endif - - /* Configure instances to be legacy on start */ - advsm->props |= BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE; - advsm->props |= BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY; -} - -/** - * Initialize the advertising functionality of a BLE device. This should - * be called once on initialization - */ -void -ble_ll_adv_init(void) -{ - int i; - - /* Set default advertising parameters */ - for (i = 0; i < BLE_ADV_INSTANCES; ++i) { - ble_ll_adv_sm_init(&g_ble_ll_adv_sm[i]); - } -} - -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_conn.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_conn.c deleted file mode 100644 index b3788de1d..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_conn.c +++ /dev/null @@ -1,4279 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/porting/nimble/include/os/os_cputime.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/include/nimble/hci_common.h" -#include "nimble/nimble/include/nimble/ble_hci_trans.h" - -#if defined(ARDUINO_ARCH_NRF5) && defined(NRF51) -#include "nimble/nimble/drivers/nrf51/include/ble/xcvr.h" -#elif defined(ARDUINO_ARCH_NRF5) && defined(NRF52_SERIES) -#include "nimble/nimble/drivers/nrf52/include/ble/xcvr.h" -#endif - -#include "../include/controller/ble_ll.h" -#include "../include/controller/ble_ll_hci.h" -#include "../include/controller/ble_ll_scan.h" -#include "../include/controller/ble_ll_whitelist.h" -#include "../include/controller/ble_ll_sched.h" -#include "../include/controller/ble_ll_ctrl.h" -#include "../include/controller/ble_ll_resolv.h" -#include "../include/controller/ble_ll_adv.h" -#include "../include/controller/ble_ll_trace.h" -#include "../include/controller/ble_ll_rfmgmt.h" -#include "../include/controller/ble_phy.h" -#include "../include/controller/ble_hw.h" -#include "../include/controller/ble_ll_utils.h" -#include "ble_ll_conn_priv.h" - -#if (BLETEST_THROUGHPUT_TEST == 1) -extern void bletest_completed_pkt(uint16_t handle); -#endif - -/* XXX TODO - * 1) I think if we are initiating and we already have a connection with - * a device that we will still try and connect to it. Fix this. - * -> This is true. There are a couple things to do - * i) When a connection create is issued, if we already are connected - * deny it. BLE ERROR = 0x0B (ACL connection exists). - * ii) If we receive an advertisement while initiating and want to send - * a connect request to the device, make sure we dont have it. - * iii) I think I need to do something like this: I am initiating and - * advertising. Suppose the device I want to connect to sends me a connect - * request because I am advertising? What happens to connection? Deal - * with this! - * - * 2) Make sure we check incoming data packets for size and all that. You - * know, supported octets and all that. For both rx and tx. - * - * 3) Make sure we are setting the schedule end time properly for both slave - * and master. We should just set this to the end of the connection event. - * We might want to guarantee a IFS time as well since the next event needs - * to be scheduled prior to the start of the event to account for the time it - * takes to get a frame ready (which is pretty much the IFS time). - * - * 4) looks like the current code will allow the 1st packet in a - * connection to extend past the end of the allocated connection end - * time. That is not good. Need to deal with that. Need to extend connection - * end time. - * - * 6) Use error code 0x3E correctly! Connection failed to establish. If you - * read the LE connection complete event, it says that if the connection - * fails to be established that the connection complete event gets sent to - * the host that issued the create connection. Need to resolve this. - * - * 7) How does peer address get set if we are using whitelist? Look at filter - * policy and make sure you are doing this correctly. - * - * 8) Right now I use a fixed definition for required slots. CHange this. - * - * 10) See what connection state machine elements are purely master and - * purely slave. We can make a union of them. - * - * 11) Not sure I am dealing with the connection terminate timeout perfectly. - * I may extend a connection event too long although if it is always in terms - * of connection events I am probably fine. Checking at end that the next - * connection event will occur past terminate timeould would be fine. - * - * 12) When a slave receives a data packet in a connection it has to send a - * response. Well, it should. If this packet will overrun the next scheduled - * event, what should we do? Transmit anyway? Not transmit? For now, we just - * transmit. - * - * 32kHz crystal - * 1) When scheduling, I need to make sure I have time between - * this one and the next. Should I deal with this in the sched. Or - * is this basically accounted for given a slot? I really just need to - * make sure everything is over N ticks before the next sched start! - * Just add to end time? - * - * 2) I think one way to handle the problem of losing up to a microsecond - * every time we call ble_ll_conn_next_event in a loop is to do everything by - * keeping track of last anchor point. Would need last anchor usecs too. I guess - * we could also keep last anchor usecs as a uint32 or something and when we - * do the next event keep track of the residual using a different ticks to - * usecs calculation. Not sure. - */ - -/* - * XXX: How should we deal with a late connection event? We need to determine - * what we want to do under the following cases: - * 1) The current connection event has not ended but a schedule item starts - */ - -/* This is a dummy structure we use for the empty PDU */ -struct ble_ll_empty_pdu -{ - struct os_mbuf om; - struct os_mbuf_pkthdr pkt_hdr; - struct ble_mbuf_hdr ble_hdr; -}; - -/* We cannot have more than 254 connections given our current implementation */ -#if (MYNEWT_VAL(BLE_MAX_CONNECTIONS) >= 255) - #error "Maximum # of connections is 254" -#endif - -/* Global connection complete event. Used when initiating */ -uint8_t *g_ble_ll_conn_comp_ev; - -/* Global LL connection parameters */ -struct ble_ll_conn_global_params g_ble_ll_conn_params; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) -/* Global default sync transfer params */ -struct ble_ll_conn_sync_transfer_params g_ble_ll_conn_sync_transfer_params; -#endif - -/* Pointer to connection state machine we are trying to create */ -struct ble_ll_conn_sm *g_ble_ll_conn_create_sm; - -/* Pointer to current connection */ -struct ble_ll_conn_sm *g_ble_ll_conn_cur_sm; - -/* Connection state machine array */ -struct ble_ll_conn_sm g_ble_ll_conn_sm[MYNEWT_VAL(BLE_MAX_CONNECTIONS)]; - -/* List of active connections */ -struct ble_ll_conn_active_list g_ble_ll_conn_active_list; - -/* List of free connections */ -struct ble_ll_conn_free_list g_ble_ll_conn_free_list; - -STATS_SECT_START(ble_ll_conn_stats) - STATS_SECT_ENTRY(cant_set_sched) - STATS_SECT_ENTRY(conn_ev_late) - STATS_SECT_ENTRY(wfr_expirations) - STATS_SECT_ENTRY(handle_not_found) - STATS_SECT_ENTRY(no_conn_sm) - STATS_SECT_ENTRY(no_free_conn_sm) - STATS_SECT_ENTRY(rx_data_pdu_no_conn) - STATS_SECT_ENTRY(rx_data_pdu_bad_aa) - STATS_SECT_ENTRY(slave_rxd_bad_conn_req_params) - STATS_SECT_ENTRY(slave_ce_failures) - STATS_SECT_ENTRY(data_pdu_rx_dup) - STATS_SECT_ENTRY(data_pdu_txg) - STATS_SECT_ENTRY(data_pdu_txf) - STATS_SECT_ENTRY(conn_req_txd) - STATS_SECT_ENTRY(l2cap_enqueued) - STATS_SECT_ENTRY(rx_ctrl_pdus) - STATS_SECT_ENTRY(rx_l2cap_pdus) - STATS_SECT_ENTRY(rx_l2cap_bytes) - STATS_SECT_ENTRY(rx_malformed_ctrl_pdus) - STATS_SECT_ENTRY(rx_bad_llid) - STATS_SECT_ENTRY(tx_ctrl_pdus) - STATS_SECT_ENTRY(tx_ctrl_bytes) - STATS_SECT_ENTRY(tx_l2cap_pdus) - STATS_SECT_ENTRY(tx_l2cap_bytes) - STATS_SECT_ENTRY(tx_empty_pdus) - STATS_SECT_ENTRY(mic_failures) - STATS_SECT_ENTRY(sched_start_in_idle) - STATS_SECT_ENTRY(sched_end_in_idle) - STATS_SECT_ENTRY(conn_event_while_tmo) -STATS_SECT_END -STATS_SECT_DECL(ble_ll_conn_stats) ble_ll_conn_stats; - -STATS_NAME_START(ble_ll_conn_stats) - STATS_NAME(ble_ll_conn_stats, cant_set_sched) - STATS_NAME(ble_ll_conn_stats, conn_ev_late) - STATS_NAME(ble_ll_conn_stats, wfr_expirations) - STATS_NAME(ble_ll_conn_stats, handle_not_found) - STATS_NAME(ble_ll_conn_stats, no_conn_sm) - STATS_NAME(ble_ll_conn_stats, no_free_conn_sm) - STATS_NAME(ble_ll_conn_stats, rx_data_pdu_no_conn) - STATS_NAME(ble_ll_conn_stats, rx_data_pdu_bad_aa) - STATS_NAME(ble_ll_conn_stats, slave_rxd_bad_conn_req_params) - STATS_NAME(ble_ll_conn_stats, slave_ce_failures) - STATS_NAME(ble_ll_conn_stats, data_pdu_rx_dup) - STATS_NAME(ble_ll_conn_stats, data_pdu_txg) - STATS_NAME(ble_ll_conn_stats, data_pdu_txf) - STATS_NAME(ble_ll_conn_stats, conn_req_txd) - STATS_NAME(ble_ll_conn_stats, l2cap_enqueued) - STATS_NAME(ble_ll_conn_stats, rx_ctrl_pdus) - STATS_NAME(ble_ll_conn_stats, rx_l2cap_pdus) - STATS_NAME(ble_ll_conn_stats, rx_l2cap_bytes) - STATS_NAME(ble_ll_conn_stats, rx_malformed_ctrl_pdus) - STATS_NAME(ble_ll_conn_stats, rx_bad_llid) - STATS_NAME(ble_ll_conn_stats, tx_ctrl_pdus) - STATS_NAME(ble_ll_conn_stats, tx_ctrl_bytes) - STATS_NAME(ble_ll_conn_stats, tx_l2cap_pdus) - STATS_NAME(ble_ll_conn_stats, tx_l2cap_bytes) - STATS_NAME(ble_ll_conn_stats, tx_empty_pdus) - STATS_NAME(ble_ll_conn_stats, mic_failures) - STATS_NAME(ble_ll_conn_stats, sched_start_in_idle) - STATS_NAME(ble_ll_conn_stats, sched_end_in_idle) - STATS_NAME(ble_ll_conn_stats, conn_event_while_tmo) -STATS_NAME_END(ble_ll_conn_stats) - -static void ble_ll_conn_event_end(struct ble_npl_event *ev); - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) -/** - * Checks to see if we should start a PHY update procedure - * - * If current phy is not one of the preferred we need to start control - * procedure. - * - * XXX: we could also decide to change the PHY if RSSI is really good - * and we are currently at 1Mbps or lower data rate and we could use - * a higher data rate. - * - * @param connsm - * @return 0: success; -1: no phy update procedure started - */ -int -ble_ll_conn_chk_phy_upd_start(struct ble_ll_conn_sm *csm) -{ - int rc; - - /* If no host preferences or */ - if (((csm->phy_data.host_pref_tx_phys_mask == 0) && - (csm->phy_data.host_pref_rx_phys_mask == 0)) || - ((csm->phy_data.host_pref_tx_phys_mask & CONN_CUR_TX_PHY_MASK(csm)) && - (csm->phy_data.host_pref_rx_phys_mask & CONN_CUR_RX_PHY_MASK(csm)))) { - rc = -1; - } else { - csm->phy_data.req_pref_tx_phys_mask = csm->phy_data.host_pref_tx_phys_mask; - csm->phy_data.req_pref_rx_phys_mask = csm->phy_data.host_pref_rx_phys_mask; - ble_ll_ctrl_proc_start(csm, BLE_LL_CTRL_PROC_PHY_UPDATE); - rc = 0; - } - - return rc; -} -#endif - -static void -ble_ll_conn_calc_itvl_ticks(struct ble_ll_conn_sm *connsm) -{ - uint32_t ticks; - uint32_t usecs; - - /* - * Precalculate the number of ticks and remaining microseconds for - * the connection interval - */ - usecs = connsm->conn_itvl * BLE_LL_CONN_ITVL_USECS; - ticks = os_cputime_usecs_to_ticks(usecs); - connsm->conn_itvl_usecs = (uint8_t)(usecs - - os_cputime_ticks_to_usecs(ticks)); - if (connsm->conn_itvl_usecs == 31) { - connsm->conn_itvl_usecs = 0; - ++ticks; - } - connsm->conn_itvl_ticks = ticks; -} - -/** - * Get the event buffer allocated to send the connection complete event - * when we are initiating. - * - * @return uint8_t* - */ -static uint8_t * -ble_ll_init_get_conn_comp_ev(void) -{ - uint8_t *evbuf; - - evbuf = g_ble_ll_conn_comp_ev; - BLE_LL_ASSERT(evbuf != NULL); - g_ble_ll_conn_comp_ev = NULL; - - return evbuf; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) -/** - * Called to determine if the received PDU is an empty PDU or not. - */ -static int -ble_ll_conn_is_empty_pdu(uint8_t *rxbuf) -{ - int rc; - uint8_t llid; - - llid = rxbuf[0] & BLE_LL_DATA_HDR_LLID_MASK; - if ((llid == BLE_LL_LLID_DATA_FRAG) && (rxbuf[1] == 0)) { - rc = 1; - } else { - rc = 0; - } - return rc; -} -#endif - -/** - * Called to return the currently running connection state machine end time. - * Always called when interrupts are disabled. - * - * @return int 0: s1 is not least recently used. 1: s1 is least recently used - */ -int -ble_ll_conn_is_lru(struct ble_ll_conn_sm *s1, struct ble_ll_conn_sm *s2) -{ - int rc; - - /* Set time that we last serviced the schedule */ - if ((int32_t)(s1->last_scheduled - s2->last_scheduled) < 0) { - rc = 1; - } else { - rc = 0; - } - - return rc; -} - -/** - * Called to return the currently running connection state machine end time. - * Always called when interrupts are disabled. - * - * @return uint32_t - */ -uint32_t -ble_ll_conn_get_ce_end_time(void) -{ - uint32_t ce_end_time; - - if (g_ble_ll_conn_cur_sm) { - ce_end_time = g_ble_ll_conn_cur_sm->ce_end_time; - } else { - ce_end_time = os_cputime_get32(); - } - return ce_end_time; -} - -/** - * Called when connection state machine needs to halt. This function will: - * -> Disable the PHY, which will prevent any transmit/receive interrupts. - * -> Disable the wait for response timer, if running. - * -> Remove the connection state machine from the scheduler. - * -> Sets the Link Layer state to standby. - * -> Sets the current state machine to NULL. - * - * NOTE: the ordering of these function calls is important! We have to stop - * the PHY and remove the schedule item before we can set the state to - * standby and set the current state machine pointer to NULL. - */ -static void -ble_ll_conn_halt(void) -{ - ble_phy_disable(); - ble_ll_state_set(BLE_LL_STATE_STANDBY); - g_ble_ll_conn_cur_sm = NULL; -} - -/** - * Called when the current connection state machine is no longer being used. - */ -static void -ble_ll_conn_current_sm_over(struct ble_ll_conn_sm *connsm) -{ - - ble_ll_conn_halt(); - - /* - * NOTE: the connection state machine may be NULL if we are calling - * this when we are ending the connection. In that case, there is no - * need to post to the LL the connection event end event - */ - if (connsm) { - ble_ll_event_send(&connsm->conn_ev_end); - } -} - -/** - * Given a handle, find an active connection matching the handle - * - * @param handle - * - * @return struct ble_ll_conn_sm* - */ -struct ble_ll_conn_sm * -ble_ll_conn_find_active_conn(uint16_t handle) -{ - struct ble_ll_conn_sm *connsm; - - connsm = NULL; - if ((handle != 0) && (handle <= MYNEWT_VAL(BLE_MAX_CONNECTIONS))) { - connsm = &g_ble_ll_conn_sm[handle - 1]; - if (connsm->conn_state == BLE_LL_CONN_STATE_IDLE) { - connsm = NULL; - } - } - return connsm; -} - -/** - * Get a connection state machine. - */ -struct ble_ll_conn_sm * -ble_ll_conn_sm_get(void) -{ - struct ble_ll_conn_sm *connsm; - - connsm = STAILQ_FIRST(&g_ble_ll_conn_free_list); - if (connsm) { - STAILQ_REMOVE_HEAD(&g_ble_ll_conn_free_list, free_stqe); - } else { - STATS_INC(ble_ll_conn_stats, no_free_conn_sm); - } - - return connsm; -} - -static uint8_t -ble_ll_conn_calc_dci_csa1(struct ble_ll_conn_sm *conn) -{ - uint8_t curchan; - uint8_t remap_index; - uint8_t bitpos; - - /* Get next unmapped channel */ - curchan = conn->last_unmapped_chan + conn->hop_inc; - if (curchan > BLE_PHY_NUM_DATA_CHANS) { - curchan -= BLE_PHY_NUM_DATA_CHANS; - } - - /* Save unmapped channel */ - conn->last_unmapped_chan = curchan; - - /* Is this a valid channel? */ - bitpos = 1 << (curchan & 0x07); - if (conn->chanmap[curchan >> 3] & bitpos) { - return curchan; - } - - /* Calculate remap index */ - remap_index = curchan % conn->num_used_chans; - - return ble_ll_utils_remapped_channel(remap_index, conn->chanmap); -} - -/** - * Determine data channel index to be used for the upcoming/current - * connection event - * - * @param conn - * @param latency Used only for CSA #1 - * - * @return uint8_t - */ -uint8_t -ble_ll_conn_calc_dci(struct ble_ll_conn_sm *conn, uint16_t latency) -{ - uint8_t index; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) - if (CONN_F_CSA2_SUPP(conn)) { - return ble_ll_utils_calc_dci_csa2(conn->event_cntr, conn->channel_id, - conn->num_used_chans, conn->chanmap); - } -#endif - - index = conn->data_chan_index; - - while (latency > 0) { - index = ble_ll_conn_calc_dci_csa1(conn); - latency--; - } - - return index; -} - -/** - * Called when we are in the connection state and the wait for response timer - * fires off. - * - * Context: Interrupt - */ -void -ble_ll_conn_wfr_timer_exp(void) -{ - struct ble_ll_conn_sm *connsm; - - connsm = g_ble_ll_conn_cur_sm; - ble_ll_conn_current_sm_over(connsm); - STATS_INC(ble_ll_conn_stats, wfr_expirations); -} - -void -ble_ll_conn_reset_pending_aux_conn_rsp(void) -{ -#if !MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - return; -#endif - struct ble_ll_conn_sm *connsm; - - connsm = g_ble_ll_conn_create_sm; - if (!connsm) { - return; - } - - if (CONN_F_AUX_CONN_REQ(connsm)) { - STATS_INC(ble_ll_stats, aux_conn_rsp_err); - CONN_F_CONN_REQ_TXD(connsm) = 0; - CONN_F_AUX_CONN_REQ(connsm) = 0; - ble_ll_sched_rmv_elem(&connsm->conn_sch); - return; - } - - return; -} - -bool -ble_ll_conn_init_pending_aux_conn_rsp(void) -{ -#if !MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - return false; -#endif - struct ble_ll_conn_sm *connsm; - - connsm = g_ble_ll_conn_create_sm; - if (!connsm) { - return false; - } - - return CONN_F_AUX_CONN_REQ(connsm); -} - -void -ble_ll_conn_init_wfr_timer_exp(void) -{ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - struct ble_ll_conn_sm *connsm; - - connsm = g_ble_ll_conn_create_sm; - if (!connsm) { - return; - } - - ble_ll_conn_reset_pending_aux_conn_rsp(); - connsm->inita_identity_used = 0; - - ble_ll_scan_interrupted(connsm->scansm); - -#endif -} -/** - * Callback for slave when it transmits a data pdu and the connection event - * ends after the transmission. - * - * Context: Interrupt - * - * @param sch - * - */ -static void -ble_ll_conn_wait_txend(void *arg) -{ - struct ble_ll_conn_sm *connsm; - - connsm = (struct ble_ll_conn_sm *)arg; - ble_ll_conn_current_sm_over(connsm); -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) -static void -ble_ll_conn_start_rx_encrypt(void *arg) -{ - struct ble_ll_conn_sm *connsm; - - connsm = (struct ble_ll_conn_sm *)arg; - CONN_F_ENCRYPTED(connsm) = 1; - ble_phy_encrypt_enable(connsm->enc_data.rx_pkt_cntr, - connsm->enc_data.iv, - connsm->enc_data.enc_block.cipher_text, - !CONN_IS_MASTER(connsm)); -} - -static void -ble_ll_conn_start_rx_unencrypt(void *arg) -{ - struct ble_ll_conn_sm *connsm; - - connsm = (struct ble_ll_conn_sm *)arg; - CONN_F_ENCRYPTED(connsm) = 0; - ble_phy_encrypt_disable(); -} - -static void -ble_ll_conn_txend_encrypt(void *arg) -{ - struct ble_ll_conn_sm *connsm; - - connsm = (struct ble_ll_conn_sm *)arg; - CONN_F_ENCRYPTED(connsm) = 1; - ble_ll_conn_current_sm_over(connsm); -} - -static void -ble_ll_conn_rxend_unencrypt(void *arg) -{ - struct ble_ll_conn_sm *connsm; - - connsm = (struct ble_ll_conn_sm *)arg; - CONN_F_ENCRYPTED(connsm) = 0; - ble_ll_conn_current_sm_over(connsm); -} - -static void -ble_ll_conn_continue_rx_encrypt(void *arg) -{ - struct ble_ll_conn_sm *connsm; - - connsm = (struct ble_ll_conn_sm *)arg; - ble_phy_encrypt_set_pkt_cntr(connsm->enc_data.rx_pkt_cntr, - !CONN_IS_MASTER(connsm)); -} -#endif - -/** - * Returns the cputime of the next scheduled item on the scheduler list or - * when the current connection will start its next interval (whichever is - * earlier). This API is called when determining at what time we should end - * the current connection event. The current connection event must end before - * the next scheduled item. However, the current connection itself is not - * in the scheduler list! Thus, we need to calculate the time at which the - * next connection will start (the schedule start time; not the anchor point) - * and not overrun it. - * - * Context: Interrupt - * - * @param connsm - * - * @return uint32_t - */ -static uint32_t -ble_ll_conn_get_next_sched_time(struct ble_ll_conn_sm *connsm) -{ -#if MYNEWT_VAL(BLE_LL_STRICT_CONN_SCHEDULING) - uint32_t ce_end; - ce_end = connsm->ce_end_time; -#else - uint32_t ce_end; - uint32_t next_sched_time; - - /* Calculate time at which next connection event will start */ - /* NOTE: We dont care if this time is tick short. */ - ce_end = connsm->anchor_point + connsm->conn_itvl_ticks - - g_ble_ll_sched_offset_ticks; - if ((connsm->anchor_point_usecs + connsm->conn_itvl_usecs) >= 31) { - ++ce_end; - } - - if (ble_ll_sched_next_time(&next_sched_time)) { - if (CPUTIME_LT(next_sched_time, ce_end)) { - ce_end = next_sched_time; - } - } -#endif - - return ce_end; -} - -/** - * Called to check if certain connection state machine flags have been - * set. - * - * @param connsm - */ -static void -ble_ll_conn_chk_csm_flags(struct ble_ll_conn_sm *connsm) -{ - uint8_t update_status; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (connsm->csmflags.cfbit.send_ltk_req) { - /* - * Send Long term key request event to host. If masked, we need to - * send a REJECT_IND. - */ - if (ble_ll_hci_ev_ltk_req(connsm)) { - ble_ll_ctrl_reject_ind_send(connsm, BLE_LL_CTRL_ENC_REQ, - BLE_ERR_PINKEY_MISSING); - } - connsm->csmflags.cfbit.send_ltk_req = 0; - } -#endif - - /* - * There are two cases where this flag gets set: - * 1) A connection update procedure was started and the event counter - * has passed the instant. - * 2) We successfully sent the reject reason. - */ - if (connsm->csmflags.cfbit.host_expects_upd_event) { - update_status = BLE_ERR_SUCCESS; - if (IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_CONN_UPDATE)) { - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_CONN_UPDATE); - } else { - if (IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_CONN_PARAM_REQ)) { - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_CONN_PARAM_REQ); - update_status = connsm->reject_reason; - } - } - ble_ll_hci_ev_conn_update(connsm, update_status); - connsm->csmflags.cfbit.host_expects_upd_event = 0; - } - - /* Check if we need to send PHY update complete event */ -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - if (CONN_F_PHY_UPDATE_EVENT(connsm)) { - if (!ble_ll_hci_ev_phy_update(connsm, BLE_ERR_SUCCESS)) { - /* Sent event. Clear flag */ - CONN_F_PHY_UPDATE_EVENT(connsm) = 0; - } - } -#endif -} - -/** - * Called when we want to send a data channel pdu inside a connection event. - * - * Context: interrupt - * - * @param connsm - * - * @return int 0: success; otherwise failure to transmit - */ -static uint16_t -ble_ll_conn_adjust_pyld_len(struct ble_ll_conn_sm *connsm, uint16_t pyld_len) -{ - uint16_t phy_max_tx_octets; - uint16_t ret; - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - uint8_t phy_mode; - - if (connsm->phy_tx_transition) { - phy_mode = ble_ll_phy_to_phy_mode(connsm->phy_tx_transition, - connsm->phy_data.phy_options); - } else { - phy_mode = connsm->phy_data.tx_phy_mode; - } - - phy_max_tx_octets = ble_ll_pdu_max_tx_octets_get(connsm->eff_max_tx_time, - phy_mode); - -#else - phy_max_tx_octets = ble_ll_pdu_max_tx_octets_get(connsm->eff_max_tx_time, - BLE_PHY_MODE_1M); -#endif - - ret = pyld_len; - - if (ret > connsm->eff_max_tx_octets) { - ret = connsm->eff_max_tx_octets; - } - - if (ret > phy_max_tx_octets) { - ret = phy_max_tx_octets; - } - - return ret; -} - -static int -ble_ll_conn_tx_pdu(struct ble_ll_conn_sm *connsm) -{ - int rc; - uint8_t md; - uint8_t hdr_byte; - uint8_t end_transition; - uint8_t cur_txlen; - uint8_t next_txlen; - uint8_t cur_offset; - uint16_t pktlen; - uint32_t next_event_time; - uint32_t ticks; - struct os_mbuf *m; - struct ble_mbuf_hdr *ble_hdr; - struct os_mbuf_pkthdr *pkthdr = NULL; - struct os_mbuf_pkthdr *nextpkthdr; - struct ble_ll_empty_pdu empty_pdu; - ble_phy_tx_end_func txend_func; - int tx_phy_mode; - uint8_t llid; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - int is_ctrl; - uint8_t opcode; -#endif - - /* For compiler warnings... */ - ble_hdr = NULL; - m = NULL; - md = 0; - hdr_byte = BLE_LL_LLID_DATA_FRAG; - - if (connsm->csmflags.cfbit.terminate_ind_rxd) { - /* We just received terminate indication. - * Just send empty packet as an ACK - */ - CONN_F_EMPTY_PDU_TXD(connsm) = 1; - goto conn_tx_pdu; - } - - /* - * We need to check if we are retrying a pdu or if there is a pdu on - * the transmit queue. - */ - pkthdr = STAILQ_FIRST(&connsm->conn_txq); - if (!connsm->cur_tx_pdu && !CONN_F_EMPTY_PDU_TXD(connsm) && !pkthdr) { - CONN_F_EMPTY_PDU_TXD(connsm) = 1; - goto conn_tx_pdu; - } - - /* - * If we dont have a pdu we have previously transmitted, take it off - * the connection transmit queue - */ - cur_offset = 0; - if (!connsm->cur_tx_pdu && !CONN_F_EMPTY_PDU_TXD(connsm)) { - /* Convert packet header to mbuf */ - m = OS_MBUF_PKTHDR_TO_MBUF(pkthdr); - nextpkthdr = STAILQ_NEXT(pkthdr, omp_next); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - /* - * If we are encrypting, we are only allowed to send certain - * kinds of LL control PDU's. If none is enqueued, send empty pdu! - */ - if (connsm->enc_data.enc_state > CONN_ENC_S_ENCRYPTED) { - if (!ble_ll_ctrl_enc_allowed_pdu_tx(pkthdr)) { - CONN_F_EMPTY_PDU_TXD(connsm) = 1; - goto conn_tx_pdu; - } - - /* - * We will allow a next packet if it itself is allowed or we are - * a slave and we are sending the START_ENC_RSP. The master has - * to wait to receive the START_ENC_RSP from the slave before - * packets can be let go. - */ - if (nextpkthdr && !ble_ll_ctrl_enc_allowed_pdu_tx(nextpkthdr) - && ((connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) || - !ble_ll_ctrl_is_start_enc_rsp(m))) { - nextpkthdr = NULL; - } - } -#endif - /* Take packet off queue*/ - STAILQ_REMOVE_HEAD(&connsm->conn_txq, omp_next); - ble_hdr = BLE_MBUF_HDR_PTR(m); - - /* - * We dequeued new packet for transmission. - * If this is a data PDU we need to calculate payload length we can send - * over current PHY. Effectively, this determines fragmentation of packet - * into PDUs. - * If this is a control PDU we send complete PDU as only data PDU can be - * fragmented. We assume that checks (i.e. if remote supports such PDU) - * were already performed before putting packet on queue. - */ - llid = ble_hdr->txinfo.hdr_byte & BLE_LL_DATA_HDR_LLID_MASK; - pktlen = pkthdr->omp_len; - if (llid == BLE_LL_LLID_CTRL) { - cur_txlen = pktlen; - } else { - cur_txlen = ble_ll_conn_adjust_pyld_len(connsm, pktlen); - } - ble_hdr->txinfo.pyld_len = cur_txlen; - - /* NOTE: header was set when first enqueued */ - hdr_byte = ble_hdr->txinfo.hdr_byte; - connsm->cur_tx_pdu = m; - } else { - nextpkthdr = pkthdr; - if (connsm->cur_tx_pdu) { - m = connsm->cur_tx_pdu; - ble_hdr = BLE_MBUF_HDR_PTR(m); - pktlen = OS_MBUF_PKTLEN(m); - cur_txlen = ble_hdr->txinfo.pyld_len; - cur_offset = ble_hdr->txinfo.offset; - if (cur_offset == 0) { - hdr_byte = ble_hdr->txinfo.hdr_byte & BLE_LL_DATA_HDR_LLID_MASK; - } -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (connsm->enc_data.enc_state > CONN_ENC_S_ENCRYPTED) { - /* We will allow a next packet if it itself is allowed */ - pkthdr = OS_MBUF_PKTHDR(connsm->cur_tx_pdu); - if (nextpkthdr && !ble_ll_ctrl_enc_allowed_pdu_tx(nextpkthdr) - && ((connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) || - !ble_ll_ctrl_is_start_enc_rsp(connsm->cur_tx_pdu))) { - nextpkthdr = NULL; - } - } -#endif - } else { - /* Empty PDU here. NOTE: header byte gets set later */ - pktlen = 0; - cur_txlen = 0; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (connsm->enc_data.enc_state > CONN_ENC_S_ENCRYPTED) { - /* We will allow a next packet if it itself is allowed */ - if (nextpkthdr && !ble_ll_ctrl_enc_allowed_pdu_tx(nextpkthdr)) { - nextpkthdr = NULL; - } - } -#endif - } - } - - /* - * Set the more data data flag if we have more data to send and we - * have not been asked to terminate - */ - if (nextpkthdr || ((cur_offset + cur_txlen) < pktlen)) { - /* Get next event time */ - next_event_time = ble_ll_conn_get_next_sched_time(connsm); - - /* XXX: TODO: need to check this with phy update procedure. There are - limitations if we have started update */ - - /* - * Dont bother to set the MD bit if we cannot do the following: - * -> wait IFS, send the current frame. - * -> wait IFS, receive a maximum size frame. - * -> wait IFS, send the next frame. - * -> wait IFS, receive a maximum size frame. - * - * For slave: - * -> wait IFS, send current frame. - * -> wait IFS, receive maximum size frame. - * -> wait IFS, send next frame. - */ - if ((cur_offset + cur_txlen) < pktlen) { - next_txlen = pktlen - (cur_offset + cur_txlen); - } else { - if (nextpkthdr->omp_len > connsm->eff_max_tx_octets) { - next_txlen = connsm->eff_max_tx_octets; - } else { - next_txlen = nextpkthdr->omp_len; - } - } - - /* - * XXX: this calculation is based on using the current time - * and assuming the transmission will occur an IFS time from - * now. This is not the most accurate especially if we have - * received a frame and we are replying to it. - */ -#if BLE_LL_BT5_PHY_SUPPORTED - tx_phy_mode = connsm->phy_data.tx_phy_mode; -#else - tx_phy_mode = BLE_PHY_MODE_1M; -#endif - - ticks = (BLE_LL_IFS * 3) + connsm->eff_max_rx_time + - ble_ll_pdu_tx_time_get(next_txlen, tx_phy_mode) + - ble_ll_pdu_tx_time_get(cur_txlen, tx_phy_mode); - - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - ticks += (BLE_LL_IFS + connsm->eff_max_rx_time); - } - - ticks = os_cputime_usecs_to_ticks(ticks); - if ((int32_t)((os_cputime_get32() + ticks) - next_event_time) < 0) { - md = 1; - } - } - - /* If we send an empty PDU we need to initialize the header */ -conn_tx_pdu: - if (CONN_F_EMPTY_PDU_TXD(connsm)) { - /* - * This looks strange, but we dont use the data pointer in the mbuf - * when we have an empty pdu. - */ - m = (struct os_mbuf *)&empty_pdu; - m->om_data = (uint8_t *)&empty_pdu; - m->om_data += BLE_MBUF_MEMBLOCK_OVERHEAD; - ble_hdr = &empty_pdu.ble_hdr; - ble_hdr->txinfo.flags = 0; - ble_hdr->txinfo.offset = 0; - ble_hdr->txinfo.pyld_len = 0; - } - - /* Set tx seqnum */ - if (connsm->tx_seqnum) { - hdr_byte |= BLE_LL_DATA_HDR_SN_MASK; - } - - /* If we have more data, set the bit */ - if (md) { - hdr_byte |= BLE_LL_DATA_HDR_MD_MASK; - } - - /* Set NESN (next expected sequence number) bit */ - if (connsm->next_exp_seqnum) { - hdr_byte |= BLE_LL_DATA_HDR_NESN_MASK; - } - - /* Set the header byte in the outgoing frame */ - ble_hdr->txinfo.hdr_byte = hdr_byte; - - /* - * If we are a slave, check to see if this transmission will end the - * connection event. We will end the connection event if we have - * received a valid frame with the more data bit set to 0 and we dont - * have more data. - * - * XXX: for a slave, we dont check to see if we can: - * -> wait IFS, rx frame from master (either big or small). - * -> wait IFS, send empty pdu or next pdu. - * - * We could do this. Now, we just keep going and hope that we dont - * overrun next scheduled item. - */ - if ((connsm->csmflags.cfbit.terminate_ind_rxd) || - ((connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) && (md == 0) && - (connsm->cons_rxd_bad_crc == 0) && - ((connsm->last_rxd_hdr_byte & BLE_LL_DATA_HDR_MD_MASK) == 0) && - !ble_ll_ctrl_is_terminate_ind(hdr_byte, m->om_data[0]))) { - /* We will end the connection event */ - end_transition = BLE_PHY_TRANSITION_NONE; - txend_func = ble_ll_conn_wait_txend; - } else { - /* Wait for a response here */ - end_transition = BLE_PHY_TRANSITION_TX_RX; - txend_func = NULL; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - llid = ble_hdr->txinfo.hdr_byte & BLE_LL_DATA_HDR_LLID_MASK; - if (llid == BLE_LL_LLID_CTRL) { - is_ctrl = 1; - opcode = m->om_data[0]; - } else { - is_ctrl = 0; - opcode = 0; - } - - if (is_ctrl && (opcode == BLE_LL_CTRL_START_ENC_RSP)) { - /* - * Both master and slave send the START_ENC_RSP encrypted and receive - * encrypted - */ - CONN_F_ENCRYPTED(connsm) = 1; - connsm->enc_data.tx_encrypted = 1; - ble_phy_encrypt_enable(connsm->enc_data.tx_pkt_cntr, - connsm->enc_data.iv, - connsm->enc_data.enc_block.cipher_text, - CONN_IS_MASTER(connsm)); - } else if (is_ctrl && (opcode == BLE_LL_CTRL_START_ENC_REQ)) { - /* - * Only the slave sends this and it gets sent unencrypted but - * we receive encrypted - */ - CONN_F_ENCRYPTED(connsm) = 0; - connsm->enc_data.enc_state = CONN_ENC_S_START_ENC_RSP_WAIT; - connsm->enc_data.tx_encrypted = 0; - ble_phy_encrypt_disable(); - if (txend_func == NULL) { - txend_func = ble_ll_conn_start_rx_encrypt; - } else { - txend_func = ble_ll_conn_txend_encrypt; - } - } else if (is_ctrl && (opcode == BLE_LL_CTRL_PAUSE_ENC_RSP)) { - /* - * The slave sends the PAUSE_ENC_RSP encrypted. The master sends - * it unencrypted (note that link was already set unencrypted). - */ - if (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) { - CONN_F_ENCRYPTED(connsm) = 1; - connsm->enc_data.tx_encrypted = 1; - ble_phy_encrypt_enable(connsm->enc_data.tx_pkt_cntr, - connsm->enc_data.iv, - connsm->enc_data.enc_block.cipher_text, - CONN_IS_MASTER(connsm)); - if (txend_func == NULL) { - txend_func = ble_ll_conn_start_rx_unencrypt; - } else { - txend_func = ble_ll_conn_rxend_unencrypt; - } - } else { - CONN_F_ENCRYPTED(connsm) = 0; - connsm->enc_data.enc_state = CONN_ENC_S_PAUSED; - connsm->enc_data.tx_encrypted = 0; - ble_phy_encrypt_disable(); - } - } else { - /* If encrypted set packet counter */ - if (CONN_F_ENCRYPTED(connsm)) { - connsm->enc_data.tx_encrypted = 1; - ble_phy_encrypt_set_pkt_cntr(connsm->enc_data.tx_pkt_cntr, - CONN_IS_MASTER(connsm)); - if (txend_func == NULL) { - txend_func = ble_ll_conn_continue_rx_encrypt; - } - } - } -#endif - - /* Set transmit end callback */ - ble_phy_set_txend_cb(txend_func, connsm); - rc = ble_phy_tx(ble_ll_tx_mbuf_pducb, m, end_transition); - if (!rc) { - /* Log transmit on connection state */ - cur_txlen = ble_hdr->txinfo.pyld_len; - ble_ll_trace_u32x2(BLE_LL_TRACE_ID_CONN_TX, cur_txlen, - ble_hdr->txinfo.offset); - - /* Set last transmitted MD bit */ - CONN_F_LAST_TXD_MD(connsm) = md; - - /* Increment packets transmitted */ - if (CONN_F_EMPTY_PDU_TXD(connsm)) { - if (connsm->csmflags.cfbit.terminate_ind_rxd) { - connsm->csmflags.cfbit.terminate_ind_rxd_acked = 1; - } - STATS_INC(ble_ll_conn_stats, tx_empty_pdus); - } else if ((hdr_byte & BLE_LL_DATA_HDR_LLID_MASK) == BLE_LL_LLID_CTRL) { - STATS_INC(ble_ll_conn_stats, tx_ctrl_pdus); - STATS_INCN(ble_ll_conn_stats, tx_ctrl_bytes, cur_txlen); - } else { - STATS_INC(ble_ll_conn_stats, tx_l2cap_pdus); - STATS_INCN(ble_ll_conn_stats, tx_l2cap_bytes, cur_txlen); - } - } - return rc; -} - -/** - * Schedule callback for start of connection event. - * - * Context: Interrupt - * - * @param sch - * - * @return int 0: scheduled item is still running. 1: schedule item is done. - */ -static int -ble_ll_conn_event_start_cb(struct ble_ll_sched_item *sch) -{ - int rc; - uint32_t usecs; - uint32_t start; - struct ble_ll_conn_sm *connsm; - - /* XXX: note that we can extend end time here if we want. Look at this */ - - /* Set current connection state machine */ - connsm = (struct ble_ll_conn_sm *)sch->cb_arg; - g_ble_ll_conn_cur_sm = connsm; - BLE_LL_ASSERT(connsm); - if (connsm->conn_state == BLE_LL_CONN_STATE_IDLE) { - /* That should not happen. If it does it means connection - * is already closed - */ - STATS_INC(ble_ll_conn_stats, sched_start_in_idle); - BLE_LL_ASSERT(0); - ble_ll_conn_current_sm_over(connsm); - return BLE_LL_SCHED_STATE_DONE; - } - - /* Log connection event start */ - ble_ll_trace_u32(BLE_LL_TRACE_ID_CONN_EV_START, connsm->conn_handle); - - /* Disable whitelisting as connections do not use it */ - ble_ll_whitelist_disable(); - - /* Set LL state */ - ble_ll_state_set(BLE_LL_STATE_CONNECTION); - - /* Set channel */ - ble_phy_setchan(connsm->data_chan_index, connsm->access_addr, - connsm->crcinit); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - ble_phy_resolv_list_disable(); -#endif - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - ble_phy_mode_set(connsm->phy_data.tx_phy_mode, connsm->phy_data.rx_phy_mode); -#endif - - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - /* Set start time of transmission */ - start = sch->start_time + g_ble_ll_sched_offset_ticks; - rc = ble_phy_tx_set_start_time(start, sch->remainder); - if (!rc) { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (CONN_F_ENCRYPTED(connsm)) { - ble_phy_encrypt_enable(connsm->enc_data.tx_pkt_cntr, - connsm->enc_data.iv, - connsm->enc_data.enc_block.cipher_text, - 1); - } else { - ble_phy_encrypt_disable(); - } -#endif - rc = ble_ll_conn_tx_pdu(connsm); - if (!rc) { - rc = BLE_LL_SCHED_STATE_RUNNING; - } else { - /* Inform LL task of connection event end */ - rc = BLE_LL_SCHED_STATE_DONE; - } - } else { - STATS_INC(ble_ll_conn_stats, conn_ev_late); - rc = BLE_LL_SCHED_STATE_DONE; - } - } else { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (CONN_F_ENCRYPTED(connsm)) { - ble_phy_encrypt_enable(connsm->enc_data.rx_pkt_cntr, - connsm->enc_data.iv, - connsm->enc_data.enc_block.cipher_text, - 1); - } else { - ble_phy_encrypt_disable(); - } -#endif - - /* XXX: what is this really for the slave? */ - start = sch->start_time + g_ble_ll_sched_offset_ticks; - rc = ble_phy_rx_set_start_time(start, sch->remainder); - if (rc) { - /* End the connection event as we have no more buffers */ - STATS_INC(ble_ll_conn_stats, slave_ce_failures); - rc = BLE_LL_SCHED_STATE_DONE; - } else { - /* - * Set flag that tells slave to set last anchor point if a packet - * has been received. - */ - connsm->csmflags.cfbit.slave_set_last_anchor = 1; - - /* - * Set the wait for response time. The anchor point is when we - * expect the master to start transmitting. Worst-case, we expect - * to hear a reply within the anchor point plus: - * -> current tx window size - * -> current window widening amount (includes +/- 16 usec jitter) - * -> Amount of time it takes to detect packet start. - * -> Some extra time (16 usec) to insure timing is OK - */ - - /* - * For the 32 kHz crystal, the amount of usecs we have to wait - * is not from the anchor point; we have to account for the time - * from when the receiver is enabled until the anchor point. The - * time we start before the anchor point is this: - * -> current window widening. - * -> up to one 32 kHz tick since we discard remainder. - * -> Up to one tick since the usecs to ticks calc can be off - * by up to one tick. - * NOTES: - * 1) the 61 we add is for the two ticks mentioned above. - * 2) The address rx time and jitter is accounted for in the - * phy function - */ - usecs = connsm->slave_cur_tx_win_usecs + 61 + - (2 * connsm->slave_cur_window_widening); - ble_phy_wfr_enable(BLE_PHY_WFR_ENABLE_RX, 0, usecs); - /* Set next wakeup time to connection event end time */ - rc = BLE_LL_SCHED_STATE_RUNNING; - } - } - - if (rc == BLE_LL_SCHED_STATE_DONE) { - ble_ll_event_send(&connsm->conn_ev_end); - ble_phy_disable(); - ble_ll_state_set(BLE_LL_STATE_STANDBY); - g_ble_ll_conn_cur_sm = NULL; - } - - /* Set time that we last serviced the schedule */ - connsm->last_scheduled = os_cputime_get32(); - return rc; -} - -/** - * Called to determine if the device is allowed to send the next pdu in the - * connection event. This will always return 'true' if we are a slave. If we - * are a master, we must be able to send the next fragment and get a minimum - * sized response from the slave. - * - * Context: Interrupt context (rx end isr). - * - * @param connsm - * @param begtime Time at which IFS before pdu transmission starts - * - * @return int 0: not allowed to send 1: allowed to send - */ -static int -ble_ll_conn_can_send_next_pdu(struct ble_ll_conn_sm *connsm, uint32_t begtime, - uint32_t add_usecs) -{ - int rc; - uint8_t rem_bytes; - uint32_t ticks; - uint32_t usecs; - uint32_t next_sched_time; - struct os_mbuf *txpdu; - struct os_mbuf_pkthdr *pkthdr; - struct ble_mbuf_hdr *txhdr; - uint32_t allowed_usecs; - int tx_phy_mode; - -#if BLE_LL_BT5_PHY_SUPPORTED - tx_phy_mode = connsm->phy_data.tx_phy_mode; -#else - tx_phy_mode = BLE_PHY_MODE_1M; -#endif - - rc = 1; - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - /* Get next scheduled item time */ - next_sched_time = ble_ll_conn_get_next_sched_time(connsm); - - txpdu = connsm->cur_tx_pdu; - if (!txpdu) { - pkthdr = STAILQ_FIRST(&connsm->conn_txq); - if (pkthdr) { - txpdu = OS_MBUF_PKTHDR_TO_MBUF(pkthdr); - } - } else { - pkthdr = OS_MBUF_PKTHDR(txpdu); - } - - /* XXX: TODO: need to check this with phy update procedure. There are - limitations if we have started update */ - if (txpdu) { - txhdr = BLE_MBUF_HDR_PTR(txpdu); - rem_bytes = pkthdr->omp_len - txhdr->txinfo.offset; - if (rem_bytes > connsm->eff_max_tx_octets) { - rem_bytes = connsm->eff_max_tx_octets; - } - usecs = ble_ll_pdu_tx_time_get(rem_bytes, tx_phy_mode); - } else { - /* We will send empty pdu (just a LL header) */ - usecs = ble_ll_pdu_tx_time_get(0, tx_phy_mode); - } - usecs += (BLE_LL_IFS * 2) + connsm->eff_max_rx_time; - - ticks = (uint32_t)(next_sched_time - begtime); - allowed_usecs = os_cputime_ticks_to_usecs(ticks); - if ((usecs + add_usecs) >= allowed_usecs) { - rc = 0; - } - } - - return rc; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING) -/** - * Callback for the Authenticated payload timer. This function is called - * when the authenticated payload timer expires. When the authenticated - * payload timeout expires, we should - * -> Send the authenticated payload timeout event. - * -> Start the LE ping procedure. - * -> Restart the timer. - * - * @param arg - */ -void -ble_ll_conn_auth_pyld_timer_cb(struct ble_npl_event *ev) -{ - struct ble_ll_conn_sm *connsm; - - connsm = (struct ble_ll_conn_sm *)ble_npl_event_get_arg(ev); - ble_ll_auth_pyld_tmo_event_send(connsm); - ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_LE_PING); - ble_ll_conn_auth_pyld_timer_start(connsm); -} - -void -ble_ll_conn_rd_features_timer_cb(struct ble_npl_event *ev) -{ - struct ble_ll_conn_sm *connsm; - - connsm = (struct ble_ll_conn_sm *)ble_npl_event_get_arg(ev); - - if (!connsm->csmflags.cfbit.pending_hci_rd_features || - !connsm->csmflags.cfbit.rxd_features) { - return; - } - - ble_ll_hci_ev_rd_rem_used_feat(connsm, BLE_ERR_SUCCESS); - connsm->csmflags.cfbit.pending_hci_rd_features = 0; -} - -/** - * Start (or restart) the authenticated payload timer - * - * @param connsm - */ -void -ble_ll_conn_auth_pyld_timer_start(struct ble_ll_conn_sm *connsm) -{ - int32_t tmo; - - /* Timeout in is in 10 msec units */ - tmo = (int32_t)BLE_LL_CONN_AUTH_PYLD_OS_TMO(connsm->auth_pyld_tmo); - ble_npl_callout_reset(&connsm->auth_pyld_timer, tmo); -} -#endif - -static void -ble_ll_conn_master_common_init(struct ble_ll_conn_sm *connsm) -{ - - /* Set master role */ - connsm->conn_role = BLE_LL_CONN_ROLE_MASTER; - - /* Set default ce parameters */ - - /* - * XXX: for now, we need twice the transmit window as our calculations - * for the transmit window offset could be off. - */ - connsm->tx_win_size = BLE_LL_CONN_TX_WIN_MIN + 1; - connsm->tx_win_off = 0; - connsm->master_sca = MYNEWT_VAL(BLE_LL_MASTER_SCA); - - /* Hop increment is a random value between 5 and 16. */ - connsm->hop_inc = (rand() % 12) + 5; - - /* Set channel map to map requested by host */ - connsm->num_used_chans = g_ble_ll_conn_params.num_used_chans; - memcpy(connsm->chanmap, g_ble_ll_conn_params.master_chan_map, - BLE_LL_CONN_CHMAP_LEN); - - /* Calculate random access address and crc initialization value */ - connsm->access_addr = ble_ll_utils_calc_access_addr(); - connsm->crcinit = rand() & 0xffffff; - - /* Set initial schedule callback */ - connsm->conn_sch.sched_cb = ble_ll_conn_event_start_cb; -} -/** - * Called when a create connection command has been received. This initializes - * a connection state machine in the master role. - * - * NOTE: Must be called before the state machine is started - * - * @param connsm - * @param hcc - */ -void -ble_ll_conn_master_init(struct ble_ll_conn_sm *connsm, - struct hci_create_conn *hcc) -{ - - ble_ll_conn_master_common_init(connsm); - - /* Set slave latency and supervision timeout */ - connsm->slave_latency = hcc->conn_latency; - connsm->supervision_tmo = hcc->supervision_timeout; - - /* Set own address type and peer address if needed */ - connsm->own_addr_type = hcc->own_addr_type; - if (hcc->filter_policy == 0) { - memcpy(&connsm->peer_addr, &hcc->peer_addr, BLE_DEV_ADDR_LEN); - connsm->peer_addr_type = hcc->peer_addr_type; - } - - /* XXX: for now, just make connection interval equal to max */ - connsm->conn_itvl = hcc->conn_itvl_max; - - /* Check the min/max CE lengths are less than connection interval */ - if (hcc->min_ce_len > (connsm->conn_itvl * 2)) { - connsm->min_ce_len = connsm->conn_itvl * 2; - } else { - connsm->min_ce_len = hcc->min_ce_len; - } - - if (hcc->max_ce_len > (connsm->conn_itvl * 2)) { - connsm->max_ce_len = connsm->conn_itvl * 2; - } else { - connsm->max_ce_len = hcc->max_ce_len; - } -} - -static void -ble_ll_update_max_tx_octets_phy_mode(struct ble_ll_conn_sm *connsm) -{ - uint32_t usecs; - - usecs = connsm->eff_max_tx_time; - - connsm->max_tx_octets_phy_mode[BLE_PHY_MODE_1M] = - ble_ll_pdu_max_tx_octets_get(usecs, BLE_PHY_MODE_1M); - connsm->max_tx_octets_phy_mode[BLE_PHY_MODE_2M] = - ble_ll_pdu_max_tx_octets_get(usecs, BLE_PHY_MODE_2M); - connsm->max_tx_octets_phy_mode[BLE_PHY_MODE_CODED_125KBPS] = - ble_ll_pdu_max_tx_octets_get(usecs, BLE_PHY_MODE_CODED_125KBPS); - connsm->max_tx_octets_phy_mode[BLE_PHY_MODE_CODED_500KBPS] = - ble_ll_pdu_max_tx_octets_get(usecs, BLE_PHY_MODE_CODED_500KBPS); -} - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - -static void -ble_ll_conn_set_phy(struct ble_ll_conn_sm *connsm, int tx_phy, int rx_phy) -{ - - struct ble_ll_conn_phy_data *phy_data = &connsm->phy_data; - - phy_data->rx_phy_mode = ble_ll_phy_to_phy_mode(rx_phy, - BLE_HCI_LE_PHY_CODED_ANY); - phy_data->cur_rx_phy = rx_phy; - - phy_data->tx_phy_mode = ble_ll_phy_to_phy_mode(tx_phy, - BLE_HCI_LE_PHY_CODED_ANY); - phy_data->cur_tx_phy = tx_phy; - -} - -static void -ble_ll_conn_init_phy(struct ble_ll_conn_sm *connsm, int phy) -{ - struct ble_ll_conn_global_params *conngp; - - /* Always initialize symmetric PHY - controller can change this later */ - ble_ll_conn_set_phy(connsm, phy, phy); - - /* Update data length management to match initial PHY */ - conngp = &g_ble_ll_conn_params; - connsm->max_tx_octets = conngp->conn_init_max_tx_octets; - connsm->max_rx_octets = conngp->supp_max_rx_octets; - if (phy == BLE_PHY_CODED) { - connsm->max_tx_time = conngp->conn_init_max_tx_time_coded; - connsm->max_rx_time = BLE_LL_CONN_SUPP_TIME_MAX_CODED; - connsm->rem_max_tx_time = BLE_LL_CONN_SUPP_TIME_MIN_CODED; - connsm->rem_max_rx_time = BLE_LL_CONN_SUPP_TIME_MIN_CODED; - /* Assume peer does support coded */ - connsm->remote_features[0] |= (BLE_LL_FEAT_LE_CODED_PHY >> 8); - } else { - connsm->max_tx_time = conngp->conn_init_max_tx_time_uncoded; - connsm->max_rx_time = BLE_LL_CONN_SUPP_TIME_MAX_UNCODED; - connsm->rem_max_tx_time = BLE_LL_CONN_SUPP_TIME_MIN_UNCODED; - connsm->rem_max_rx_time = BLE_LL_CONN_SUPP_TIME_MIN_UNCODED; - } - connsm->eff_max_tx_time = connsm->rem_max_tx_time; - connsm->eff_max_rx_time = connsm->rem_max_rx_time; - connsm->rem_max_tx_octets = BLE_LL_CONN_SUPP_BYTES_MIN; - connsm->rem_max_rx_octets = BLE_LL_CONN_SUPP_BYTES_MIN; - connsm->eff_max_tx_octets = BLE_LL_CONN_SUPP_BYTES_MIN; - connsm->eff_max_rx_octets = BLE_LL_CONN_SUPP_BYTES_MIN; - - ble_ll_update_max_tx_octets_phy_mode(connsm); -} - -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - -void -ble_ll_conn_ext_master_init(struct ble_ll_conn_sm *connsm, - struct hci_ext_create_conn *hcc) -{ - - ble_ll_conn_master_common_init(connsm); - - /* Set own address type and peer address if needed */ - connsm->own_addr_type = hcc->own_addr_type; - if (hcc->filter_policy == 0) { - memcpy(&connsm->peer_addr, &hcc->peer_addr, BLE_DEV_ADDR_LEN); - connsm->peer_addr_type = hcc->peer_addr_type; - } - - connsm->initial_params = *hcc; -} - -void -ble_ll_conn_ext_set_params(struct ble_ll_conn_sm *connsm, - struct hci_ext_conn_params *hcc_params, int phy) -{ - /* Set slave latency and supervision timeout */ - connsm->slave_latency = hcc_params->conn_latency; - connsm->supervision_tmo = hcc_params->supervision_timeout; - - /* XXX: for now, just make connection interval equal to max */ - connsm->conn_itvl = hcc_params->conn_itvl_max; - - - /* Check the min/max CE lengths are less than connection interval */ - if (hcc_params->min_ce_len > (connsm->conn_itvl * 2)) { - connsm->min_ce_len = connsm->conn_itvl * 2; - } else { - connsm->min_ce_len = hcc_params->min_ce_len; - } - - if (hcc_params->max_ce_len > (connsm->conn_itvl * 2)) { - connsm->max_ce_len = connsm->conn_itvl * 2; - } else { - connsm->max_ce_len = hcc_params->max_ce_len; - } - - ble_ll_conn_calc_itvl_ticks(connsm); - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - ble_ll_conn_init_phy(connsm, phy); -#endif -} - - -#endif - -static void -ble_ll_conn_set_csa(struct ble_ll_conn_sm *connsm, bool chsel) -{ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) - if (chsel) { - CONN_F_CSA2_SUPP(connsm) = 1; - connsm->channel_id = ((connsm->access_addr & 0xffff0000) >> 16) ^ - (connsm->access_addr & 0x0000ffff); - - /* calculate the next data channel */ - connsm->data_chan_index = ble_ll_conn_calc_dci(connsm, 0); - return; - } -#endif - - connsm->last_unmapped_chan = 0; - - /* calculate the next data channel */ - connsm->data_chan_index = ble_ll_conn_calc_dci(connsm, 1); -} - -/** - * Create a new connection state machine. This is done once per - * connection when the HCI command "create connection" is issued to the - * controller or when a slave receives a connect request. - * - * Context: Link Layer task - * - * @param connsm - */ -void -ble_ll_conn_sm_new(struct ble_ll_conn_sm *connsm) -{ - struct ble_ll_conn_global_params *conn_params; - - /* Reset following elements */ - connsm->csmflags.conn_flags = 0; - connsm->event_cntr = 0; - connsm->conn_state = BLE_LL_CONN_STATE_IDLE; - connsm->disconnect_reason = 0; - connsm->rxd_disconnect_reason = 0; - connsm->conn_features = BLE_LL_CONN_INITIAL_FEATURES; - memset(connsm->remote_features, 0, sizeof(connsm->remote_features)); - connsm->vers_nr = 0; - connsm->comp_id = 0; - connsm->sub_vers_nr = 0; - connsm->reject_reason = BLE_ERR_SUCCESS; - connsm->conn_rssi = BLE_LL_CONN_UNKNOWN_RSSI; - connsm->rpa_index = -1; - connsm->inita_identity_used = 0; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - connsm->sync_transfer_sync_timeout = g_ble_ll_conn_sync_transfer_params.sync_timeout_us; - connsm->sync_transfer_mode = g_ble_ll_conn_sync_transfer_params.mode; - connsm->sync_transfer_skip = g_ble_ll_conn_sync_transfer_params.max_skip; -#endif - - /* XXX: TODO set these based on PHY that started connection */ -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - connsm->phy_data.cur_tx_phy = BLE_PHY_1M; - connsm->phy_data.cur_rx_phy = BLE_PHY_1M; - connsm->phy_data.tx_phy_mode = BLE_PHY_MODE_1M; - connsm->phy_data.rx_phy_mode = BLE_PHY_MODE_1M; - connsm->phy_data.req_pref_tx_phys_mask = 0; - connsm->phy_data.req_pref_rx_phys_mask = 0; - connsm->phy_data.host_pref_tx_phys_mask = g_ble_ll_data.ll_pref_tx_phys; - connsm->phy_data.host_pref_rx_phys_mask = g_ble_ll_data.ll_pref_rx_phys; - connsm->phy_data.phy_options = 0; - connsm->phy_tx_transition = 0; -#endif - - /* Reset current control procedure */ - connsm->cur_ctrl_proc = BLE_LL_CTRL_PROC_IDLE; - connsm->pending_ctrl_procs = 0; - - /* - * Set handle in connection update procedure to 0. If the handle - * is non-zero it means that the host initiated the connection - * parameter update request and the rest of the parameters are valid. - */ - connsm->conn_param_req.handle = 0; - - /* Connection end event */ - ble_npl_event_init(&connsm->conn_ev_end, ble_ll_conn_event_end, connsm); - - /* Initialize transmit queue and ack/flow control elements */ - STAILQ_INIT(&connsm->conn_txq); - connsm->cur_tx_pdu = NULL; - connsm->tx_seqnum = 0; - connsm->next_exp_seqnum = 0; - connsm->cons_rxd_bad_crc = 0; - connsm->last_rxd_sn = 1; - connsm->completed_pkts = 0; - - /* initialize data length mgmt */ - conn_params = &g_ble_ll_conn_params; - connsm->max_tx_octets = conn_params->conn_init_max_tx_octets; - connsm->max_rx_octets = conn_params->supp_max_rx_octets; - connsm->max_tx_time = conn_params->conn_init_max_tx_time; - connsm->max_rx_time = conn_params->supp_max_rx_time; - connsm->rem_max_tx_time = BLE_LL_CONN_SUPP_TIME_MIN; - connsm->rem_max_rx_time = BLE_LL_CONN_SUPP_TIME_MIN; - connsm->eff_max_tx_time = BLE_LL_CONN_SUPP_TIME_MIN; - connsm->eff_max_rx_time = BLE_LL_CONN_SUPP_TIME_MIN; - connsm->rem_max_tx_octets = BLE_LL_CONN_SUPP_BYTES_MIN; - connsm->rem_max_rx_octets = BLE_LL_CONN_SUPP_BYTES_MIN; - connsm->eff_max_tx_octets = BLE_LL_CONN_SUPP_BYTES_MIN; - connsm->eff_max_rx_octets = BLE_LL_CONN_SUPP_BYTES_MIN; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - connsm->host_req_max_tx_time = 0; -#endif - - ble_ll_update_max_tx_octets_phy_mode(connsm); - - /* Reset encryption data */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - memset(&connsm->enc_data, 0, sizeof(struct ble_ll_conn_enc_data)); - connsm->enc_data.enc_state = CONN_ENC_S_UNENCRYPTED; -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING) - connsm->auth_pyld_tmo = BLE_LL_CONN_DEF_AUTH_PYLD_TMO; - CONN_F_LE_PING_SUPP(connsm) = 1; - ble_npl_callout_init(&connsm->auth_pyld_timer, - &g_ble_ll_data.ll_evq, - ble_ll_conn_auth_pyld_timer_cb, - connsm); -#endif - - ble_ll_conn_calc_itvl_ticks(connsm); - - /* Add to list of active connections */ - SLIST_INSERT_HEAD(&g_ble_ll_conn_active_list, connsm, act_sle); -} - -void -ble_ll_conn_update_eff_data_len(struct ble_ll_conn_sm *connsm) -{ - int send_event; - uint16_t eff_time; - uint16_t eff_bytes; - - /* Assume no event sent */ - send_event = 0; - - /* See if effective times have changed */ - eff_time = min(connsm->rem_max_tx_time, connsm->max_rx_time); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - if (connsm->phy_data.cur_rx_phy == BLE_PHY_CODED) { - eff_time = max(eff_time, BLE_LL_CONN_SUPP_TIME_MIN_CODED); - } -#endif - if (eff_time != connsm->eff_max_rx_time) { - connsm->eff_max_rx_time = eff_time; - send_event = 1; - } - eff_time = min(connsm->rem_max_rx_time, connsm->max_tx_time); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - if (connsm->phy_data.cur_tx_phy == BLE_PHY_CODED) { - eff_time = max(eff_time, BLE_LL_CONN_SUPP_TIME_MIN_CODED); - } -#endif - if (eff_time != connsm->eff_max_tx_time) { - connsm->eff_max_tx_time = eff_time; - send_event = 1; - - ble_ll_update_max_tx_octets_phy_mode(connsm); - } - eff_bytes = min(connsm->rem_max_tx_octets, connsm->max_rx_octets); - if (eff_bytes != connsm->eff_max_rx_octets) { - connsm->eff_max_rx_octets = eff_bytes; - send_event = 1; - } - eff_bytes = min(connsm->rem_max_rx_octets, connsm->max_tx_octets); - if (eff_bytes != connsm->eff_max_tx_octets) { - connsm->eff_max_tx_octets = eff_bytes; - send_event = 1; - } - - if (send_event) { - ble_ll_hci_ev_datalen_chg(connsm); - } -} - -/** - * Called when a connection is terminated - * - * Context: Link Layer task. - * - * @param connsm - * @param ble_err - */ -void -ble_ll_conn_end(struct ble_ll_conn_sm *connsm, uint8_t ble_err) -{ - struct os_mbuf *m; - struct os_mbuf_pkthdr *pkthdr; - os_sr_t sr; - - /* Remove scheduler events just in case */ - ble_ll_sched_rmv_elem(&connsm->conn_sch); - - /* In case of the supervision timeout we shall make sure - * that there is no ongoing connection event. It could happen - * because we scheduled connection event before checking connection timeout. - * If connection event managed to start, let us drop it. - */ - OS_ENTER_CRITICAL(sr); - if (g_ble_ll_conn_cur_sm == connsm) { - ble_ll_conn_halt(); - STATS_INC(ble_ll_conn_stats, conn_event_while_tmo); - } - OS_EXIT_CRITICAL(sr); - - /* Stop any control procedures that might be running */ - ble_npl_callout_stop(&connsm->ctrl_proc_rsp_timer); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING) - ble_npl_callout_stop(&connsm->auth_pyld_timer); -#endif - - /* Remove from the active connection list */ - SLIST_REMOVE(&g_ble_ll_conn_active_list, connsm, ble_ll_conn_sm, act_sle); - - /* Free the current transmit pdu if there is one. */ - if (connsm->cur_tx_pdu) { - os_mbuf_free_chain(connsm->cur_tx_pdu); - connsm->cur_tx_pdu = NULL; - } - - /* Free all packets on transmit queue */ - while (1) { - /* Get mbuf pointer from packet header pointer */ - pkthdr = STAILQ_FIRST(&connsm->conn_txq); - if (!pkthdr) { - break; - } - STAILQ_REMOVE_HEAD(&connsm->conn_txq, omp_next); - - m = (struct os_mbuf *)((uint8_t *)pkthdr - sizeof(struct os_mbuf)); - os_mbuf_free_chain(m); - } - - /* Make sure events off queue */ - ble_npl_eventq_remove(&g_ble_ll_data.ll_evq, &connsm->conn_ev_end); - -#if MYNEWT_VAL(BLE_LL_STRICT_CONN_SCHEDULING) - /* Remove from occupied periods */ - OS_ENTER_CRITICAL(sr); - BLE_LL_ASSERT(g_ble_ll_sched_data.sch_num_occ_periods > 0); - BLE_LL_ASSERT(g_ble_ll_sched_data.sch_occ_period_mask & connsm->period_occ_mask); - --g_ble_ll_sched_data.sch_num_occ_periods; - g_ble_ll_sched_data.sch_occ_period_mask &= ~connsm->period_occ_mask; - OS_EXIT_CRITICAL(sr); -#endif - - /* Connection state machine is now idle */ - connsm->conn_state = BLE_LL_CONN_STATE_IDLE; - - /* - * If we have features and there's pending HCI command, send an event before - * disconnection event so it does make sense to host. - */ - if (connsm->csmflags.cfbit.pending_hci_rd_features && - connsm->csmflags.cfbit.rxd_features) { - ble_ll_hci_ev_rd_rem_used_feat(connsm, BLE_ERR_SUCCESS); - connsm->csmflags.cfbit.pending_hci_rd_features = 0; - } - - /* - * If there is still pending read features request HCI command, send an - * event to complete it. - */ - if (connsm->csmflags.cfbit.pending_hci_rd_features) { - ble_ll_hci_ev_rd_rem_used_feat(connsm, ble_err); - connsm->csmflags.cfbit.pending_hci_rd_features = 0; - } - - /* - * We need to send a disconnection complete event. Connection Complete for - * canceling connection creation is sent from LE Create Connection Cancel - * Command handler. - * - * If the ble error is "success" it means that the reset command was - * received and we should not send an event. - */ - if (ble_err && (ble_err != BLE_ERR_UNK_CONN_ID || - connsm->csmflags.cfbit.terminate_ind_rxd)) { - ble_ll_disconn_comp_event_send(connsm, ble_err); - } - - /* Put connection state machine back on free list */ - STAILQ_INSERT_TAIL(&g_ble_ll_conn_free_list, connsm, free_stqe); - - /* Log connection end */ - ble_ll_trace_u32x3(BLE_LL_TRACE_ID_CONN_END, connsm->conn_handle, - connsm->event_cntr, (uint32_t)ble_err); -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) -void -ble_ll_conn_get_anchor(struct ble_ll_conn_sm *connsm, uint16_t conn_event, - uint32_t *anchor, uint8_t *anchor_usecs) -{ - uint32_t ticks; - uint32_t itvl; - - itvl = (connsm->conn_itvl * BLE_LL_CONN_ITVL_USECS); - - if ((int16_t)(conn_event - connsm->event_cntr) < 0) { - itvl *= connsm->event_cntr - conn_event; - ticks = os_cputime_usecs_to_ticks(itvl); - *anchor = connsm->anchor_point - ticks; - } else { - itvl *= conn_event - connsm->event_cntr; - ticks = os_cputime_usecs_to_ticks(itvl); - *anchor = connsm->anchor_point + ticks; - } - - *anchor_usecs = connsm->anchor_point_usecs; - *anchor_usecs += (itvl - os_cputime_ticks_to_usecs(ticks)); - if (*anchor_usecs >= 31) { - (*anchor)++; - *anchor_usecs -= 31; - } -} -#endif - -/** - * Called to move to the next connection event. - * - * Context: Link Layer task. - * - * @param connsm - * - * @return int - */ -static int -ble_ll_conn_next_event(struct ble_ll_conn_sm *connsm) -{ - uint16_t latency; - uint32_t itvl; - uint32_t cur_ww; - uint32_t max_ww; - struct ble_ll_conn_upd_req *upd; - uint32_t ticks; - uint32_t usecs; - - /* XXX: deal with connection request procedure here as well */ - ble_ll_conn_chk_csm_flags(connsm); - - /* If unable to start terminate procedure, start it now */ - if (connsm->disconnect_reason && !CONN_F_TERMINATE_STARTED(connsm)) { - ble_ll_ctrl_terminate_start(connsm); - } - - if (CONN_F_TERMINATE_STARTED(connsm) && (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE)) { - /* Some of the devices waits whole connection interval to ACK our - * TERMINATE_IND sent as a Slave. Since we are here it means we are still waiting for ACK. - * Make sure we catch it in next connection event. - */ - connsm->slave_latency = 0; - } - - /* - * XXX: TODO Probably want to add checks to see if we need to start - * a control procedure here as an instant may have prevented us from - * starting one. - */ - - /* - * XXX TODO: I think this is technically incorrect. We can allow slave - * latency if we are doing one of these updates as long as we - * know that the master has received the ACK to the PDU that set - * the instant - */ - /* Set event counter to the next connection event that we will tx/rx in */ - itvl = connsm->conn_itvl * BLE_LL_CONN_ITVL_USECS; - latency = 1; - if (connsm->csmflags.cfbit.allow_slave_latency && - !connsm->csmflags.cfbit.conn_update_sched && - !CONN_F_PHY_UPDATE_SCHED(connsm) && - !connsm->csmflags.cfbit.chanmap_update_scheduled) { - if (connsm->csmflags.cfbit.pkt_rxd) { - latency += connsm->slave_latency; - itvl = itvl * latency; - } - } - connsm->event_cntr += latency; - - /* Set next connection event start time */ - /* We can use pre-calculated values for one interval if latency is 1. */ - if (latency == 1) { - connsm->anchor_point += connsm->conn_itvl_ticks; - connsm->anchor_point_usecs += connsm->conn_itvl_usecs; - } else { - uint32_t ticks; - ticks = os_cputime_usecs_to_ticks(itvl); - connsm->anchor_point += ticks; - connsm->anchor_point_usecs += (itvl - os_cputime_ticks_to_usecs(ticks)); - } - if (connsm->anchor_point_usecs >= 31) { - ++connsm->anchor_point; - connsm->anchor_point_usecs -= 31; - } - - /* - * If a connection update has been scheduled and the event counter - * is now equal to the instant, we need to adjust the start of the - * connection by the the transmit window offset. We also copy in the - * update parameters as they now should take effect. - */ - if (connsm->csmflags.cfbit.conn_update_sched && - (connsm->event_cntr == connsm->conn_update_req.instant)) { - - /* Set flag so we send connection update event */ - upd = &connsm->conn_update_req; - if ((connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) || - ((connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) && - IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_CONN_PARAM_REQ)) || - (connsm->conn_itvl != upd->interval) || - (connsm->slave_latency != upd->latency) || - (connsm->supervision_tmo != upd->timeout)) { - connsm->csmflags.cfbit.host_expects_upd_event = 1; - } - - connsm->supervision_tmo = upd->timeout; - connsm->slave_latency = upd->latency; - connsm->tx_win_size = upd->winsize; - connsm->slave_cur_tx_win_usecs = - connsm->tx_win_size * BLE_LL_CONN_TX_WIN_USECS; - connsm->tx_win_off = upd->winoffset; - connsm->conn_itvl = upd->interval; - ble_ll_conn_calc_itvl_ticks(connsm); - if (upd->winoffset != 0) { - usecs = upd->winoffset * BLE_LL_CONN_ITVL_USECS; - ticks = os_cputime_usecs_to_ticks(usecs); - connsm->anchor_point += ticks; - usecs = usecs - os_cputime_ticks_to_usecs(ticks); - connsm->anchor_point_usecs += usecs; - if (connsm->anchor_point_usecs >= 31) { - ++connsm->anchor_point; - connsm->anchor_point_usecs -= 31; - } - } - - /* Reset the starting point of the connection supervision timeout */ - connsm->last_rxd_pdu_cputime = connsm->anchor_point; - - /* Reset update scheduled flag */ - connsm->csmflags.cfbit.conn_update_sched = 0; - } - - /* - * If there is a channel map request pending and we have reached the - * instant, change to new channel map. Note there is a special case here. - * If we received a channel map update with an instant equal to the event - * counter, when we get here the event counter has already been - * incremented by 1. That is why we do a signed comparison and change to - * new channel map once the event counter equals or has passed channel - * map update instant. - */ - if (connsm->csmflags.cfbit.chanmap_update_scheduled && - ((int16_t)(connsm->chanmap_instant - connsm->event_cntr) <= 0)) { - - /* XXX: there is a chance that the control packet is still on - * the queue of the master. This means that we never successfully - * transmitted update request. Would end up killing connection - on slave side. Could ignore it or see if still enqueued. */ - connsm->num_used_chans = - ble_ll_utils_calc_num_used_chans(connsm->req_chanmap); - memcpy(connsm->chanmap, connsm->req_chanmap, BLE_LL_CONN_CHMAP_LEN); - - connsm->csmflags.cfbit.chanmap_update_scheduled = 0; - - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_CHAN_MAP_UPD); - - /* XXX: host could have resent channel map command. Need to - check to make sure we dont have to restart! */ - } - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - if (CONN_F_PHY_UPDATE_SCHED(connsm) && - (connsm->event_cntr == connsm->phy_instant)) { - - /* Set cur phy to new phy */ - if (connsm->phy_data.new_tx_phy) { - connsm->phy_data.cur_tx_phy = connsm->phy_data.new_tx_phy; - connsm->phy_data.tx_phy_mode = - ble_ll_phy_to_phy_mode(connsm->phy_data.cur_tx_phy, - connsm->phy_data.phy_options); - } - - if (connsm->phy_data.new_rx_phy) { - connsm->phy_data.cur_rx_phy = connsm->phy_data.new_rx_phy; - connsm->phy_data.rx_phy_mode = - ble_ll_phy_to_phy_mode(connsm->phy_data.cur_rx_phy, - connsm->phy_data.phy_options); - } - - /* Clear flags and set flag to send event at next instant */ - CONN_F_PHY_UPDATE_SCHED(connsm) = 0; - CONN_F_PHY_UPDATE_EVENT(connsm) = 1; - - ble_ll_ctrl_phy_update_proc_complete(connsm); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - /* Recalculate effective connection parameters */ - ble_ll_conn_update_eff_data_len(connsm); - - /* - * If PHY in either direction was changed to coded, we assume that peer - * does support LE Coded PHY even if features were not exchanged yet. - * This means that MaxRxTime can be updated to supported max and we need - * initiate DLE to notify peer about the change. - */ - if (((connsm->phy_data.cur_tx_phy == BLE_PHY_CODED) || - (connsm->phy_data.cur_rx_phy == BLE_PHY_CODED)) && - !(connsm->remote_features[0] & (BLE_LL_FEAT_LE_CODED_PHY >> 8))) { - connsm->remote_features[0] |= (BLE_LL_FEAT_LE_CODED_PHY >> 8); - connsm->max_rx_time = BLE_LL_CONN_SUPP_TIME_MAX_CODED; - ble_ll_ctrl_initiate_dle(connsm); - } -#endif - } -#endif - - /* Calculate data channel index of next connection event */ - connsm->data_chan_index = ble_ll_conn_calc_dci(connsm, latency); - - /* - * If we are trying to terminate connection, check if next wake time is - * passed the termination timeout. If so, no need to continue with - * connection as we will time out anyway. - */ - if (CONN_F_TERMINATE_STARTED(connsm)) { - if ((int32_t)(connsm->terminate_timeout - connsm->anchor_point) <= 0) { - return -1; - } - } - - /* - * Calculate ce end time. For a slave, we need to add window widening and - * the transmit window if we still have one. - */ -#if MYNEWT_VAL(BLE_LL_STRICT_CONN_SCHEDULING) - itvl = g_ble_ll_sched_data.sch_ticks_per_period; -#else - itvl = MYNEWT_VAL(BLE_LL_CONN_INIT_SLOTS) * BLE_LL_SCHED_32KHZ_TICKS_PER_SLOT; -#endif - if (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) { - - cur_ww = ble_ll_utils_calc_window_widening(connsm->anchor_point, - connsm->last_anchor_point, - connsm->master_sca); - max_ww = (connsm->conn_itvl * (BLE_LL_CONN_ITVL_USECS/2)) - BLE_LL_IFS; - if (cur_ww >= max_ww) { - return -1; - } - cur_ww += BLE_LL_JITTER_USECS; - connsm->slave_cur_window_widening = cur_ww; - itvl += os_cputime_usecs_to_ticks(cur_ww + connsm->slave_cur_tx_win_usecs); - } - itvl -= g_ble_ll_sched_offset_ticks; - connsm->ce_end_time = connsm->anchor_point + itvl; - - return 0; -} - -/** - * Called when a connection has been created. This function will - * -> Set the connection state to created. - * -> Start the connection supervision timer - * -> Set the Link Layer state to connection. - * -> Send a connection complete event. - * - * See Section 4.5.2 Vol 6 Part B - * - * Context: Link Layer - * - * @param connsm - * - * @ return 0: connection NOT created. 1: connection created - */ -static int -ble_ll_conn_created(struct ble_ll_conn_sm *connsm, struct ble_mbuf_hdr *rxhdr) -{ - int rc; - uint8_t *evbuf; - uint32_t endtime; - uint32_t usecs; - - /* XXX: TODO this assumes we received in 1M phy */ - - /* Set state to created */ - connsm->conn_state = BLE_LL_CONN_STATE_CREATED; - - /* Clear packet received flag */ - connsm->csmflags.cfbit.pkt_rxd = 0; - - /* Consider time created the last scheduled time */ - connsm->last_scheduled = os_cputime_get32(); - - /* - * Set the last rxd pdu time since this is where we want to start the - * supervision timer from. - */ - connsm->last_rxd_pdu_cputime = connsm->last_scheduled; - - /* - * Set first connection event time. If slave the endtime is the receive end - * time of the connect request. The actual connection starts 1.25 msecs plus - * the transmit window offset from the end of the connection request. - */ - rc = 1; - if (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) { - /* - * With a 32.768 kHz crystal we dont care about the remaining usecs - * when setting last anchor point. The only thing last anchor is used - * for is to calculate window widening. The effect of this is - * negligible. - */ - connsm->last_anchor_point = rxhdr->beg_cputime; - - usecs = rxhdr->rem_usecs + 1250 + - (connsm->tx_win_off * BLE_LL_CONN_TX_WIN_USECS) + - ble_ll_pdu_tx_time_get(BLE_CONNECT_REQ_LEN, - rxhdr->rxinfo.phy_mode); - - if (rxhdr->rxinfo.channel < BLE_PHY_NUM_DATA_CHANS) { - switch (rxhdr->rxinfo.phy) { - case BLE_PHY_1M: - case BLE_PHY_2M: - usecs += 1250; - break; - case BLE_PHY_CODED: - usecs += 2500; - break; - default: - BLE_LL_ASSERT(0); - break; - } - } - - /* Anchor point is cputime. */ - endtime = os_cputime_usecs_to_ticks(usecs); - connsm->anchor_point = rxhdr->beg_cputime + endtime; - connsm->anchor_point_usecs = usecs - os_cputime_ticks_to_usecs(endtime); - if (connsm->anchor_point_usecs == 31) { - ++connsm->anchor_point; - connsm->anchor_point_usecs = 0; - } - - connsm->slave_cur_tx_win_usecs = - connsm->tx_win_size * BLE_LL_CONN_TX_WIN_USECS; -#if MYNEWT_VAL(BLE_LL_STRICT_CONN_SCHEDULING) - connsm->ce_end_time = connsm->anchor_point + - g_ble_ll_sched_data.sch_ticks_per_period + - os_cputime_usecs_to_ticks(connsm->slave_cur_tx_win_usecs) + 1; - -#else - connsm->ce_end_time = connsm->anchor_point + - (MYNEWT_VAL(BLE_LL_CONN_INIT_SLOTS) * BLE_LL_SCHED_32KHZ_TICKS_PER_SLOT) - + os_cputime_usecs_to_ticks(connsm->slave_cur_tx_win_usecs) + 1; -#endif - connsm->slave_cur_window_widening = BLE_LL_JITTER_USECS; - - /* Start the scheduler for the first connection event */ - while (ble_ll_sched_slave_new(connsm)) { - if (ble_ll_conn_next_event(connsm)) { - STATS_INC(ble_ll_conn_stats, cant_set_sched); - rc = 0; - break; - } - } - } - - /* Send connection complete event to inform host of connection */ - if (rc) { -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - /* - * If we have default phy preferences and they are different than - * the current PHY's in use, start update procedure. - */ - /* - * XXX: should we attempt to start this without knowing if - * the other side can support it? - */ - if (!ble_ll_conn_chk_phy_upd_start(connsm)) { - CONN_F_CTRLR_PHY_UPDATE(connsm) = 1; - } -#endif - if (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) { - ble_ll_adv_send_conn_comp_ev(connsm, rxhdr); - } else { - evbuf = ble_ll_init_get_conn_comp_ev(); - ble_ll_conn_comp_event_send(connsm, BLE_ERR_SUCCESS, evbuf, NULL); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) - ble_ll_hci_ev_le_csa(connsm); -#endif - - /* - * Initiate features exchange - * - * XXX we do this only as a master as it was observed that sending - * LL_SLAVE_FEATURE_REQ after connection breaks some recent iPhone - * models; for slave just assume master will initiate features xchg - * if it has some additional features to use. - */ - ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_FEATURE_XCHG); - } - } - - return rc; -} - -/** - * Called upon end of connection event - * - * Context: Link-layer task - * - * @param void *arg Pointer to connection state machine - * - */ -static void -ble_ll_conn_event_end(struct ble_npl_event *ev) -{ - uint8_t ble_err; - uint32_t tmo; - struct ble_ll_conn_sm *connsm; - - ble_ll_rfmgmt_release(); - - /* Better be a connection state machine! */ - connsm = (struct ble_ll_conn_sm *)ble_npl_event_get_arg(ev); - BLE_LL_ASSERT(connsm); - if (connsm->conn_state == BLE_LL_CONN_STATE_IDLE) { - /* That should not happen. If it does it means connection - * is already closed. - * Make sure LL state machine is in idle - */ - STATS_INC(ble_ll_conn_stats, sched_end_in_idle); - BLE_LL_ASSERT(0); - - /* Just in case */ - ble_ll_state_set(BLE_LL_STATE_STANDBY); - - ble_ll_scan_chk_resume(); - return; - } - - /* Log event end */ - ble_ll_trace_u32x2(BLE_LL_TRACE_ID_CONN_EV_END, connsm->conn_handle, - connsm->event_cntr); - - ble_ll_scan_chk_resume(); - - /* If we have transmitted the terminate IND successfully, we are done */ - if ((connsm->csmflags.cfbit.terminate_ind_txd) || - (connsm->csmflags.cfbit.terminate_ind_rxd && - connsm->csmflags.cfbit.terminate_ind_rxd_acked)) { - if (connsm->csmflags.cfbit.terminate_ind_txd) { - ble_err = BLE_ERR_CONN_TERM_LOCAL; - } else { - /* Make sure the disconnect reason is valid! */ - ble_err = connsm->rxd_disconnect_reason; - if (ble_err == 0) { - ble_err = BLE_ERR_REM_USER_CONN_TERM; - } - } - ble_ll_conn_end(connsm, ble_err); - return; - } - - /* Remove any connection end events that might be enqueued */ - ble_npl_eventq_remove(&g_ble_ll_data.ll_evq, &connsm->conn_ev_end); - - /* - * If we have received a packet, we can set the current transmit window - * usecs to 0 since we dont need to listen in the transmit window. - */ - if (connsm->csmflags.cfbit.pkt_rxd) { - connsm->slave_cur_tx_win_usecs = 0; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING) - /* - * If we are encrypted and have passed the authenticated payload timeout - * we need to send an event to tell the host. Unfortunately, I think we - * need one of these per connection and we have to set this timer - * fairly accurately. So we need to another event in the connection. - * This sucks. - * - * The way this works is that whenever the timer expires it just gets reset - * and we send the autheticated payload timeout event. Note that this timer - * should run even when encryption is paused. - * XXX: what should be here? Was there code here that got deleted? - */ -#endif - - /* Move to next connection event */ - if (ble_ll_conn_next_event(connsm)) { - ble_ll_conn_end(connsm, BLE_ERR_CONN_TERM_LOCAL); - return; - } - - /* Reset "per connection event" variables */ - connsm->cons_rxd_bad_crc = 0; - connsm->csmflags.cfbit.pkt_rxd = 0; - - /* See if we need to start any control procedures */ - ble_ll_ctrl_chk_proc_start(connsm); - - /* Set initial schedule callback */ - connsm->conn_sch.sched_cb = ble_ll_conn_event_start_cb; - - /* XXX: I think all this fine for when we do connection updates, but - we may want to force the first event to be scheduled. Not sure */ - /* Schedule the next connection event */ - while (ble_ll_sched_conn_reschedule(connsm)) { - if (ble_ll_conn_next_event(connsm)) { - ble_ll_conn_end(connsm, BLE_ERR_CONN_TERM_LOCAL); - return; - } - } - - /* - * This is definitely not perfect but hopefully will be fine in regards to - * the specification. We check the supervision timer at connection event - * end. If the next connection event is going to start past the supervision - * timeout we end the connection here. I guess this goes against the spec - * in two ways: - * 1) We are actually causing a supervision timeout before the time - * specified. However, this is really a moot point because the supervision - * timeout would have expired before we could possibly receive a packet. - * 2) We may end the supervision timeout a bit later than specified as - * we only check this at event end and a bad CRC could cause us to continue - * the connection event longer than the supervision timeout. Given that two - * bad CRC's consecutively ends the connection event, I dont regard this as - * a big deal but it could cause a slightly longer supervision timeout. - */ - if (connsm->conn_state == BLE_LL_CONN_STATE_CREATED) { - tmo = (uint32_t)connsm->conn_itvl * BLE_LL_CONN_ITVL_USECS * 6UL; - ble_err = BLE_ERR_CONN_ESTABLISHMENT; - } else { - tmo = connsm->supervision_tmo * BLE_HCI_CONN_SPVN_TMO_UNITS * 1000UL; - ble_err = BLE_ERR_CONN_SPVN_TMO; - } - /* XXX: Convert to ticks to usecs calculation instead??? */ - tmo = os_cputime_usecs_to_ticks(tmo); - if ((int32_t)(connsm->anchor_point - connsm->last_rxd_pdu_cputime) >= tmo) { - ble_ll_conn_end(connsm, ble_err); - return; - } - - /* If we have completed packets, send an event */ - ble_ll_conn_num_comp_pkts_event_send(connsm); - - /* If we have features and there's pending HCI command, send an event */ - if (connsm->csmflags.cfbit.pending_hci_rd_features && - connsm->csmflags.cfbit.rxd_features) { - ble_ll_hci_ev_rd_rem_used_feat(connsm, BLE_ERR_SUCCESS); - connsm->csmflags.cfbit.pending_hci_rd_features = 0; - } -} - -/** - * Update the connection request PDU with the address type and address of - * advertiser we are going to send connect request to. - * - * @param m - * @param adva - * @param addr_type Address type of ADVA from received advertisement. - * @param inita - * @param inita_type Address type of INITA from received advertisement. - - * @param txoffset The tx window offset for this connection - */ -static void -ble_ll_conn_connect_ind_prepare(struct ble_ll_conn_sm *connsm, - struct ble_ll_scan_pdu_data *pdu_data, - uint8_t adva_type, uint8_t *adva, - uint8_t inita_type, uint8_t *inita, - int rpa_index, uint8_t channel) -{ - uint8_t hdr; - uint8_t *addr; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - int is_rpa; - struct ble_ll_resolv_entry *rl; -#endif - - hdr = BLE_ADV_PDU_TYPE_CONNECT_IND; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) - /* We need CSA2 bit only for legacy connect */ - if (channel >= BLE_PHY_NUM_DATA_CHANS) { - hdr |= BLE_ADV_PDU_HDR_CHSEL; - } -#endif - - if (adva_type) { - /* Set random address */ - hdr |= BLE_ADV_PDU_HDR_RXADD_MASK; - } - - if (inita) { - memcpy(pdu_data->inita, inita, BLE_DEV_ADDR_LEN); - if (inita_type) { - hdr |= BLE_ADV_PDU_HDR_TXADD_RAND; - } - } else { - /* Get pointer to our device address */ - connsm = g_ble_ll_conn_create_sm; - if ((connsm->own_addr_type & 1) == 0) { - addr = g_dev_addr; - } else { - hdr |= BLE_ADV_PDU_HDR_TXADD_RAND; - addr = g_random_addr; - } - - /* XXX: do this ahead of time? Calculate the local rpa I mean */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - if (connsm->own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) { - rl = NULL; - is_rpa = ble_ll_is_rpa(adva, adva_type); - if (is_rpa) { - if (rpa_index >= 0) { - rl = &g_ble_ll_resolv_list[rpa_index]; - } - } else { - /* we look for RL entry to generate local RPA regardless if - * resolving is enabled or not (as this is is for local RPA - * not peer RPA) - */ - rl = ble_ll_resolv_list_find(adva, adva_type); - } - - /* - * If peer in on resolving list, we use RPA generated with Local IRK - * from resolving list entry. In other case, we need to use our identity - * address (see Core 5.0, Vol 6, Part B, section 6.4). - */ - if (rl && rl->rl_has_local) { - hdr |= BLE_ADV_PDU_HDR_TXADD_RAND; - ble_ll_resolv_get_priv_addr(rl, 1, pdu_data->inita); - addr = NULL; - } - } -#endif - - if (addr) { - memcpy(pdu_data->inita, addr, BLE_DEV_ADDR_LEN); - /* Identity address used */ - connsm->inita_identity_used = 1; - } - } - - memcpy(pdu_data->adva, adva, BLE_DEV_ADDR_LEN); - - pdu_data->hdr_byte = hdr; -} - -/* Returns true if the address matches the connection peer address having in - * mind privacy mode - */ -static int -ble_ll_conn_is_peer_adv(uint8_t addr_type, uint8_t *adva, int index) -{ - int rc; - uint8_t *peer_addr = NULL; - struct ble_ll_conn_sm *connsm; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - struct ble_ll_resolv_entry *rl; -#endif - - /* XXX: Deal with different types of random addresses here! */ - connsm = g_ble_ll_conn_create_sm; - if (!connsm) { - return 0; - } - - switch (connsm->peer_addr_type) { - /* Fall-through intentional */ - case BLE_HCI_CONN_PEER_ADDR_PUBLIC: - case BLE_HCI_CONN_PEER_ADDR_RANDOM: -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - if (ble_ll_addr_is_id(adva, addr_type)) { - /* Peer uses its identity address. Let's verify privacy mode. - * - * Note: Core Spec 5.0 Vol 6, Part B - * If the Host has added the peer device to the resolving list - * with an all-zero peer IRK, the Controller shall only accept - * the peer's identity address. - */ - if (ble_ll_resolv_enabled()) { - rl = ble_ll_resolv_list_find(adva, addr_type); - if (rl && (rl->rl_priv_mode == BLE_HCI_PRIVACY_NETWORK) && - rl->rl_has_peer) { - return 0; - } - } - } - - /* Check if peer uses RPA. If so and it match, use it as controller - * supports privacy mode - */ - if ((index >= 0) && - (g_ble_ll_resolv_list[index].rl_addr_type == connsm->peer_addr_type)) { - peer_addr = g_ble_ll_resolv_list[index].rl_identity_addr; - } -#endif - /* - * If we are here it means we don't know the device, lets - * check if type is what we are looking for and later - * if address matches - */ - if ((connsm->peer_addr_type == addr_type) && !peer_addr) { - peer_addr = adva; - } - - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - case BLE_HCI_CONN_PEER_ADDR_PUBLIC_IDENT: - if ((index < 0) || - (g_ble_ll_resolv_list[index].rl_addr_type != 0)) { - return 0; - } - peer_addr = g_ble_ll_resolv_list[index].rl_identity_addr; - break; - case BLE_HCI_CONN_PEER_ADDR_RANDOM_IDENT: - if ((index < 0) || - (g_ble_ll_resolv_list[index].rl_addr_type != 1)) { - return 0; - } - peer_addr = g_ble_ll_resolv_list[index].rl_identity_addr; - break; -#endif - default: - peer_addr = NULL; - break; - } - - rc = 0; - if (peer_addr) { - if (!memcmp(peer_addr, connsm->peer_addr, BLE_DEV_ADDR_LEN)) { - rc = 1; - } - } - - return rc; -} - -static void -ble_ll_conn_connect_ind_txend_to_standby(void *arg) -{ - ble_ll_state_set(BLE_LL_STATE_STANDBY); -} - -static void -ble_ll_conn_connect_ind_txend_to_init(void *arg) -{ - ble_ll_state_set(BLE_LL_STATE_INITIATING); -} - -static uint8_t -ble_ll_conn_connect_ind_tx_pducb(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte) -{ - struct ble_ll_conn_sm *connsm; - struct ble_ll_scan_pdu_data *pdu_data; - - connsm = pducb_arg; - /* - * pdu_data was prepared just before starting TX and is expected to be - * still valid here - */ - pdu_data = ble_ll_scan_get_pdu_data(); - - memcpy(dptr, pdu_data->inita, BLE_DEV_ADDR_LEN); - memcpy(dptr + BLE_DEV_ADDR_LEN, pdu_data->adva, BLE_DEV_ADDR_LEN); - - dptr += 2 * BLE_DEV_ADDR_LEN; - - put_le32(dptr, connsm->access_addr); - dptr[4] = (uint8_t)connsm->crcinit; - dptr[5] = (uint8_t)(connsm->crcinit >> 8); - dptr[6] = (uint8_t)(connsm->crcinit >> 16); - dptr[7] = connsm->tx_win_size; - put_le16(dptr + 8, connsm->tx_win_off); - put_le16(dptr + 10, connsm->conn_itvl); - put_le16(dptr + 12, connsm->slave_latency); - put_le16(dptr + 14, connsm->supervision_tmo); - memcpy(dptr + 16, &connsm->chanmap, BLE_LL_CONN_CHMAP_LEN); - dptr[21] = connsm->hop_inc | (connsm->master_sca << 5); - - *hdr_byte = pdu_data->hdr_byte; - - return 34; -} - -/** - * Send a connection requestion to an advertiser - * - * Context: Interrupt - * - * @param addr_type Address type of advertiser - * @param adva Address of advertiser - */ -int -ble_ll_conn_connect_ind_send(struct ble_ll_conn_sm *connsm, uint8_t end_trans) -{ - int rc; - - if (end_trans == BLE_PHY_TRANSITION_NONE) { - ble_phy_set_txend_cb(ble_ll_conn_connect_ind_txend_to_standby, NULL); - } else { - ble_phy_set_txend_cb(ble_ll_conn_connect_ind_txend_to_init, NULL); - } - - rc = ble_phy_tx(ble_ll_conn_connect_ind_tx_pducb, connsm, end_trans); - - return rc; -} - -/** - * Called when a schedule item overlaps the currently running connection - * event. This generally should not happen, but if it does we stop the - * current connection event to let the schedule item run. - * - * NOTE: the phy has been disabled as well as the wfr timer before this is - * called. - */ -void -ble_ll_conn_event_halt(void) -{ - ble_ll_state_set(BLE_LL_STATE_STANDBY); - if (g_ble_ll_conn_cur_sm) { - g_ble_ll_conn_cur_sm->csmflags.cfbit.pkt_rxd = 0; - ble_ll_event_send(&g_ble_ll_conn_cur_sm->conn_ev_end); - g_ble_ll_conn_cur_sm = NULL; - } -} - -/** - * Process a received PDU while in the initiating state. - * - * Context: Link Layer task. - * - * @param pdu_type - * @param rxbuf - * @param ble_hdr - */ -void -ble_ll_init_rx_pkt_in(uint8_t pdu_type, uint8_t *rxbuf, - struct ble_mbuf_hdr *ble_hdr) -{ - uint8_t addr_type; - uint8_t *addr; - uint8_t *adv_addr; - uint8_t *inita; - uint8_t inita_type; - struct ble_ll_conn_sm *connsm; - int ext_adv_mode = -1; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - struct ble_ll_aux_data *aux_data = NULL; - - if (ble_hdr->rxinfo.user_data) { - /* aux_data just a local helper, no need to ref - * as ble_hdr->rxinfo.user_data is unref in the end of this function - */ - aux_data = ble_hdr->rxinfo.user_data; - } -#endif - - /* Get the connection state machine we are trying to create */ - connsm = g_ble_ll_conn_create_sm; - if (!connsm) { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (aux_data) { - ble_ll_scan_aux_data_unref(ble_hdr->rxinfo.user_data); - ble_hdr->rxinfo.user_data = NULL; - } -#endif - return; - } - - if (!BLE_MBUF_HDR_CRC_OK(ble_hdr)) { - goto scan_continue; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (BLE_MBUF_HDR_AUX_INVALID(ble_hdr)) { - goto scan_continue; - } - - if (pdu_type == BLE_ADV_PDU_TYPE_ADV_EXT_IND) { - if (BLE_MBUF_HDR_WAIT_AUX(ble_hdr)) { - /* Just continue scanning. We are waiting for AUX */ - if (!ble_ll_sched_aux_scan(ble_hdr, connsm->scansm, aux_data)) { - /* ref for aux ptr in the scheduler */ - ble_ll_scan_aux_data_unref(ble_hdr->rxinfo.user_data); - ble_hdr->rxinfo.user_data = NULL; - ble_ll_scan_chk_resume(); - return; - } - goto scan_continue; - } - } - - if (CONN_F_AUX_CONN_REQ(connsm)) { - if (pdu_type != BLE_ADV_PDU_TYPE_AUX_CONNECT_RSP) { - /* Wait for connection response, in this point of time aux is NULL */ - BLE_LL_ASSERT(ble_hdr->rxinfo.user_data == NULL); - return; - } - } -#endif - - /* If we have sent a connect request, we need to enter CONNECTION state */ - if (connsm && CONN_F_CONN_REQ_TXD(connsm)) { - /* Set address of advertiser to which we are connecting. */ - - if (ble_ll_scan_adv_decode_addr(pdu_type, rxbuf, ble_hdr, - &adv_addr, &addr_type, - &inita, &inita_type, &ext_adv_mode)) { - /* Something got wrong, keep trying to connect */ - goto scan_continue; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - /* - * Did we resolve this address? If so, set correct peer address - * and peer address type. - */ - if (connsm->rpa_index >= 0) { - addr_type = g_ble_ll_resolv_list[connsm->rpa_index].rl_addr_type + 2; - addr = g_ble_ll_resolv_list[connsm->rpa_index].rl_identity_addr; - } else { - addr = adv_addr; - } -#else - addr = adv_addr; -#endif - - if (connsm->rpa_index >= 0) { - connsm->peer_addr_type = addr_type; - memcpy(connsm->peer_addr, addr, BLE_DEV_ADDR_LEN); - - ble_ll_scan_set_peer_rpa(adv_addr); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - /* Update resolving list with current peer RPA */ - ble_ll_resolv_set_peer_rpa(connsm->rpa_index, rxbuf + BLE_LL_PDU_HDR_LEN); - if (ble_ll_is_rpa(inita, inita_type)) { - ble_ll_resolv_set_local_rpa(connsm->rpa_index, inita); - } - -#endif - } else if (ble_ll_scan_whitelist_enabled()) { - /* if WL is used we need to store peer addr also if it was not - * resolved - */ - connsm->peer_addr_type = addr_type; - memcpy(connsm->peer_addr, addr, BLE_DEV_ADDR_LEN); - } - - /* Connection has been created. Stop scanning */ - g_ble_ll_conn_create_sm = NULL; - ble_ll_scan_sm_stop(0); - - /* For AUX Connect CSA2 is mandatory. Otherwise we need to check bit - * mask - */ - if (ble_hdr->rxinfo.channel < BLE_PHY_NUM_DATA_CHANS) { - ble_ll_conn_set_csa(connsm, 1); - } else { - ble_ll_conn_set_csa(connsm, rxbuf[0] & BLE_ADV_PDU_HDR_CHSEL_MASK); - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - /* Lets take last used phy */ - ble_ll_conn_init_phy(connsm, ble_hdr->rxinfo.phy); -#endif - if (aux_data) { - ble_ll_scan_aux_data_unref(ble_hdr->rxinfo.user_data); - ble_hdr->rxinfo.user_data = NULL; - } -#endif - ble_ll_conn_created(connsm, NULL); - return; - } - -scan_continue: -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* Drop last reference and keep continue to connect */ - if (aux_data) { - ble_ll_scan_aux_data_unref(ble_hdr->rxinfo.user_data); - ble_hdr->rxinfo.user_data = NULL; - } -#endif - ble_ll_scan_chk_resume(); -} - -/** - * Called when a receive PDU has started and we are in the initiating state. - * - * Context: Interrupt - * - * @param pdu_type - * @param ble_hdr - * - * @return int - * 0: we will not attempt to reply to this frame - * 1: we may send a response to this frame. - */ -int -ble_ll_init_rx_isr_start(uint8_t pdu_type, struct ble_mbuf_hdr *ble_hdr) -{ - struct ble_ll_conn_sm *connsm; - - connsm = g_ble_ll_conn_create_sm; - if (!connsm) { - return 0; - } - - if ((pdu_type == BLE_ADV_PDU_TYPE_ADV_IND) || - (pdu_type == BLE_ADV_PDU_TYPE_ADV_DIRECT_IND || - pdu_type == BLE_ADV_PDU_TYPE_AUX_CONNECT_RSP)) { - return 1; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (pdu_type == BLE_ADV_PDU_TYPE_ADV_EXT_IND && - connsm->scansm->ext_scanning) { - if (connsm->scansm->cur_aux_data) { - STATS_INC(ble_ll_stats, aux_received); - } - - ble_hdr->rxinfo.flags |= BLE_MBUF_HDR_F_EXT_ADV; - return 1; - } -#endif - - return 0; -} - -/** - * Called when a receive PDU has ended and we are in the initiating state. - * - * Context: Interrupt - * - * @param rxpdu - * @param crcok - * @param ble_hdr - * - * @return int - * < 0: Disable the phy after reception. - * == 0: Success. Do not disable the PHY. - * > 0: Do not disable PHY as that has already been done. - */ -int -ble_ll_init_rx_isr_end(uint8_t *rxbuf, uint8_t crcok, - struct ble_mbuf_hdr *ble_hdr) -{ - int rc; - int resolved; - int chk_wl; - int index; - uint8_t pdu_type; - uint8_t adv_addr_type; - uint8_t peer_addr_type; - uint8_t *adv_addr = NULL; - uint8_t *peer; - uint8_t *init_addr = NULL; - uint8_t init_addr_type; - uint8_t pyld_len; - uint8_t inita_is_rpa; - uint8_t conn_req_end_trans; - struct os_mbuf *rxpdu; - struct ble_ll_conn_sm *connsm; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - struct ble_ll_resolv_entry *rl; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - struct ble_ll_scan_sm *scansm; - uint8_t phy; -#endif - int ext_adv_mode = -1; - - /* Get connection state machine to use if connection to be established */ - connsm = g_ble_ll_conn_create_sm; - /* This could happen if connection init was cancelled while isr end was - * already pending - */ - if (!connsm) { - ble_ll_state_set(BLE_LL_STATE_STANDBY); - return -1; - } - - rc = -1; - pdu_type = rxbuf[0] & BLE_ADV_PDU_HDR_TYPE_MASK; - pyld_len = rxbuf[1]; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - scansm = connsm->scansm; - if (scansm->cur_aux_data) { - ble_hdr->rxinfo.user_data = scansm->cur_aux_data; - scansm->cur_aux_data = NULL; - } -#endif - - if (!crcok) { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* Invalid packet - make sure we do not wait for AUX_CONNECT_RSP */ - ble_ll_conn_reset_pending_aux_conn_rsp(); -#endif - - /* Ignore this packet */ - goto init_rx_isr_exit; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* If we sent AUX_CONNECT_REQ, we only expect AUX_CONNECT_RSP here */ - if (CONN_F_AUX_CONN_REQ(connsm)) { - if (pdu_type != BLE_ADV_PDU_TYPE_AUX_CONNECT_RSP) { - STATS_INC(ble_ll_stats, aux_conn_rsp_err); - CONN_F_CONN_REQ_TXD(connsm) = 0; - CONN_F_AUX_CONN_REQ(connsm) = 0; - ble_ll_sched_rmv_elem(&connsm->conn_sch); - } - goto init_rx_isr_exit; - } -#endif - - inita_is_rpa = 0; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (pdu_type == BLE_ADV_PDU_TYPE_ADV_EXT_IND) { - if (!scansm->ext_scanning) { - goto init_rx_isr_exit; - } - - rc = ble_ll_scan_update_aux_data(ble_hdr, rxbuf, NULL); - if (rc < 0) { - /* No memory or broken packet */ - ble_hdr->rxinfo.flags |= BLE_MBUF_HDR_F_AUX_INVALID; - goto init_rx_isr_exit; - } - } -#endif - - /* Lets get addresses from advertising report*/ - if (ble_ll_scan_adv_decode_addr(pdu_type, rxbuf, ble_hdr, - &adv_addr, &adv_addr_type, - &init_addr, &init_addr_type, - &ext_adv_mode)) { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - ble_hdr->rxinfo.flags |= BLE_MBUF_HDR_F_AUX_INVALID; -#endif - goto init_rx_isr_exit; - } - - switch (pdu_type) { - case BLE_ADV_PDU_TYPE_ADV_IND: - break; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - case BLE_ADV_PDU_TYPE_ADV_EXT_IND: - rc = -1; - - /* If this is not connectable adv mode, lets skip it */ - if (!(ext_adv_mode & BLE_LL_EXT_ADV_MODE_CONN)) { - goto init_rx_isr_exit; - } - - if (!adv_addr) { - ble_hdr->rxinfo.flags |= BLE_MBUF_HDR_F_AUX_PTR_WAIT; - goto init_rx_isr_exit; - } - - if (!init_addr) { - break; - } - /* if there is direct address lets fall down and check it.*/ - // no break -#endif - case BLE_ADV_PDU_TYPE_ADV_DIRECT_IND: - inita_is_rpa = (uint8_t)ble_ll_is_rpa(init_addr, init_addr_type); - if (!inita_is_rpa) { - - /* Resolving will be done later. Check if identity InitA matches */ - if (!ble_ll_is_our_devaddr(init_addr, init_addr_type)) { - goto init_rx_isr_exit; - } - } -#if !MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - else { - /* If privacy is off - reject RPA InitA*/ - goto init_rx_isr_exit; - } -#endif - - break; - default: - goto init_rx_isr_exit; - } - - /* Should we send a connect request? */ - index = -1; - peer = adv_addr; - peer_addr_type = adv_addr_type; - - resolved = 0; - chk_wl = ble_ll_scan_whitelist_enabled(); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - if (ble_ll_is_rpa(adv_addr, adv_addr_type) && ble_ll_resolv_enabled()) { - index = ble_hw_resolv_list_match(); - if (index >= 0) { - rl = &g_ble_ll_resolv_list[index]; - - ble_hdr->rxinfo.flags |= BLE_MBUF_HDR_F_RESOLVED; - connsm->rpa_index = index; - peer = rl->rl_identity_addr; - peer_addr_type = rl->rl_addr_type; - resolved = 1; - - /* Assure privacy */ - if ((rl->rl_priv_mode == BLE_HCI_PRIVACY_NETWORK) && init_addr && - !inita_is_rpa && rl->rl_has_local) { - goto init_rx_isr_exit; - } - - /* - * If the InitA is a RPA, we must see if it resolves based on the - * identity address of the resolved ADVA. - */ - if (init_addr && inita_is_rpa) { - if (!ble_ll_resolv_rpa(init_addr, - g_ble_ll_resolv_list[index].rl_local_irk)) { - goto init_rx_isr_exit; - } - - /* Core Specification Vol 6, Part B, Section 6.4: - * "The Link Layer should not set the InitA field to the same - * value as the TargetA field in the received advertising PDU." - * - * We update the received PDU directly here, so ble_ll_init_rx_pkt_in - * can process it as is. - */ - memcpy(init_addr, rl->rl_local_rpa, BLE_DEV_ADDR_LEN); - } - - } else { - if (chk_wl) { - goto init_rx_isr_exit; - } - - /* Could not resolved InitA */ - if (init_addr && inita_is_rpa) { - goto init_rx_isr_exit; - } - } - } else if (init_addr) { - - /* If resolving is off and InitA is RPA we reject advertising */ - if (inita_is_rpa && !ble_ll_resolv_enabled()) { - goto init_rx_isr_exit; - } - - /* Let's see if we have IRK with that peer.*/ - rl = ble_ll_resolv_list_find(adv_addr, adv_addr_type); - - /* Lets make sure privacy mode is correct together with InitA in case it - * is identity address - */ - if (rl && !inita_is_rpa && - (rl->rl_priv_mode == BLE_HCI_PRIVACY_NETWORK) && - rl->rl_has_local) { - goto init_rx_isr_exit; - } - - /* - * If the InitA is a RPA, we must see if it resolves based on the - * identity address of the resolved ADVA. - */ - if (inita_is_rpa) { - if (!rl || !ble_ll_resolv_rpa(init_addr, rl->rl_local_irk)) { - goto init_rx_isr_exit; - } - - /* Core Specification Vol 6, Part B, Section 6.4: - * "The Link Layer should not set the InitA field to the same - * value as the TargetA field in the received advertising PDU." - * - * We update the received PDU directly here, so ble_ll_init_rx_pkt_in - * can process it as is. - */ - memcpy(init_addr, rl->rl_local_rpa, BLE_DEV_ADDR_LEN); - } - } -#endif - - /* Check filter policy */ - if (chk_wl) { - if (!ble_ll_whitelist_match(peer, peer_addr_type, resolved)) { - goto init_rx_isr_exit; - } - } else { - /* Must match the connection address */ - if (!ble_ll_conn_is_peer_adv(adv_addr_type, adv_addr, index)) { - goto init_rx_isr_exit; - } - } - ble_hdr->rxinfo.flags |= BLE_MBUF_HDR_F_DEVMATCH; - - /* For CONNECT_IND we don't go into RX state */ - conn_req_end_trans = BLE_PHY_TRANSITION_NONE; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* Check if we should send AUX_CONNECT_REQ and wait for AUX_CONNECT_RSP */ - if (ble_hdr->rxinfo.channel < BLE_PHY_NUM_DATA_CHANS) { - conn_req_end_trans = BLE_PHY_TRANSITION_TX_RX; - } - - if (connsm->scansm->ext_scanning) { - phy = ble_hdr->rxinfo.phy; - - /* Update connection state machine with appropriate parameters for - * certain PHY - */ - ble_ll_conn_ext_set_params(connsm, - &connsm->initial_params.params[phy - 1], - phy); - - } -#endif - - /* Schedule new connection */ - if (ble_ll_sched_master_new(connsm, ble_hdr, pyld_len)) { - STATS_INC(ble_ll_conn_stats, cant_set_sched); - goto init_rx_isr_exit; - } - - /* Prepare data for connect request */ - ble_ll_conn_connect_ind_prepare(connsm, - ble_ll_scan_get_pdu_data(), - adv_addr_type, adv_addr, - init_addr_type, init_addr, - index, ble_hdr->rxinfo.channel); - - /* Setup to transmit the connect request */ - rc = ble_ll_conn_connect_ind_send(connsm, conn_req_end_trans); - if (rc) { - ble_ll_sched_rmv_elem(&connsm->conn_sch); - goto init_rx_isr_exit; - } - - if (init_addr && !inita_is_rpa) { - connsm->inita_identity_used = 1; - } - - CONN_F_CONN_REQ_TXD(connsm) = 1; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (ble_hdr->rxinfo.channel < BLE_PHY_NUM_DATA_CHANS) { - /* Lets wait for AUX_CONNECT_RSP */ - CONN_F_AUX_CONN_REQ(connsm) = 1; - /* Keep aux data until we get scan response */ - scansm->cur_aux_data = ble_hdr->rxinfo.user_data; - ble_hdr->rxinfo.user_data = NULL; - STATS_INC(ble_ll_stats, aux_conn_req_tx); - } -#endif - - STATS_INC(ble_ll_conn_stats, conn_req_txd); - -init_rx_isr_exit: - - /* - * We have to restart receive if we cant hand up pdu. We return 0 so that - * the phy does not get disabled. - */ - rxpdu = ble_ll_rxpdu_alloc(pyld_len + BLE_LL_PDU_HDR_LEN); - if (rxpdu == NULL) { - /* - * XXX: possible allocate the PDU when we start initiating? - * I cannot say I like this solution, but if we cannot allocate a PDU - * to hand up to the LL, we need to remove the connection we just - * scheduled since the connection state machine will not get processed - * by link layer properly. For now, just remove it from the scheduler - */ - if (CONN_F_CONN_REQ_TXD(connsm) == 1) { - CONN_F_CONN_REQ_TXD(connsm) = 0; - CONN_F_AUX_CONN_REQ(connsm) = 0; - ble_ll_sched_rmv_elem(&connsm->conn_sch); - } - ble_phy_restart_rx(); - rc = 0; - } else { - ble_phy_rxpdu_copy(rxbuf, rxpdu); - ble_ll_rx_pdu_in(rxpdu); - } - - if (rc) { - ble_ll_state_set(BLE_LL_STATE_STANDBY); - } - - return rc; -} - -/** - * Function called when a timeout has occurred for a connection. There are - * two types of timeouts: a connection supervision timeout and control - * procedure timeout. - * - * Context: Link Layer task - * - * @param connsm - * @param ble_err - */ -void -ble_ll_conn_timeout(struct ble_ll_conn_sm *connsm, uint8_t ble_err) -{ - int was_current; - os_sr_t sr; - - was_current = 0; - OS_ENTER_CRITICAL(sr); - if (g_ble_ll_conn_cur_sm == connsm) { - ble_ll_conn_current_sm_over(NULL); - was_current = 1; - } - OS_EXIT_CRITICAL(sr); - - /* Check if we need to resume scanning */ - if (was_current) { - ble_ll_scan_chk_resume(); - } - - ble_ll_conn_end(connsm, ble_err); -} - -/** - * Called when a data channel PDU has started that matches the access - * address of the current connection. Note that the CRC of the PDU has not - * been checked yet. - * - * Context: Interrupt - * - * @param rxhdr - */ -int -ble_ll_conn_rx_isr_start(struct ble_mbuf_hdr *rxhdr, uint32_t aa) -{ - struct ble_ll_conn_sm *connsm; - - /* - * Disable wait for response timer since we receive a response. We dont - * care if this is the response we were waiting for or not; the code - * called at receive end will deal with ending the connection event - * if needed - */ - connsm = g_ble_ll_conn_cur_sm; - if (connsm) { - /* Double check access address. Better match connection state machine */ - if (aa != connsm->access_addr) { - STATS_INC(ble_ll_conn_stats, rx_data_pdu_bad_aa); - ble_ll_state_set(BLE_LL_STATE_STANDBY); - ble_ll_event_send(&connsm->conn_ev_end); - g_ble_ll_conn_cur_sm = NULL; - return -1; - } - - /* Set connection handle in mbuf header */ - rxhdr->rxinfo.handle = connsm->conn_handle; - - /* Set flag denoting we have received a packet in connection event */ - connsm->csmflags.cfbit.pkt_rxd = 1; - - /* Connection is established */ - connsm->conn_state = BLE_LL_CONN_STATE_ESTABLISHED; - - /* Set anchor point (and last) if 1st rxd frame in connection event */ - if (connsm->csmflags.cfbit.slave_set_last_anchor) { - connsm->csmflags.cfbit.slave_set_last_anchor = 0; - connsm->last_anchor_point = rxhdr->beg_cputime; - connsm->anchor_point = connsm->last_anchor_point; - connsm->anchor_point_usecs = rxhdr->rem_usecs; - } - } - return 1; -} - -/** - * Called from the Link Layer task when a data PDU has been received - * - * Context: Link layer task - * - * @param rxpdu Pointer to received pdu - * @param rxpdu Pointer to ble mbuf header of received pdu - */ -void -ble_ll_conn_rx_data_pdu(struct os_mbuf *rxpdu, struct ble_mbuf_hdr *hdr) -{ - uint8_t hdr_byte; - uint8_t rxd_sn; - uint8_t *rxbuf; - uint8_t llid; - uint16_t acl_len; - uint16_t acl_hdr; - struct ble_ll_conn_sm *connsm; - - if (BLE_MBUF_HDR_CRC_OK(hdr)) { - /* XXX: there is a chance that the connection was thrown away and - re-used before processing packets here. Fix this. */ - /* We better have a connection state machine */ - connsm = ble_ll_conn_find_active_conn(hdr->rxinfo.handle); - if (connsm) { - /* Check state machine */ - ble_ll_conn_chk_csm_flags(connsm); - - /* Validate rx data pdu */ - rxbuf = rxpdu->om_data; - hdr_byte = rxbuf[0]; - acl_len = rxbuf[1]; - llid = hdr_byte & BLE_LL_DATA_HDR_LLID_MASK; - - /* - * Check that the LLID and payload length are reasonable. - * Empty payload is only allowed for LLID == 01b. - * */ - if ((llid == 0) || - ((acl_len == 0) && (llid != BLE_LL_LLID_DATA_FRAG))) { - STATS_INC(ble_ll_conn_stats, rx_bad_llid); - goto conn_rx_data_pdu_end; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - /* Check if PDU is allowed when encryption is started. If not, - * terminate connection. - * - * Reference: Core 5.0, Vol 6, Part B, 5.1.3.1 - */ - if ((connsm->enc_data.enc_state > CONN_ENC_S_PAUSE_ENC_RSP_WAIT) && - !ble_ll_ctrl_enc_allowed_pdu_rx(rxpdu)) { - ble_ll_conn_timeout(connsm, BLE_ERR_CONN_TERM_MIC); - goto conn_rx_data_pdu_end; - } -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING) - /* - * Reset authenticated payload timeout if valid MIC. NOTE: we dont - * check the MIC failure bit as that would have terminated the - * connection - */ - if ((connsm->enc_data.enc_state == CONN_ENC_S_ENCRYPTED) && - CONN_F_LE_PING_SUPP(connsm) && (acl_len != 0)) { - ble_ll_conn_auth_pyld_timer_start(connsm); - } -#endif - - /* Update RSSI */ - connsm->conn_rssi = hdr->rxinfo.rssi; - - /* - * If we are a slave, we can only start to use slave latency - * once we have received a NESN of 1 from the master - */ - if (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) { - if (hdr_byte & BLE_LL_DATA_HDR_NESN_MASK) { - connsm->csmflags.cfbit.allow_slave_latency = 1; - } - } - - /* - * Discard the received PDU if the sequence number is the same - * as the last received sequence number - */ - rxd_sn = hdr_byte & BLE_LL_DATA_HDR_SN_MASK; - if (rxd_sn != connsm->last_rxd_sn) { - /* Update last rxd sn */ - connsm->last_rxd_sn = rxd_sn; - - /* No need to do anything if empty pdu */ - if ((llid == BLE_LL_LLID_DATA_FRAG) && (acl_len == 0)) { - goto conn_rx_data_pdu_end; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - /* - * XXX: should we check to see if we are in a state where we - * might expect to get an encrypted PDU? - */ - if (BLE_MBUF_HDR_MIC_FAILURE(hdr)) { - STATS_INC(ble_ll_conn_stats, mic_failures); - ble_ll_conn_timeout(connsm, BLE_ERR_CONN_TERM_MIC); - goto conn_rx_data_pdu_end; - } -#endif - - if (llid == BLE_LL_LLID_CTRL) { - /* Process control frame */ - STATS_INC(ble_ll_conn_stats, rx_ctrl_pdus); - if (ble_ll_ctrl_rx_pdu(connsm, rxpdu)) { - STATS_INC(ble_ll_conn_stats, rx_malformed_ctrl_pdus); - } - } else { - /* Count # of received l2cap frames and byes */ - STATS_INC(ble_ll_conn_stats, rx_l2cap_pdus); - STATS_INCN(ble_ll_conn_stats, rx_l2cap_bytes, acl_len); - - /* NOTE: there should be at least two bytes available */ - BLE_LL_ASSERT(OS_MBUF_LEADINGSPACE(rxpdu) >= 2); - os_mbuf_prepend(rxpdu, 2); - rxbuf = rxpdu->om_data; - - acl_hdr = (llid << 12) | connsm->conn_handle; - put_le16(rxbuf, acl_hdr); - put_le16(rxbuf + 2, acl_len); - ble_hci_trans_ll_acl_tx(rxpdu); - } - - /* NOTE: we dont free the mbuf since we handed it off! */ - return; - } else { - STATS_INC(ble_ll_conn_stats, data_pdu_rx_dup); - } - } else { - STATS_INC(ble_ll_conn_stats, no_conn_sm); - } - } - - /* Free buffer */ -conn_rx_data_pdu_end: - os_mbuf_free_chain(rxpdu); -} - -/** - * Called when a packet has been received while in the connection state. - * - * Context: Interrupt - * - * @param rxpdu - * @param crcok - * - * @return int - * < 0: Disable the phy after reception. - * == 0: Success. Do not disable the PHY. - * > 0: Do not disable PHY as that has already been done. - */ -int -ble_ll_conn_rx_isr_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr) -{ - int rc; - int is_ctrl; - uint8_t hdr_byte; - uint8_t hdr_sn; - uint8_t hdr_nesn; - uint8_t conn_sn; - uint8_t conn_nesn; - uint8_t reply; - uint8_t rem_bytes; - uint8_t opcode = 0; - uint8_t rx_pyld_len; - uint32_t begtime; - uint32_t add_usecs; - struct os_mbuf *txpdu; - struct ble_ll_conn_sm *connsm; - struct os_mbuf *rxpdu; - struct ble_mbuf_hdr *txhdr; - int rx_phy_mode; - - /* Retrieve the header and payload length */ - hdr_byte = rxbuf[0]; - rx_pyld_len = rxbuf[1]; - - /* - * We need to attempt to allocate a buffer here. The reason we do this - * now is that we should not ack the packet if we have no receive - * buffers available. We want to free up our transmit PDU if it was - * acked, but we should not ack the received frame if we cant hand it up. - * NOTE: we hand up empty pdu's to the LL task! - */ - rxpdu = ble_ll_rxpdu_alloc(rx_pyld_len + BLE_LL_PDU_HDR_LEN); - - /* - * We should have a current connection state machine. If we dont, we just - * hand the packet to the higher layer to count it. - */ - rc = -1; - connsm = g_ble_ll_conn_cur_sm; - if (!connsm) { - STATS_INC(ble_ll_conn_stats, rx_data_pdu_no_conn); - goto conn_exit; - } - - /* - * Calculate the end time of the received PDU. NOTE: this looks strange - * but for the 32768 crystal we add the time it takes to send the packet - * to the 'additional usecs' field to save some calculations. - */ - begtime = rxhdr->beg_cputime; -#if BLE_LL_BT5_PHY_SUPPORTED - rx_phy_mode = connsm->phy_data.rx_phy_mode; -#else - rx_phy_mode = BLE_PHY_MODE_1M; -#endif - add_usecs = rxhdr->rem_usecs + - ble_ll_pdu_tx_time_get(rx_pyld_len, rx_phy_mode); - - /* - * Check the packet CRC. A connection event can continue even if the - * received PDU does not pass the CRC check. If we receive two consecutive - * CRC errors we end the conection event. - */ - if (!BLE_MBUF_HDR_CRC_OK(rxhdr)) { - /* - * Increment # of consecutively received CRC errors. If more than - * one we will end the connection event. - */ - ++connsm->cons_rxd_bad_crc; - if (connsm->cons_rxd_bad_crc >= 2) { - reply = 0; - } else { - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - reply = CONN_F_LAST_TXD_MD(connsm); - } else { - /* A slave always responds with a packet */ - reply = 1; - } - } - } else { - /* Reset consecutively received bad crcs (since this one was good!) */ - connsm->cons_rxd_bad_crc = 0; - - /* Set last valid received pdu time (resets supervision timer) */ - connsm->last_rxd_pdu_cputime = begtime + - os_cputime_usecs_to_ticks(add_usecs); - - /* - * Check for valid LLID before proceeding. We have seen some weird - * things with the PHY where the CRC is OK but we dont have a valid - * LLID. This should really never happen but if it does we will just - * bail. An error stat will get incremented at the LL. - */ - if ((hdr_byte & BLE_LL_DATA_HDR_LLID_MASK) == 0) { - goto conn_exit; - } - - /* Set last received header byte */ - connsm->last_rxd_hdr_byte = hdr_byte; - - is_ctrl = 0; - if ((hdr_byte & BLE_LL_DATA_HDR_LLID_MASK) == BLE_LL_LLID_CTRL) { - is_ctrl = 1; - opcode = rxbuf[2]; - } - - /* - * If SN bit from header does not match NESN in connection, this is - * a resent PDU and should be ignored. - */ - hdr_sn = hdr_byte & BLE_LL_DATA_HDR_SN_MASK; - conn_nesn = connsm->next_exp_seqnum; - if (rxpdu && ((hdr_sn && conn_nesn) || (!hdr_sn && !conn_nesn))) { - connsm->next_exp_seqnum ^= 1; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (CONN_F_ENCRYPTED(connsm) && !ble_ll_conn_is_empty_pdu(rxbuf)) { - ++connsm->enc_data.rx_pkt_cntr; - } -#endif - } - - ble_ll_trace_u32x2(BLE_LL_TRACE_ID_CONN_RX, connsm->tx_seqnum, - !!(hdr_byte & BLE_LL_DATA_HDR_NESN_MASK)); - - /* - * Check NESN bit from header. If same as tx seq num, the transmission - * is acknowledged. Otherwise we need to resend this PDU. - */ - if (CONN_F_EMPTY_PDU_TXD(connsm) || connsm->cur_tx_pdu) { - hdr_nesn = hdr_byte & BLE_LL_DATA_HDR_NESN_MASK; - conn_sn = connsm->tx_seqnum; - if ((hdr_nesn && conn_sn) || (!hdr_nesn && !conn_sn)) { - /* We did not get an ACK. Must retry the PDU */ - STATS_INC(ble_ll_conn_stats, data_pdu_txf); - } else { - /* Transmit success */ - connsm->tx_seqnum ^= 1; - STATS_INC(ble_ll_conn_stats, data_pdu_txg); - - /* If we transmitted the empty pdu, clear flag */ - if (CONN_F_EMPTY_PDU_TXD(connsm)) { - CONN_F_EMPTY_PDU_TXD(connsm) = 0; - goto chk_rx_terminate_ind; - } - - /* - * Determine if we should remove packet from queue or if there - * are more fragments to send. - */ - txpdu = connsm->cur_tx_pdu; - if (txpdu) { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (connsm->enc_data.tx_encrypted) { - ++connsm->enc_data.tx_pkt_cntr; - } -#endif - txhdr = BLE_MBUF_HDR_PTR(txpdu); - if ((txhdr->txinfo.hdr_byte & BLE_LL_DATA_HDR_LLID_MASK) - == BLE_LL_LLID_CTRL) { - connsm->cur_tx_pdu = NULL; - /* Note: the mbuf is freed by this call */ - rc = ble_ll_ctrl_tx_done(txpdu, connsm); - if (rc) { - /* Means we transmitted a TERMINATE_IND */ - goto conn_exit; - } else { - goto chk_rx_terminate_ind; - } - } - - /* Increment offset based on number of bytes sent */ - txhdr->txinfo.offset += txhdr->txinfo.pyld_len; - if (txhdr->txinfo.offset >= OS_MBUF_PKTLEN(txpdu)) { - /* If l2cap pdu, increment # of completed packets */ - if (txhdr->txinfo.pyld_len != 0) { -#if (BLETEST_THROUGHPUT_TEST == 1) - bletest_completed_pkt(connsm->conn_handle); -#endif - ++connsm->completed_pkts; - if (connsm->completed_pkts > 2) { - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, - &g_ble_ll_data.ll_comp_pkt_ev); - } - } - os_mbuf_free_chain(txpdu); - connsm->cur_tx_pdu = NULL; - } else { - rem_bytes = OS_MBUF_PKTLEN(txpdu) - txhdr->txinfo.offset; - /* Adjust payload for max TX time and octets */ - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - if (is_ctrl && - (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) && - (opcode == BLE_LL_CTRL_PHY_UPDATE_IND)) { - connsm->phy_tx_transition = - ble_ll_ctrl_phy_tx_transition_get(rxbuf[3]); - } -#endif - - rem_bytes = ble_ll_conn_adjust_pyld_len(connsm, rem_bytes); - txhdr->txinfo.pyld_len = rem_bytes; - } - } - } - } - - /* Should we continue connection event? */ - /* If this is a TERMINATE_IND, we have to reply */ -chk_rx_terminate_ind: - /* If we received a terminate IND, we must set some flags */ - if (is_ctrl && (opcode == BLE_LL_CTRL_TERMINATE_IND) - && (rx_pyld_len == (1 + BLE_LL_CTRL_TERMINATE_IND_LEN))) { - connsm->csmflags.cfbit.terminate_ind_rxd = 1; - connsm->rxd_disconnect_reason = rxbuf[3]; - } - - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - reply = CONN_F_LAST_TXD_MD(connsm) || (hdr_byte & BLE_LL_DATA_HDR_MD_MASK); - } else { - /* A slave always replies */ - reply = 1; - } - } - - /* If reply flag set, send data pdu and continue connection event */ - rc = -1; - if (rx_pyld_len && CONN_F_ENCRYPTED(connsm)) { - rx_pyld_len += BLE_LL_DATA_MIC_LEN; - } - if (reply && ble_ll_conn_can_send_next_pdu(connsm, begtime, add_usecs)) { - rc = ble_ll_conn_tx_pdu(connsm); - } - -conn_exit: - /* Copy the received pdu and hand it up */ - if (rxpdu) { - ble_phy_rxpdu_copy(rxbuf, rxpdu); - ble_ll_rx_pdu_in(rxpdu); - } - - /* Send link layer a connection end event if over */ - if (rc) { - ble_ll_conn_current_sm_over(connsm); - } - - return rc; -} - -/** - * Called to adjust payload length to fit into max effective octets and TX time - * on current PHY. - */ -/** - * Called to enqueue a packet on the transmit queue of a connection. Should - * only be called by the controller. - * - * Context: Link Layer - * - * - * @param connsm - * @param om - */ -void -ble_ll_conn_enqueue_pkt(struct ble_ll_conn_sm *connsm, struct os_mbuf *om, - uint8_t hdr_byte, uint8_t length) -{ - os_sr_t sr; - struct os_mbuf_pkthdr *pkthdr; - struct ble_mbuf_hdr *ble_hdr; - int lifo; - - /* Set mbuf length and packet length if a control PDU */ - if (hdr_byte == BLE_LL_LLID_CTRL) { - om->om_len = length; - OS_MBUF_PKTHDR(om)->omp_len = length; - } - - /* Set BLE transmit header */ - ble_hdr = BLE_MBUF_HDR_PTR(om); - ble_hdr->txinfo.flags = 0; - ble_hdr->txinfo.offset = 0; - ble_hdr->txinfo.hdr_byte = hdr_byte; - - /* - * Initial payload length is calculate when packet is dequeued, there's no - * need to do this now. - */ - - lifo = 0; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (connsm->enc_data.enc_state > CONN_ENC_S_ENCRYPTED) { - uint8_t llid; - - /* - * If this is one of the following types we need to insert it at - * head of queue. - */ - llid = ble_hdr->txinfo.hdr_byte & BLE_LL_DATA_HDR_LLID_MASK; - if (llid == BLE_LL_LLID_CTRL) { - switch (om->om_data[0]) { - case BLE_LL_CTRL_TERMINATE_IND: - case BLE_LL_CTRL_REJECT_IND: - case BLE_LL_CTRL_REJECT_IND_EXT: - case BLE_LL_CTRL_START_ENC_REQ: - case BLE_LL_CTRL_START_ENC_RSP: - lifo = 1; - break; - case BLE_LL_CTRL_PAUSE_ENC_RSP: - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - lifo = 1; - } - break; - case BLE_LL_CTRL_ENC_REQ: - case BLE_LL_CTRL_ENC_RSP: - /* If encryption has been paused, we don't want to send any packets from the - * TX queue, as they would go unencrypted. - */ - if (connsm->enc_data.enc_state == CONN_ENC_S_PAUSED) { - lifo = 1; - } - break; - default: - break; - } - } - } -#endif - - /* Add to transmit queue for the connection */ - pkthdr = OS_MBUF_PKTHDR(om); - OS_ENTER_CRITICAL(sr); - if (lifo) { - STAILQ_INSERT_HEAD(&connsm->conn_txq, pkthdr, omp_next); - } else { - STAILQ_INSERT_TAIL(&connsm->conn_txq, pkthdr, omp_next); - } - OS_EXIT_CRITICAL(sr); -} - -/** - * Data packet from host. - * - * Context: Link Layer task - * - * @param om - * @param handle - * @param length - * - * @return int - */ -void -ble_ll_conn_tx_pkt_in(struct os_mbuf *om, uint16_t handle, uint16_t length) -{ - uint8_t hdr_byte; - uint16_t conn_handle; - uint16_t pb; - struct ble_ll_conn_sm *connsm; - - /* See if we have an active matching connection handle */ - conn_handle = handle & 0x0FFF; - connsm = ble_ll_conn_find_active_conn(conn_handle); - if (connsm) { - /* Construct LL header in buffer (NOTE: pb already checked) */ - pb = handle & 0x3000; - if (pb == 0) { - hdr_byte = BLE_LL_LLID_DATA_START; - } else { - hdr_byte = BLE_LL_LLID_DATA_FRAG; - } - - /* Add to total l2cap pdus enqueue */ - STATS_INC(ble_ll_conn_stats, l2cap_enqueued); - - /* Clear flags field in BLE header */ - ble_ll_conn_enqueue_pkt(connsm, om, hdr_byte, length); - } else { - /* No connection found! */ - STATS_INC(ble_ll_conn_stats, handle_not_found); - os_mbuf_free_chain(om); - } -} - -/** - * Called to set the global channel mask that we use for all connections. - * - * @param num_used_chans - * @param chanmap - */ -void -ble_ll_conn_set_global_chanmap(uint8_t num_used_chans, const uint8_t *chanmap) -{ - struct ble_ll_conn_sm *connsm; - struct ble_ll_conn_global_params *conn_params; - - /* Do nothing if same channel map */ - conn_params = &g_ble_ll_conn_params; - if (!memcmp(conn_params->master_chan_map, chanmap, BLE_LL_CONN_CHMAP_LEN)) { - return; - } - - /* Change channel map and cause channel map update procedure to start */ - conn_params->num_used_chans = num_used_chans; - memcpy(conn_params->master_chan_map, chanmap, BLE_LL_CONN_CHMAP_LEN); - - /* Perform channel map update */ - SLIST_FOREACH(connsm, &g_ble_ll_conn_active_list, act_sle) { - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_CHAN_MAP_UPD); - } - } -} - -/** - * Called when a device has received a connect request while advertising and - * the connect request has passed the advertising filter policy and is for - * us. This will start a connection in the slave role assuming that we dont - * already have a connection with this device and that the connect request - * parameters are valid. - * - * Context: Link Layer - * - * @param rxbuf Pointer to received Connect Request PDU - * - * @return 0: connection not started; 1 connecton started - */ -int -ble_ll_conn_slave_start(uint8_t *rxbuf, uint8_t pat, struct ble_mbuf_hdr *rxhdr, - bool force_csa2) -{ - int rc; - uint32_t temp; - uint32_t crcinit; - uint8_t *inita; - uint8_t *dptr; - struct ble_ll_conn_sm *connsm; - - /* Ignore the connection request if we are already connected*/ - inita = rxbuf + BLE_LL_PDU_HDR_LEN; - SLIST_FOREACH(connsm, &g_ble_ll_conn_active_list, act_sle) { - if (!memcmp(&connsm->peer_addr, inita, BLE_DEV_ADDR_LEN)) { - if (rxbuf[0] & BLE_ADV_PDU_HDR_TXADD_MASK) { - if (connsm->peer_addr_type & 1) { - return 0; - } - } else { - if ((connsm->peer_addr_type & 1) == 0) { - return 0; - } - } - } - } - - /* Allocate a connection. If none available, dont do anything */ - connsm = ble_ll_conn_sm_get(); - if (connsm == NULL) { - return 0; - } - - /* Set the pointer at the start of the connection data */ - dptr = rxbuf + BLE_LL_CONN_REQ_ADVA_OFF + BLE_DEV_ADDR_LEN; - - /* Set connection state machine information */ - connsm->access_addr = get_le32(dptr); - crcinit = dptr[6]; - crcinit = (crcinit << 8) | dptr[5]; - crcinit = (crcinit << 8) | dptr[4]; - connsm->crcinit = crcinit; - connsm->tx_win_size = dptr[7]; - connsm->tx_win_off = get_le16(dptr + 8); - connsm->conn_itvl = get_le16(dptr + 10); - connsm->slave_latency = get_le16(dptr + 12); - connsm->supervision_tmo = get_le16(dptr + 14); - memcpy(&connsm->chanmap, dptr + 16, BLE_LL_CONN_CHMAP_LEN); - connsm->hop_inc = dptr[21] & 0x1F; - connsm->master_sca = dptr[21] >> 5; - - /* Error check parameters */ - if ((connsm->tx_win_off > connsm->conn_itvl) || - (connsm->conn_itvl < BLE_HCI_CONN_ITVL_MIN) || - (connsm->conn_itvl > BLE_HCI_CONN_ITVL_MAX) || - (connsm->tx_win_size < BLE_LL_CONN_TX_WIN_MIN) || - (connsm->slave_latency > BLE_LL_CONN_SLAVE_LATENCY_MAX)) { - goto err_slave_start; - } - - /* Slave latency cannot cause a supervision timeout */ - temp = (connsm->slave_latency + 1) * (connsm->conn_itvl * 2) * - BLE_LL_CONN_ITVL_USECS; - if ((connsm->supervision_tmo * 10000) <= temp ) { - goto err_slave_start; - } - - /* - * The transmit window must be less than or equal to the lesser of 10 - * msecs or the connection interval minus 1.25 msecs. - */ - temp = connsm->conn_itvl - 1; - if (temp > 8) { - temp = 8; - } - if (connsm->tx_win_size > temp) { - goto err_slave_start; - } - - /* Set the address of device that we are connecting with */ - memcpy(&connsm->peer_addr, inita, BLE_DEV_ADDR_LEN); - connsm->peer_addr_type = pat; - - /* Calculate number of used channels; make sure it meets min requirement */ - connsm->num_used_chans = ble_ll_utils_calc_num_used_chans(connsm->chanmap); - if (connsm->num_used_chans < 2) { - goto err_slave_start; - } - - /* Start the connection state machine */ - connsm->conn_role = BLE_LL_CONN_ROLE_SLAVE; - ble_ll_conn_sm_new(connsm); - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - /* Use the same PHY as we received CONNECT_REQ on */ - ble_ll_conn_init_phy(connsm, rxhdr->rxinfo.phy); -#endif - - ble_ll_conn_set_csa(connsm, - force_csa2 || (rxbuf[0] & BLE_ADV_PDU_HDR_CHSEL_MASK)); - - /* Set initial schedule callback */ - connsm->conn_sch.sched_cb = ble_ll_conn_event_start_cb; - rc = ble_ll_conn_created(connsm, rxhdr); - if (!rc) { - SLIST_REMOVE(&g_ble_ll_conn_active_list, connsm, ble_ll_conn_sm, act_sle); - STAILQ_INSERT_TAIL(&g_ble_ll_conn_free_list, connsm, free_stqe); - } - return rc; - -err_slave_start: - STAILQ_INSERT_TAIL(&g_ble_ll_conn_free_list, connsm, free_stqe); - STATS_INC(ble_ll_conn_stats, slave_rxd_bad_conn_req_params); - return 0; -} - -#define MAX_TIME_UNCODED(_maxbytes) \ - ble_ll_pdu_tx_time_get(_maxbytes + BLE_LL_DATA_MIC_LEN, \ - BLE_PHY_MODE_1M); -#define MAX_TIME_CODED(_maxbytes) \ - ble_ll_pdu_tx_time_get(_maxbytes + BLE_LL_DATA_MIC_LEN, \ - BLE_PHY_MODE_CODED_125KBPS); - -/** - * Called to reset the connection module. When this function is called the - * scheduler has been stopped and the phy has been disabled. The LL should - * be in the standby state. - * - * Context: Link Layer task - */ -void -ble_ll_conn_module_reset(void) -{ - uint8_t max_phy_pyld; - uint16_t maxbytes; - struct ble_ll_conn_sm *connsm; - struct ble_ll_conn_global_params *conn_params; - - /* Kill the current one first (if one is running) */ - if (g_ble_ll_conn_cur_sm) { - connsm = g_ble_ll_conn_cur_sm; - g_ble_ll_conn_cur_sm = NULL; - ble_ll_conn_end(connsm, BLE_ERR_SUCCESS); - } - - /* Free the global connection complete event if there is one */ - if (g_ble_ll_conn_comp_ev) { - ble_hci_trans_buf_free(g_ble_ll_conn_comp_ev); - g_ble_ll_conn_comp_ev = NULL; - } - - /* Reset connection we are attempting to create */ - g_ble_ll_conn_create_sm = NULL; - - /* Now go through and end all the connections */ - while (1) { - connsm = SLIST_FIRST(&g_ble_ll_conn_active_list); - if (!connsm) { - break; - } - ble_ll_conn_end(connsm, BLE_ERR_SUCCESS); - } - - /* Get the maximum supported PHY PDU size from the PHY */ - max_phy_pyld = ble_phy_max_data_pdu_pyld(); - - /* Configure the global LL parameters */ - conn_params = &g_ble_ll_conn_params; - - maxbytes = min(MYNEWT_VAL(BLE_LL_SUPP_MAX_RX_BYTES), max_phy_pyld); - conn_params->supp_max_rx_octets = maxbytes; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - conn_params->supp_max_rx_time = MAX_TIME_CODED(maxbytes); -#else - conn_params->supp_max_rx_time = MAX_TIME_UNCODED(maxbytes); -#endif - - maxbytes = min(MYNEWT_VAL(BLE_LL_SUPP_MAX_TX_BYTES), max_phy_pyld); - conn_params->supp_max_tx_octets = maxbytes; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - conn_params->supp_max_tx_time = MAX_TIME_CODED(maxbytes); -#else - conn_params->supp_max_tx_time = MAX_TIME_UNCODED(maxbytes); -#endif - - maxbytes = min(MYNEWT_VAL(BLE_LL_CONN_INIT_MAX_TX_BYTES), max_phy_pyld); - conn_params->conn_init_max_tx_octets = maxbytes; - conn_params->conn_init_max_tx_time = MAX_TIME_UNCODED(maxbytes); - conn_params->conn_init_max_tx_time_uncoded = MAX_TIME_UNCODED(maxbytes); - conn_params->conn_init_max_tx_time_coded = MAX_TIME_CODED(maxbytes); - - conn_params->sugg_tx_octets = BLE_LL_CONN_SUPP_BYTES_MIN; - conn_params->sugg_tx_time = BLE_LL_CONN_SUPP_TIME_MIN; - - /* Mask in all channels by default */ - conn_params->num_used_chans = BLE_PHY_NUM_DATA_CHANS; - memset(conn_params->master_chan_map, 0xff, BLE_LL_CONN_CHMAP_LEN - 1); - conn_params->master_chan_map[4] = 0x1f; - - /* Reset statistics */ - STATS_RESET(ble_ll_conn_stats); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - /* reset default sync transfer params */ - g_ble_ll_conn_sync_transfer_params.max_skip = 0; - g_ble_ll_conn_sync_transfer_params.mode = 0; - g_ble_ll_conn_sync_transfer_params.sync_timeout_us = 0; -#endif -} - -/* Initialize the connection module */ -void -ble_ll_conn_module_init(void) -{ - int rc; - uint16_t i; - struct ble_ll_conn_sm *connsm; - - /* Initialize list of active conections */ - SLIST_INIT(&g_ble_ll_conn_active_list); - STAILQ_INIT(&g_ble_ll_conn_free_list); - - /* - * Take all the connections off the free memory pool and add them to - * the free connection list, assigning handles in linear order. Note: - * the specification allows a handle of zero; we just avoid using it. - */ - connsm = &g_ble_ll_conn_sm[0]; - for (i = 0; i < MYNEWT_VAL(BLE_MAX_CONNECTIONS); ++i) { - - memset(connsm, 0, sizeof(struct ble_ll_conn_sm)); - connsm->conn_handle = i + 1; - STAILQ_INSERT_TAIL(&g_ble_ll_conn_free_list, connsm, free_stqe); - - /* Initialize fixed schedule elements */ - connsm->conn_sch.sched_type = BLE_LL_SCHED_TYPE_CONN; - connsm->conn_sch.cb_arg = connsm; - ++connsm; - } - - /* Register connection statistics */ - rc = stats_init_and_reg(STATS_HDR(ble_ll_conn_stats), - STATS_SIZE_INIT_PARMS(ble_ll_conn_stats, STATS_SIZE_32), - STATS_NAME_INIT_PARMS(ble_ll_conn_stats), - "ble_ll_conn"); - BLE_LL_ASSERT(rc == 0); - - /* Call reset to finish reset of initialization */ - ble_ll_conn_module_reset(); -} - -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_conn_hci.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_conn_hci.c deleted file mode 100644 index 19ceebf50..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_conn_hci.c +++ /dev/null @@ -1,1898 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/include/nimble/hci_common.h" -#include "nimble/nimble/include/nimble/ble_hci_trans.h" -#include "../include/controller/ble_ll.h" -#include "../include/controller/ble_ll_utils.h" -#include "../include/controller/ble_ll_hci.h" -#include "../include/controller/ble_ll_conn.h" -#include "../include/controller/ble_ll_ctrl.h" -#include "../include/controller/ble_ll_scan.h" -#include "../include/controller/ble_ll_adv.h" -#include "ble_ll_conn_priv.h" - -/* - * Used to limit the rate at which we send the number of completed packets - * event to the host. This is the os time at which we can send an event. - */ -static ble_npl_time_t g_ble_ll_last_num_comp_pkt_evt; -extern uint8_t *g_ble_ll_conn_comp_ev; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static const uint8_t ble_ll_valid_conn_phy_mask = (BLE_HCI_LE_PHY_1M_PREF_MASK -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) - | BLE_HCI_LE_PHY_2M_PREF_MASK -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - | BLE_HCI_LE_PHY_CODED_PREF_MASK -#endif - ); -static const uint8_t ble_ll_conn_required_phy_mask = (BLE_HCI_LE_PHY_1M_PREF_MASK -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - | BLE_HCI_LE_PHY_CODED_PREF_MASK -#endif - ); -#endif - -/** - * Allocate an event to send a connection complete event when initiating - * - * @return int 0: success -1: failure - */ -static int -ble_ll_init_alloc_conn_comp_ev(void) -{ - int rc; - uint8_t *evbuf; - - rc = 0; - evbuf = g_ble_ll_conn_comp_ev; - if (evbuf == NULL) { - evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (!evbuf) { - rc = -1; - } else { - g_ble_ll_conn_comp_ev = evbuf; - } - } - - return rc; -} - -/** - * Called to check that the connection parameters are within range - * - * @param itvl_min - * @param itvl_max - * @param latency - * @param spvn_tmo - * - * @return int BLE_ERR_INV_HCI_CMD_PARMS if invalid parameters, 0 otherwise - */ -int -ble_ll_conn_hci_chk_conn_params(uint16_t itvl_min, uint16_t itvl_max, - uint16_t latency, uint16_t spvn_tmo) -{ - uint32_t spvn_tmo_usecs; - uint32_t min_spvn_tmo_usecs; - - if ((itvl_min > itvl_max) || - (itvl_min < BLE_HCI_CONN_ITVL_MIN) || - (itvl_max > BLE_HCI_CONN_ITVL_MAX) || - (latency > BLE_HCI_CONN_LATENCY_MAX) || - (spvn_tmo < BLE_HCI_CONN_SPVN_TIMEOUT_MIN) || - (spvn_tmo > BLE_HCI_CONN_SPVN_TIMEOUT_MAX)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* - * Supervision timeout (in msecs) must be more than: - * (1 + connLatency) * connIntervalMax * 1.25 msecs * 2. - */ - spvn_tmo_usecs = spvn_tmo; - spvn_tmo_usecs *= (BLE_HCI_CONN_SPVN_TMO_UNITS * 1000); - min_spvn_tmo_usecs = (uint32_t)itvl_max * 2 * BLE_LL_CONN_ITVL_USECS; - min_spvn_tmo_usecs *= (1 + latency); - if (spvn_tmo_usecs <= min_spvn_tmo_usecs) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - return BLE_ERR_SUCCESS; -} - -/** - * Send a connection complete event - * - * @param status The BLE error code associated with the event - */ -void -ble_ll_conn_comp_event_send(struct ble_ll_conn_sm *connsm, uint8_t status, - uint8_t *evbuf, struct ble_ll_adv_sm *advsm) -{ - struct ble_hci_ev_le_subev_enh_conn_complete *enh_ev; - struct ble_hci_ev_le_subev_conn_complete *ev; - struct ble_hci_ev *hci_ev = (void *) evbuf; - uint8_t *rpa; - - BLE_LL_ASSERT(evbuf); - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_ENH_CONN_COMPLETE)) { - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*enh_ev); - enh_ev = (void *) hci_ev->data; - - memset(enh_ev, 0, sizeof(*enh_ev)); - - enh_ev->subev_code = BLE_HCI_LE_SUBEV_ENH_CONN_COMPLETE; - enh_ev->status = status; - - if (connsm) { - enh_ev->conn_handle = htole16(connsm->conn_handle); - enh_ev->role = connsm->conn_role - 1; - enh_ev->peer_addr_type = connsm->peer_addr_type; - memcpy(enh_ev->peer_addr, connsm->peer_addr, BLE_DEV_ADDR_LEN); - - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - if (connsm->inita_identity_used) { - /* We used identity address in CONNECT_IND which can be just - * fine if - * a) it was direct advertising we replied to and remote uses - * its identity address in device privacy mode or IRK is all - * zeros. - * b) peer uses RPA and this is first time we connect to him - */ - rpa = NULL; - } else if (connsm->own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) { - rpa = ble_ll_scan_get_local_rpa(); - } else { - rpa = NULL; - } - } else { - rpa = ble_ll_adv_get_local_rpa(advsm); - } - - if (rpa) { - memcpy(enh_ev->local_rpa, rpa, BLE_DEV_ADDR_LEN); - } - - /* We need to adjust peer type if device connected using RPA - * and was resolved since RPA needs to be added to HCI event. - */ - if (connsm->peer_addr_type < BLE_HCI_CONN_PEER_ADDR_PUBLIC_IDENT - && (connsm->rpa_index > -1)) { - enh_ev->peer_addr_type += 2; - } - - if (enh_ev->peer_addr_type > BLE_HCI_CONN_PEER_ADDR_RANDOM) { - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - rpa = ble_ll_scan_get_peer_rpa(); - } else { - rpa = ble_ll_adv_get_peer_rpa(advsm); - } - memcpy(enh_ev->peer_rpa, rpa, BLE_DEV_ADDR_LEN); - } - - enh_ev->conn_itvl = htole16(connsm->conn_itvl); - enh_ev->conn_latency = htole16(connsm->slave_latency); - enh_ev->supervision_timeout = htole16(connsm->supervision_tmo); - enh_ev->mca = connsm->master_sca; - } - - ble_ll_hci_event_send(hci_ev); - return; - } - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_CONN_COMPLETE)) { - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - memset(ev, 0, sizeof(*ev)); - - ev->subev_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE; - ev->status = status; - - if (connsm) { - ev->conn_handle = htole16(connsm->conn_handle); - ev->role = connsm->conn_role - 1; - ev->peer_addr_type = connsm->peer_addr_type; - - if (ev->peer_addr_type > BLE_HCI_CONN_PEER_ADDR_RANDOM) { - ev->peer_addr_type -= 2; - } - memcpy(ev->peer_addr, connsm->peer_addr, BLE_DEV_ADDR_LEN); - ev->conn_itvl = htole16(connsm->conn_itvl); - ev->conn_latency = htole16(connsm->slave_latency); - ev->supervision_timeout = htole16(connsm->supervision_tmo); - ev->mca = connsm->master_sca; - } - - ble_ll_hci_event_send(hci_ev); - return; - } - - ble_hci_trans_buf_free(evbuf); -} - -/** - * Called to create and send the number of completed packets event to the - * host. - */ -void -ble_ll_conn_num_comp_pkts_event_send(struct ble_ll_conn_sm *connsm) -{ - /** The maximum number of handles that will fit in an event buffer. */ - static const int max_handles = - (BLE_LL_MAX_EVT_LEN - sizeof(struct ble_hci_ev_num_comp_pkts) - 1) / 4; - struct ble_hci_ev_num_comp_pkts *ev; - struct ble_hci_ev *hci_ev; - int event_sent; - - if (connsm == NULL) { - goto skip_conn; - } - - /* - * At some periodic rate, make sure we go through all active connections - * and send the number of completed packet events. We do this mainly - * because the spec says we must update the host even though no packets - * have completed but there are data packets in the controller buffers - * (i.e. enqueued in a connection state machine). - */ - if ((ble_npl_stime_t)(ble_npl_time_get() - g_ble_ll_last_num_comp_pkt_evt) < - ble_npl_time_ms_to_ticks32(MYNEWT_VAL(BLE_LL_NUM_COMP_PKT_ITVL_MS))) { - /* - * If this connection has completed packets, send an event right away. - * We do this to increase throughput but we dont want to search the - * entire active list every time. - */ - if (connsm->completed_pkts) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_NUM_COMP_PKTS; - hci_ev->length = sizeof(*ev); - ev = (void *)hci_ev->data; - - ev->count = 1; - ev->completed[0].handle = htole16(connsm->conn_handle); - ev->completed[0].packets = htole16(connsm->completed_pkts); - hci_ev->length += sizeof(ev->completed[0]); - - connsm->completed_pkts = 0; - - ble_ll_hci_event_send(hci_ev); - } - } - return; - } - - /* Iterate through all the active, created connections */ -skip_conn: - hci_ev = NULL; - ev = NULL; - - event_sent = 0; - SLIST_FOREACH(connsm, &g_ble_ll_conn_active_list, act_sle) { - /* - * Only look at connections that we have sent a connection complete - * event and that either has packets enqueued or has completed packets. - */ - if ((connsm->conn_state != BLE_LL_CONN_STATE_IDLE) && - (connsm->completed_pkts || !STAILQ_EMPTY(&connsm->conn_txq))) { - /* If no buffer, get one, If cant get one, leave. */ - if (!hci_ev) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (!hci_ev) { - break; - } - - hci_ev->opcode = BLE_HCI_EVCODE_NUM_COMP_PKTS; - hci_ev->length = sizeof(*ev); - ev = (void *)hci_ev->data; - - ev->count = 0; - } - - /* Add handle and complete packets */ - ev->completed[ev->count].handle = htole16(connsm->conn_handle); - ev->completed[ev->count].packets = htole16(connsm->completed_pkts); - hci_ev->length += sizeof(ev->completed[ev->count]); - ev->count++; - - connsm->completed_pkts = 0; - - /* Send now if the buffer is full. */ - if (ev->count == max_handles) { - ble_ll_hci_event_send(hci_ev); - hci_ev = NULL; - event_sent = 1; - } - } - } - - /* Send event if there is an event to send */ - if (hci_ev) { - ble_ll_hci_event_send(hci_ev); - event_sent = 1; - } - - if (event_sent) { - g_ble_ll_last_num_comp_pkt_evt = ble_npl_time_get(); - } -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING) -/** - * Send a authenticated payload timeout event - * - * NOTE: we currently only send this event when we have a reason to send it; - * not when it fails. - * - * @param reason The BLE error code to send as a disconnect reason - */ -void -ble_ll_auth_pyld_tmo_event_send(struct ble_ll_conn_sm *connsm) -{ - struct ble_hci_ev_auth_pyld_tmo *ev; - struct ble_hci_ev *hci_ev; - - if (ble_ll_hci_is_event_enabled(BLE_HCI_EVCODE_AUTH_PYLD_TMO)) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_AUTH_PYLD_TMO; - hci_ev->length = sizeof(*ev); - - ev = (void *) hci_ev->data; - ev->conn_handle = htole16(connsm->conn_handle); - - ble_ll_hci_event_send(hci_ev); - } - } -} -#endif - -/** - * Send a disconnection complete event. - * - * NOTE: we currently only send this event when we have a reason to send it; - * not when it fails. - * - * @param reason The BLE error code to send as a disconnect reason - */ -void -ble_ll_disconn_comp_event_send(struct ble_ll_conn_sm *connsm, uint8_t reason) -{ - struct ble_hci_ev_disconn_cmp *ev; - struct ble_hci_ev *hci_ev; - - if (ble_ll_hci_is_event_enabled(BLE_HCI_EVCODE_DISCONN_CMP)) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_DISCONN_CMP; - hci_ev->length = sizeof(*ev); - - ev = (void *) hci_ev->data; - - ev->status = BLE_ERR_SUCCESS; - ev->conn_handle = htole16(connsm->conn_handle); - ev->reason = reason; - - ble_ll_hci_event_send(hci_ev); - } - } -} - -static int -ble_ll_conn_hci_chk_scan_params(uint16_t itvl, uint16_t window) -{ - /* Check interval and window */ - if ((itvl < BLE_HCI_SCAN_ITVL_MIN) || - (itvl > BLE_HCI_SCAN_ITVL_MAX) || - (window < BLE_HCI_SCAN_WINDOW_MIN) || - (window > BLE_HCI_SCAN_WINDOW_MAX) || - (itvl < window)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - return 0; -} - -/** - * Process the HCI command to create a connection. - * - * Context: Link Layer task (HCI command processing) - * - * @param cmdbuf - * - * @return int - */ -int -ble_ll_conn_create(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_create_conn_cp *cmd = (const void *) cmdbuf; - struct ble_ll_conn_sm *connsm; - struct hci_create_conn hcc = { 0 }; - int rc; - - if (len < sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* If we are already creating a connection we should leave */ - if (g_ble_ll_conn_create_sm) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* If already enabled, we return an error */ - if (ble_ll_scan_enabled()) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* Retrieve command data */ - hcc.scan_itvl = le16toh(cmd->scan_itvl); - hcc.scan_window = le16toh(cmd->scan_window); - - rc = ble_ll_conn_hci_chk_scan_params(hcc.scan_itvl, hcc.scan_window); - if (rc) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Check filter policy */ - hcc.filter_policy = cmd->filter_policy; - if (hcc.filter_policy > BLE_HCI_INITIATOR_FILT_POLICY_MAX) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Get peer address type and address only if no whitelist used */ - if (hcc.filter_policy == 0) { - hcc.peer_addr_type = cmd->peer_addr_type; - if (hcc.peer_addr_type > BLE_HCI_CONN_PEER_ADDR_MAX) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - memcpy(&hcc.peer_addr, cmd->peer_addr, BLE_DEV_ADDR_LEN); - } - - /* Get own address type (used in connection request) */ - hcc.own_addr_type = cmd->own_addr_type; - if (hcc.own_addr_type > BLE_HCI_ADV_OWN_ADDR_MAX) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Check connection interval, latency and supervision timeoout */ - hcc.conn_itvl_min = le16toh(cmd->min_conn_itvl); - hcc.conn_itvl_max = le16toh(cmd->max_conn_itvl); - hcc.conn_latency = le16toh(cmd->conn_latency); - hcc.supervision_timeout = le16toh(cmd->tmo); - rc = ble_ll_conn_hci_chk_conn_params(hcc.conn_itvl_min, - hcc.conn_itvl_max, - hcc.conn_latency, - hcc.supervision_timeout); - if (rc) { - return rc; - } - - /* Min/max connection event lengths */ - hcc.min_ce_len = le16toh(cmd->min_ce); - hcc.max_ce_len = le16toh(cmd->max_ce); - if (hcc.min_ce_len > hcc.max_ce_len) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Make sure we can allocate an event to send the connection complete */ - if (ble_ll_init_alloc_conn_comp_ev()) { - return BLE_ERR_MEM_CAPACITY; - } - - /* Make sure we can accept a connection! */ - connsm = ble_ll_conn_sm_get(); - if (connsm == NULL) { - return BLE_ERR_CONN_LIMIT; - } - - /* Initialize state machine in master role and start state machine */ - ble_ll_conn_master_init(connsm, &hcc); - ble_ll_conn_sm_new(connsm); - /* CSA will be selected when advertising is received */ - - /* Start scanning */ - rc = ble_ll_scan_initiator_start(&hcc, &connsm->scansm); - if (rc) { - SLIST_REMOVE(&g_ble_ll_conn_active_list,connsm,ble_ll_conn_sm,act_sle); - STAILQ_INSERT_TAIL(&g_ble_ll_conn_free_list, connsm, free_stqe); - } else { - /* Set the connection state machine we are trying to create. */ - g_ble_ll_conn_create_sm = connsm; - } - - return rc; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static void -ble_ll_conn_hcc_params_set_fallback(struct hci_ext_create_conn *hcc, - const struct hci_ext_conn_params *fallback) -{ - BLE_LL_ASSERT(fallback); - - if (!(hcc->init_phy_mask & BLE_PHY_MASK_1M)) { - hcc->params[0] = *fallback; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) - if (!(hcc->init_phy_mask & BLE_PHY_MASK_2M)) { - hcc->params[1] = *fallback; - } -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - if (!(hcc->init_phy_mask & BLE_PHY_MASK_CODED)) { - hcc->params[2] = *fallback; - } -#endif -} - -int -ble_ll_ext_conn_create(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_ext_create_conn_cp *cmd = (const void *) cmdbuf; - const struct conn_params *params = cmd->conn_params; - const struct hci_ext_conn_params *fallback_params = NULL; - struct hci_ext_create_conn hcc = { 0 }; - struct ble_ll_conn_sm *connsm; - int rc; - - /* validate length */ - if (len < sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - len -= sizeof(*cmd); - - /* If we are already creating a connection we should leave */ - if (g_ble_ll_conn_create_sm) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* If already enabled, we return an error */ - if (ble_ll_scan_enabled()) { - return BLE_ERR_CMD_DISALLOWED; - } - - hcc.filter_policy = cmd->filter_policy; - if (hcc.filter_policy > BLE_HCI_INITIATOR_FILT_POLICY_MAX) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - hcc.own_addr_type = cmd->own_addr_type; - if (hcc.own_addr_type > BLE_HCI_ADV_OWN_ADDR_MAX) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Validate peer address type only if no whitelist used */ - if (hcc.filter_policy == 0) { - hcc.peer_addr_type = cmd->peer_addr_type; - - if (hcc.peer_addr_type > BLE_HCI_CONN_PEER_ADDR_MAX) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - memcpy(hcc.peer_addr, cmd->peer_addr, BLE_DEV_ADDR_LEN); - } - - hcc.init_phy_mask = cmd->init_phy_mask; - if (hcc.init_phy_mask & ~ble_ll_valid_conn_phy_mask) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (!(hcc.init_phy_mask & ble_ll_conn_required_phy_mask)) { - /* At least one of those need to be set */ - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (hcc.init_phy_mask & BLE_PHY_MASK_1M) { - if (len < sizeof(*params)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - len -= sizeof(*params); - - hcc.params[0].scan_itvl = le16toh(params->scan_itvl); - hcc.params[0].scan_window = le16toh(params->scan_window); - - rc = ble_ll_conn_hci_chk_scan_params(hcc.params[0].scan_itvl, - hcc.params[0].scan_window); - if (rc) { - return rc; - } - - hcc.params[0].conn_itvl_min = le16toh(params->conn_min_itvl); - hcc.params[0].conn_itvl_max = le16toh(params->conn_min_itvl); - hcc.params[0].conn_latency = le16toh(params->conn_latency); - hcc.params[0].supervision_timeout = le16toh(params->supervision_timeout); - - rc = ble_ll_conn_hci_chk_conn_params(hcc.params[0].conn_itvl_min, - hcc.params[0].conn_itvl_max, - hcc.params[0].conn_latency, - hcc.params[0].supervision_timeout); - if (rc) { - return rc; - } - - /* Min/max connection event lengths */ - hcc.params[0].min_ce_len = le16toh(params->min_ce); - hcc.params[0].max_ce_len = le16toh(params->max_ce); - if (hcc.params[0].min_ce_len > hcc.params[0].max_ce_len) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - fallback_params = &hcc.params[0]; - params++; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) - if (hcc.init_phy_mask & BLE_PHY_MASK_2M) { - if (len < sizeof(*params)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - len -= sizeof(*params); - - hcc.params[1].conn_itvl_min = le16toh(params->conn_min_itvl); - hcc.params[1].conn_itvl_max = le16toh(params->conn_min_itvl); - hcc.params[1].conn_latency = le16toh(params->conn_latency); - hcc.params[1].supervision_timeout = le16toh(params->supervision_timeout); - - rc = ble_ll_conn_hci_chk_conn_params(hcc.params[1].conn_itvl_min, - hcc.params[1].conn_itvl_max, - hcc.params[1].conn_latency, - hcc.params[1].supervision_timeout); - if (rc) { - return rc; - } - - /* Min/max connection event lengths */ - hcc.params[1].min_ce_len = le16toh(params->min_ce); - hcc.params[1].max_ce_len = le16toh(params->max_ce); - if (hcc.params[1].min_ce_len > hcc.params[1].max_ce_len) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - params++; - } -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - if (hcc.init_phy_mask & BLE_PHY_MASK_CODED) { - if (len < sizeof(*params)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - len -= sizeof(*params); - - hcc.params[2].scan_itvl = le16toh(params->scan_itvl); - hcc.params[2].scan_window = le16toh(params->scan_window); - - rc = ble_ll_conn_hci_chk_scan_params(hcc.params[2].scan_itvl, - hcc.params[2].scan_window); - if (rc) { - return rc; - } - - hcc.params[2].conn_itvl_min = le16toh(params->conn_min_itvl); - hcc.params[2].conn_itvl_max = le16toh(params->conn_min_itvl); - hcc.params[2].conn_latency = le16toh(params->conn_latency); - hcc.params[2].supervision_timeout = le16toh(params->supervision_timeout); - - rc = ble_ll_conn_hci_chk_conn_params(hcc.params[2].conn_itvl_min, - hcc.params[2].conn_itvl_max, - hcc.params[2].conn_latency, - hcc.params[2].supervision_timeout); - if (rc) { - return rc; - } - - /* Min/max connection event lengths */ - hcc.params[2].min_ce_len = le16toh(params->min_ce); - hcc.params[2].max_ce_len = le16toh(params->max_ce); - if (hcc.params[2].min_ce_len > hcc.params[2].max_ce_len) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (!fallback_params) { - fallback_params = &hcc.params[2]; - } - params++; - } -#endif - - /* Make sure we can allocate an event to send the connection complete */ - if (ble_ll_init_alloc_conn_comp_ev()) { - return BLE_ERR_MEM_CAPACITY; - } - - /* Make sure we can accept a connection! */ - connsm = ble_ll_conn_sm_get(); - if (connsm == NULL) { - return BLE_ERR_CONN_LIMIT; - } - - ble_ll_conn_hcc_params_set_fallback(&hcc, fallback_params); - - /* Initialize state machine in master role and start state machine */ - ble_ll_conn_ext_master_init(connsm, &hcc); - ble_ll_conn_sm_new(connsm); - - /* CSA will be selected when advertising is received */ - - /* Start scanning */ - rc = ble_ll_scan_ext_initiator_start(&hcc, &connsm->scansm); - if (rc) { - SLIST_REMOVE(&g_ble_ll_conn_active_list,connsm,ble_ll_conn_sm,act_sle); - STAILQ_INSERT_TAIL(&g_ble_ll_conn_free_list, connsm, free_stqe); - } else { - /* Set the connection state machine we are trying to create. */ - g_ble_ll_conn_create_sm = connsm; - } - - return rc; -} -#endif - -static int -ble_ll_conn_process_conn_params(const struct ble_hci_le_rem_conn_param_rr_cp *cmd, - struct ble_ll_conn_sm *connsm) -{ - int rc; - struct hci_conn_update *hcu; - - /* Retrieve command data */ - hcu = &connsm->conn_param_req; - hcu->handle = connsm->conn_handle; - - BLE_LL_ASSERT(connsm->conn_handle == le16toh(cmd->conn_handle)); - - hcu->conn_itvl_min = le16toh(cmd->conn_itvl_min); - hcu->conn_itvl_max = le16toh(cmd->conn_itvl_max); - hcu->conn_latency = le16toh(cmd->conn_latency); - hcu->supervision_timeout = le16toh(cmd->supervision_timeout); - hcu->min_ce_len = le16toh(cmd->min_ce); - hcu->max_ce_len = le16toh(cmd->max_ce); - - /* Check that parameter values are in range */ - rc = ble_ll_conn_hci_chk_conn_params(hcu->conn_itvl_min, - hcu->conn_itvl_max, - hcu->conn_latency, - hcu->supervision_timeout); - - /* Check valid min/max ce length */ - if (rc || (hcu->min_ce_len > hcu->max_ce_len)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - return rc; -} - -/** - * Called when the host issues the read remote features command - * - * @param cmdbuf - * - * @return int - */ -int -ble_ll_conn_hci_read_rem_features(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_rd_rem_feat_cp *cmd = (const void *) cmdbuf; - struct ble_ll_conn_sm *connsm; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* If no connection handle exit with error */ - connsm = ble_ll_conn_find_active_conn(le16toh(cmd->conn_handle)); - if (!connsm) { - return BLE_ERR_UNK_CONN_ID; - } - - /* If already pending exit with error */ - if (connsm->csmflags.cfbit.pending_hci_rd_features) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* - * Start control procedure if we did not receive peer's features and did not - * start procedure already. - */ - if (!connsm->csmflags.cfbit.rxd_features && - !IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_FEATURE_XCHG)) { - if ((connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) && - !(ble_ll_read_supp_features() & BLE_LL_FEAT_SLAVE_INIT)) { - return BLE_ERR_CMD_DISALLOWED; - } - - ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_FEATURE_XCHG); - } - - connsm->csmflags.cfbit.pending_hci_rd_features = 1; - - return BLE_ERR_SUCCESS; -} - -/** - * Called to process a connection update command. - * - * @param cmdbuf - * - * @return int - */ -int -ble_ll_conn_hci_update(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_conn_update_cp *cmd = (const void *) cmdbuf; - int rc; - uint8_t ctrl_proc; - uint16_t handle; - struct ble_ll_conn_sm *connsm; - struct hci_conn_update *hcu; - - /* - * XXX: must deal with slave not supporting this feature and using - * conn update! Right now, we only check if WE support the connection - * parameters request procedure. We dont check if the remote does. - * We should also be able to deal with sending the parameter request, - * getting an UNKOWN_RSP ctrl pdu and resorting to use normal - * connection update procedure. - */ - - /* If no connection handle exit with error */ - handle = le16toh(cmd->conn_handle); - connsm = ble_ll_conn_find_active_conn(handle); - if (!connsm) { - return BLE_ERR_UNK_CONN_ID; - } - - /* Better not have this procedure ongoing! */ - if (IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_CONN_PARAM_REQ) || - IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_CONN_UPDATE)) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* See if this feature is supported on both sides */ - if ((connsm->conn_features & BLE_LL_FEAT_CONN_PARM_REQ) == 0) { - if (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) { - return BLE_ERR_UNSUPP_REM_FEATURE; - } - ctrl_proc = BLE_LL_CTRL_PROC_CONN_UPDATE; - } else { - ctrl_proc = BLE_LL_CTRL_PROC_CONN_PARAM_REQ; - } - - /* - * If we are a slave and the master has initiated the procedure already - * we should deny the slave request for now. If we are a master and the - * slave has initiated the procedure, we need to send a reject to the - * slave. - */ - if (connsm->csmflags.cfbit.awaiting_host_reply) { - if (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) { - return BLE_ERR_LMP_COLLISION; - } else { - connsm->csmflags.cfbit.awaiting_host_reply = 0; - - /* XXX: If this fails no reject ind will be sent! */ - ble_ll_ctrl_reject_ind_send(connsm, connsm->host_reply_opcode, - BLE_ERR_LMP_COLLISION); - } - } - - /* - * If we are a slave and the master has initiated the channel map - * update procedure we should deny the slave request for now. - */ - if (connsm->csmflags.cfbit.chanmap_update_scheduled) { - if (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) { - return BLE_ERR_DIFF_TRANS_COLL; - } - } - - /* Retrieve command data */ - hcu = &connsm->conn_param_req; - hcu->conn_itvl_min = le16toh(cmd->conn_itvl_min); - hcu->conn_itvl_max = le16toh(cmd->conn_itvl_max); - hcu->conn_latency = le16toh(cmd->conn_latency); - hcu->supervision_timeout = le16toh(cmd->supervision_timeout); - hcu->min_ce_len = le16toh(cmd->min_ce_len); - hcu->max_ce_len = le16toh(cmd->max_ce_len); - if (hcu->min_ce_len > hcu->max_ce_len) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Check that parameter values are in range */ - rc = ble_ll_conn_hci_chk_conn_params(hcu->conn_itvl_min, - hcu->conn_itvl_max, - hcu->conn_latency, - hcu->supervision_timeout); - if (!rc) { - hcu->handle = handle; - - /* Start the control procedure */ - ble_ll_ctrl_proc_start(connsm, ctrl_proc); - } - - return rc; -} - -int -ble_ll_conn_hci_param_rr(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen) -{ - const struct ble_hci_le_rem_conn_param_rr_cp *cmd = (const void *) cmdbuf; - struct ble_hci_le_rem_conn_param_rr_rp *rsp = (void *) rspbuf; - int rc; - uint8_t *dptr; - uint8_t rsp_opcode; - uint16_t handle; - struct os_mbuf *om; - struct ble_ll_conn_sm *connsm; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - handle = le16toh(cmd->conn_handle); - - /* See if we support this feature */ - if ((ble_ll_read_supp_features() & BLE_LL_FEAT_CONN_PARM_REQ) == 0) { - rc = BLE_ERR_UNKNOWN_HCI_CMD; - goto done; - } - - /* If we dont have a handle we cant do anything */ - connsm = ble_ll_conn_find_active_conn(handle); - if (!connsm) { - rc = BLE_ERR_UNK_CONN_ID; - goto done; - } - - /* Make sure connection parameters are valid */ - rc = ble_ll_conn_process_conn_params(cmd, connsm); - - /* The connection should be awaiting a reply. If not, just discard */ - if (connsm->csmflags.cfbit.awaiting_host_reply) { - /* Get a control packet buffer */ - if (rc == BLE_ERR_SUCCESS) { - om = os_msys_get_pkthdr(BLE_LL_CTRL_MAX_PDU_LEN, - sizeof(struct ble_mbuf_hdr)); - if (om) { - dptr = om->om_data; - rsp_opcode = ble_ll_ctrl_conn_param_reply(connsm, dptr, - &connsm->conn_cp); - dptr[0] = rsp_opcode; - len = g_ble_ll_ctrl_pkt_lengths[rsp_opcode] + 1; - ble_ll_conn_enqueue_pkt(connsm, om, BLE_LL_LLID_CTRL, len); - } - } else { - /* XXX: check return code and deal */ - ble_ll_ctrl_reject_ind_send(connsm, connsm->host_reply_opcode, - BLE_ERR_CONN_PARMS); - } - connsm->csmflags.cfbit.awaiting_host_reply = 0; - - /* XXX: if we cant get a buffer, what do we do? We need to remember - * reason if it was a negative reply. We also would need to have - * some state to tell us this happened - */ - } - -done: - rsp->conn_handle = htole16(handle); - - *rsplen = sizeof(*rsp); - return rc; -} - -int -ble_ll_conn_hci_param_nrr(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen) -{ - const struct ble_hci_le_rem_conn_params_nrr_cp *cmd = (const void *) cmdbuf; - struct ble_hci_le_rem_conn_params_nrr_rp *rsp = (void *) rspbuf; - struct ble_ll_conn_sm *connsm; - uint16_t handle; - int rc; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - handle = le16toh(cmd->conn_handle); - - /* See if we support this feature */ - if ((ble_ll_read_supp_features() & BLE_LL_FEAT_CONN_PARM_REQ) == 0) { - rc = BLE_ERR_UNKNOWN_HCI_CMD; - goto done; - } - - /* If we dont have a handle we cant do anything */ - connsm = ble_ll_conn_find_active_conn(handle); - if (!connsm) { - rc = BLE_ERR_UNK_CONN_ID; - goto done; - } - - rc = BLE_ERR_SUCCESS; - - /* The connection should be awaiting a reply. If not, just discard */ - if (connsm->csmflags.cfbit.awaiting_host_reply) { - /* XXX: check return code and deal */ - ble_ll_ctrl_reject_ind_send(connsm, connsm->host_reply_opcode, - cmd->reason); - connsm->csmflags.cfbit.awaiting_host_reply = 0; - - /* XXX: if we cant get a buffer, what do we do? We need to remember - * reason if it was a negative reply. We also would need to have - * some state to tell us this happened - */ - } - -done: - rsp->conn_handle = htole16(handle); - - *rsplen = sizeof(*rsp); - return rc; -} - -/* this is called from same context after cmd complete is send so it is - * safe to use g_ble_ll_conn_comp_ev - */ -static void -ble_ll_conn_hci_cancel_conn_complete_event(void) -{ - BLE_LL_ASSERT(g_ble_ll_conn_comp_ev); - - ble_ll_conn_comp_event_send(NULL, BLE_ERR_UNK_CONN_ID, - g_ble_ll_conn_comp_ev, NULL); - g_ble_ll_conn_comp_ev = NULL; -} - -/** - * Called when HCI command to cancel a create connection command has been - * received. - * - * Context: Link Layer (HCI command parser) - * - * @return int - */ -int -ble_ll_conn_create_cancel(ble_ll_hci_post_cmd_complete_cb *post_cmd_cb) -{ - int rc; - struct ble_ll_conn_sm *connsm; - os_sr_t sr; - - /* - * If we receive this command and we have not got a connection - * create command, we have to return disallowed. The spec does not say - * what happens if the connection has already been established. We - * return disallowed as well - */ - OS_ENTER_CRITICAL(sr); - connsm = g_ble_ll_conn_create_sm; - if (connsm && (connsm->conn_state == BLE_LL_CONN_STATE_IDLE)) { - /* stop scanning and end the connection event */ - g_ble_ll_conn_create_sm = NULL; - ble_ll_scan_sm_stop(1); - ble_ll_conn_end(connsm, BLE_ERR_UNK_CONN_ID); - - *post_cmd_cb = ble_ll_conn_hci_cancel_conn_complete_event; - - rc = BLE_ERR_SUCCESS; - } else { - /* If we are not attempting to create a connection*/ - rc = BLE_ERR_CMD_DISALLOWED; - } - OS_EXIT_CRITICAL(sr); - - return rc; -} - -/** - * Called to process a HCI disconnect command - * - * Context: Link Layer task (HCI command parser). - * - * @param cmdbuf - * - * @return int - */ -int -ble_ll_conn_hci_disconnect_cmd(const uint8_t *cmdbuf, uint8_t len) -{ - int rc; - uint16_t handle; - struct ble_ll_conn_sm *connsm; - const struct ble_hci_lc_disconnect_cp *cmd = (const void *) cmdbuf; - - if (len != sizeof (*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Check for valid parameters */ - handle = le16toh(cmd->conn_handle); - - rc = BLE_ERR_INV_HCI_CMD_PARMS; - if (handle <= BLE_LL_CONN_MAX_CONN_HANDLE) { - /* Make sure reason is valid */ - switch (cmd->reason) { - case BLE_ERR_AUTH_FAIL: - case BLE_ERR_REM_USER_CONN_TERM: - case BLE_ERR_RD_CONN_TERM_RESRCS: - case BLE_ERR_RD_CONN_TERM_PWROFF: - case BLE_ERR_UNSUPP_REM_FEATURE: - case BLE_ERR_UNIT_KEY_PAIRING: - case BLE_ERR_CONN_PARMS: - connsm = ble_ll_conn_find_active_conn(handle); - if (connsm) { - /* Do not allow command if we are in process of disconnecting */ - if (connsm->disconnect_reason) { - rc = BLE_ERR_CMD_DISALLOWED; - } else { - /* This control procedure better not be pending! */ - BLE_LL_ASSERT(CONN_F_TERMINATE_STARTED(connsm) == 0); - - /* Record the disconnect reason */ - connsm->disconnect_reason = cmd->reason; - - /* Start this control procedure */ - ble_ll_ctrl_terminate_start(connsm); - - rc = BLE_ERR_SUCCESS; - } - } else { - rc = BLE_ERR_UNK_CONN_ID; - } - break; - default: - break; - } - } - - return rc; -} - -/** - * Called to process a HCI disconnect command - * - * Context: Link Layer task (HCI command parser). - * - * @param cmdbuf - * - * @return int - */ -int -ble_ll_conn_hci_rd_rem_ver_cmd(const uint8_t *cmdbuf, uint8_t len) -{ - struct ble_ll_conn_sm *connsm; - const struct ble_hci_rd_rem_ver_info_cp *cmd = (const void *) cmdbuf; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Check for valid parameters */ - connsm = ble_ll_conn_find_active_conn(le16toh(cmd->conn_handle)); - if (!connsm) { - return BLE_ERR_UNK_CONN_ID; - } - - /* Return error if in progress */ - if (IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_VERSION_XCHG)) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* - * Start this control procedure. If we have already done this control - * procedure we set the pending bit so that the host gets an event because - * it is obviously expecting one (or would not have sent the command). - * NOTE: we cant just send the event here. That would cause the event to - * be queued before the command status. - */ - if (!connsm->csmflags.cfbit.version_ind_sent) { - ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_VERSION_XCHG); - } else { - connsm->pending_ctrl_procs |= (1 << BLE_LL_CTRL_PROC_VERSION_XCHG); - } - - return BLE_ERR_SUCCESS; -} - -/** - * Called to read the RSSI for a given connection handle - * - * @param cmdbuf - * @param rspbuf - * @param rsplen - * - * @return int - */ -int -ble_ll_conn_hci_rd_rssi(const uint8_t *cmdbuf, uint8_t len, uint8_t *rspbuf, uint8_t *rsplen) -{ - - const struct ble_hci_rd_rssi_cp *cmd = (const void *) cmdbuf; - struct ble_hci_rd_rssi_rp *rsp = (void *) rspbuf; - struct ble_ll_conn_sm *connsm; - int rc; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - rsp->handle = cmd->handle; - - connsm = ble_ll_conn_find_active_conn(le16toh(cmd->handle)); - if (!connsm) { - rsp->rssi = 127; - rc = BLE_ERR_UNK_CONN_ID; - } else { - rsp->rssi = connsm->conn_rssi; - rc = BLE_ERR_SUCCESS; - } - - *rsplen = sizeof(*rsp); - return rc; -} - -/** - * Called to read the current channel map of a connection - * - * @param cmdbuf - * @param rspbuf - * @param rsplen - * - * @return int - */ -int -ble_ll_conn_hci_rd_chan_map(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen) -{ - const struct ble_hci_le_rd_chan_map_cp *cmd = (const void *) cmdbuf; - struct ble_hci_le_rd_chan_map_rp *rsp = (void *) rspbuf; - struct ble_ll_conn_sm *connsm; - uint16_t handle; - int rc; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - handle = le16toh(cmd->conn_handle); - connsm = ble_ll_conn_find_active_conn(handle); - if (!connsm) { - rc = BLE_ERR_UNK_CONN_ID; - memset(rsp->chan_map, 0, sizeof(rsp->chan_map)); - } else { - if (connsm->csmflags.cfbit.chanmap_update_scheduled) { - memcpy(rsp->chan_map, connsm->req_chanmap, BLE_LL_CONN_CHMAP_LEN); - } else { - memcpy(rsp->chan_map, connsm->chanmap, BLE_LL_CONN_CHMAP_LEN); - } - rc = BLE_ERR_SUCCESS; - } - - rsp->conn_handle = htole16(handle); - - *rsplen = sizeof(*rsp); - return rc; -} - -/** - * Called when the host issues the LE command "set host channel classification" - * - * @param cmdbuf - * - * @return int - */ -int -ble_ll_conn_hci_set_chan_class(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_host_chan_class_cp *cmd = (const void *) cmdbuf; - uint8_t num_used_chans; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* - * The HCI command states that the host is allowed to mask in just one - * channel but the Link Layer needs minimum two channels to operate. So - * I will not allow this command if there are less than 2 channels masked. - */ - num_used_chans = ble_ll_utils_calc_num_used_chans(cmd->chan_map); - if ((num_used_chans < 2) || ((cmd->chan_map[4] & 0xe0) != 0)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Set the host channel mask */ - ble_ll_conn_set_global_chanmap(num_used_chans, cmd->chan_map); - return BLE_ERR_SUCCESS; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_DATA_LEN_EXT) -int -ble_ll_conn_hci_set_data_len(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen) -{ - const struct ble_hci_le_set_data_len_cp *cmd = (const void *) cmdbuf; - struct ble_hci_le_set_data_len_rp *rsp = (void *) rspbuf; - int rc; - uint16_t handle; - uint16_t txoctets; - uint16_t txtime; - struct ble_ll_conn_sm *connsm; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Find connection */ - handle = le16toh(cmd->conn_handle); - connsm = ble_ll_conn_find_active_conn(handle); - if (!connsm) { - rc = BLE_ERR_UNK_CONN_ID; - goto done; - } - - txoctets = le16toh(cmd->tx_octets); - txtime = le16toh(cmd->tx_time); - - /* Make sure it is valid */ - if (!ble_ll_chk_txrx_octets(txoctets) || - !ble_ll_chk_txrx_time(txtime)) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - /* - * Keep original value requested by host since we may want to recalculate - * MaxTxTime after PHY changes between coded and uncoded. - */ - connsm->host_req_max_tx_time = txtime; - - /* If peer does not support coded, we cannot use value larger than 2120us */ - if (!(connsm->remote_features[0] & (BLE_LL_FEAT_LE_CODED_PHY >> 8))) { - txtime = min(txtime, BLE_LL_CONN_SUPP_TIME_MAX_UNCODED); - } -#endif - - rc = BLE_ERR_SUCCESS; - if (connsm->max_tx_time != txtime || - connsm->max_tx_octets != txoctets) { - - connsm->max_tx_time = txtime; - connsm->max_tx_octets = txoctets; - - ble_ll_ctrl_initiate_dle(connsm); - } - -done: - rsp->conn_handle = htole16(handle); - *rsplen = sizeof(*rsp); - return rc; -} -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) -/** - * LE start encrypt command - * - * @param cmdbuf - * - * @return int - */ -int -ble_ll_conn_hci_le_start_encrypt(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_start_encrypt_cp *cmd = (const void *) cmdbuf; - struct ble_ll_conn_sm *connsm; - int rc; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - connsm = ble_ll_conn_find_active_conn(le16toh(cmd->conn_handle)); - if (!connsm) { - rc = BLE_ERR_UNK_CONN_ID; - } else if (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) { - rc = BLE_ERR_UNSPECIFIED; - } else if (connsm->cur_ctrl_proc == BLE_LL_CTRL_PROC_ENCRYPT) { - /* - * The specification does not say what to do here but the host should - * not be telling us to start encryption while we are in the process - * of honoring a previous start encrypt. - */ - rc = BLE_ERR_CMD_DISALLOWED; - } else { - /* Start the control procedure */ - connsm->enc_data.host_rand_num = le64toh(cmd->rand); - connsm->enc_data.enc_div = le16toh(cmd->div); - swap_buf(connsm->enc_data.enc_block.key, cmd->ltk, 16); - ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_ENCRYPT); - rc = BLE_ERR_SUCCESS; - } - - return rc; -} - -/** - * Called to process the LE long term key reply. - * - * Context: Link Layer Task. - * - * @param cmdbuf - * @param rspbuf - * @param ocf - * - * @return int - */ -int -ble_ll_conn_hci_le_ltk_reply(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen) -{ - const struct ble_hci_le_lt_key_req_reply_cp *cmd = (const void *) cmdbuf; - struct ble_hci_le_lt_key_req_reply_rp *rsp = (void *) rspbuf; - struct ble_ll_conn_sm *connsm; - uint16_t handle; - int rc; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Find connection handle */ - handle = le16toh(cmd->conn_handle); - connsm = ble_ll_conn_find_active_conn(handle); - if (!connsm) { - rc = BLE_ERR_UNK_CONN_ID; - goto ltk_key_cmd_complete; - } - - /* Should never get this if we are a master! */ - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - rc = BLE_ERR_UNSPECIFIED; - goto ltk_key_cmd_complete; - } - - /* The connection should be awaiting a reply. If not, just discard */ - if (connsm->enc_data.enc_state != CONN_ENC_S_LTK_REQ_WAIT) { - rc = BLE_ERR_CMD_DISALLOWED; - goto ltk_key_cmd_complete; - } - - swap_buf(connsm->enc_data.enc_block.key, cmd->ltk, 16); - ble_ll_calc_session_key(connsm); - ble_ll_ctrl_start_enc_send(connsm); - rc = BLE_ERR_SUCCESS; - -ltk_key_cmd_complete: - rsp->conn_handle = htole16(handle); - - *rsplen = sizeof(*rsp); - return rc; -} - -/** - * Called to process the LE long term key negative reply. - * - * Context: Link Layer Task. - * - * @param cmdbuf - * @param rspbuf - * @param ocf - * - * @return int - */ -int -ble_ll_conn_hci_le_ltk_neg_reply(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen) -{ - const struct ble_hci_le_lt_key_req_neg_reply_cp *cmd = (const void *) cmdbuf; - struct ble_hci_le_lt_key_req_neg_reply_rp *rsp = (void *) rspbuf; - struct ble_ll_conn_sm *connsm; - uint16_t handle; - int rc; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Find connection handle */ - handle = le16toh(cmd->conn_handle); - connsm = ble_ll_conn_find_active_conn(handle); - if (!connsm) { - rc = BLE_ERR_UNK_CONN_ID; - goto ltk_key_cmd_complete; - } - - /* Should never get this if we are a master! */ - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - rc = BLE_ERR_UNSPECIFIED; - goto ltk_key_cmd_complete; - } - - /* The connection should be awaiting a reply. If not, just discard */ - if (connsm->enc_data.enc_state != CONN_ENC_S_LTK_REQ_WAIT) { - rc = BLE_ERR_CMD_DISALLOWED; - goto ltk_key_cmd_complete; - } - - /* We received a negative reply! Send REJECT_IND */ - ble_ll_ctrl_reject_ind_send(connsm, BLE_LL_CTRL_ENC_REQ, - BLE_ERR_PINKEY_MISSING); - connsm->enc_data.enc_state = CONN_ENC_S_LTK_NEG_REPLY; - - rc = BLE_ERR_SUCCESS; - -ltk_key_cmd_complete: - rsp->conn_handle = htole16(handle); - - *rsplen = sizeof(*rsp); - return rc; -} -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING) -/** - * Read authenticated payload timeout (OGF=3, OCF==0x007B) - * - * @param cmdbuf - * @param rsplen - * - * @return int - */ -int -ble_ll_conn_hci_rd_auth_pyld_tmo(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen) -{ - const struct ble_hci_cb_rd_auth_pyld_tmo_cp *cmd = (const void *) cmdbuf; - struct ble_hci_cb_rd_auth_pyld_tmo_rp *rsp = (void *) rspbuf; - struct ble_ll_conn_sm *connsm; - uint16_t handle; - int rc; - - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - handle = le16toh(cmd->conn_handle); - connsm = ble_ll_conn_find_active_conn(handle); - if (!connsm) { - rc = BLE_ERR_UNK_CONN_ID; - rsp->tmo = 0; - } else { - rc = BLE_ERR_SUCCESS; - rsp->tmo = htole16(connsm->auth_pyld_tmo); - } - - rsp->conn_handle = htole16(handle); - - *rsplen = sizeof(*rsp); - return rc; -} - -/** - * Write authenticated payload timeout (OGF=3, OCF=00x7C) - * - * @param cmdbuf - * @param rsplen - * - * @return int - */ -int -ble_ll_conn_hci_wr_auth_pyld_tmo(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen) -{ - const struct ble_hci_cb_wr_auth_pyld_tmo_cp *cmd = (const void *) cmdbuf; - struct ble_hci_cb_wr_auth_pyld_tmo_rp *rsp = (void *) rspbuf; - struct ble_ll_conn_sm *connsm; - uint32_t min_tmo; - uint16_t handle; - uint16_t tmo; - int rc; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - rc = BLE_ERR_SUCCESS; - - handle = le16toh(cmd->conn_handle); - - connsm = ble_ll_conn_find_active_conn(handle); - if (!connsm) { - rc = BLE_ERR_UNK_CONN_ID; - } else { - /* - * The timeout is in units of 10 msecs. We need to make sure that the - * timeout is greater than or equal to connItvl * (1 + slaveLatency) - */ - tmo = le16toh(cmd->tmo); - min_tmo = (uint32_t)connsm->conn_itvl * BLE_LL_CONN_ITVL_USECS; - min_tmo *= (connsm->slave_latency + 1); - min_tmo /= 10000; - - if (tmo < min_tmo) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - } else { - connsm->auth_pyld_tmo = tmo; - if (ble_npl_callout_is_active(&connsm->auth_pyld_timer)) { - ble_ll_conn_auth_pyld_timer_start(connsm); - } - } - } - - rsp->conn_handle = htole16(handle); - *rsplen = sizeof(*rsp); - return rc; -} -#endif - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) -/** - * Read current phy for connection (OGF=8, OCF==0x0030) - * - * @param cmdbuf - * @param rsplen - * - * @return int - */ -int -ble_ll_conn_hci_le_rd_phy(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen) -{ - const struct ble_hci_le_rd_phy_cp *cmd = (const void *) cmdbuf; - struct ble_hci_le_rd_phy_rp *rsp = (void *) rspbuf; - int rc; - uint16_t handle; - struct ble_ll_conn_sm *connsm; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - handle = le16toh(cmd->conn_handle); - connsm = ble_ll_conn_find_active_conn(handle); - if (!connsm) { - rsp->tx_phy = 0; - rsp->rx_phy = 0; - rc = BLE_ERR_UNK_CONN_ID; - } else { - rsp->tx_phy = connsm->phy_data.cur_tx_phy; - rsp->rx_phy = connsm->phy_data.cur_rx_phy; - rc = BLE_ERR_SUCCESS; - } - - rsp->conn_handle = htole16(handle); - - *rsplen = sizeof(*rsp); - return rc; -} - -/** - * Set PHY preferences for connection - * - * @param cmdbuf - * - * @return int - */ -int -ble_ll_conn_hci_le_set_phy(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_phy_cp *cmd = (const void *) cmdbuf; - int rc; - uint16_t phy_options; - uint8_t tx_phys; - uint8_t rx_phys; - uint16_t handle; - struct ble_ll_conn_sm *connsm; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - handle = le16toh(cmd->conn_handle); - connsm = ble_ll_conn_find_active_conn(handle); - if (!connsm) { - return BLE_ERR_UNK_CONN_ID; - } - - /* - * If host has requested a PHY update and we are not finished do - * not allow another one - */ - if (CONN_F_HOST_PHY_UPDATE(connsm)) { - return BLE_ERR_CMD_DISALLOWED; - } - - phy_options = le16toh(cmd->phy_options); - if (phy_options > BLE_HCI_LE_PHY_CODED_S8_PREF) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Check valid parameters */ - rc = ble_ll_hci_chk_phy_masks(cmd->all_phys, cmd->tx_phys, cmd->rx_phys, - &tx_phys, &rx_phys); - if (rc) { - goto phy_cmd_param_err; - } - - connsm->phy_data.phy_options = phy_options & 0x03; - connsm->phy_data.host_pref_tx_phys_mask = tx_phys, - connsm->phy_data.host_pref_rx_phys_mask = rx_phys; - - /* - * The host preferences override the default phy preferences. Currently, - * the only reason the controller will initiate a procedure on its own - * is due to the fact that the host set default preferences. So if there - * is a pending control procedure and it has not yet started, we do not - * need to perform the default controller procedure. - */ - if (IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_PHY_UPDATE)) { - if (connsm->cur_ctrl_proc != BLE_LL_CTRL_PROC_PHY_UPDATE) { - CONN_F_CTRLR_PHY_UPDATE(connsm) = 0; - } - CONN_F_HOST_PHY_UPDATE(connsm) = 1; - } else { - /* - * We could be doing a peer-initiated PHY update procedure. If this - * is the case the requested phy preferences will not both be 0. If - * we are not done with a peer-initiated procedure we just set the - * pending bit but do not start the control procedure. - */ - if (CONN_F_PEER_PHY_UPDATE(connsm)) { - connsm->pending_ctrl_procs |= (1 << BLE_LL_CTRL_PROC_PHY_UPDATE); - CONN_F_HOST_PHY_UPDATE(connsm) = 1; - } else { - /* Check if we should start phy update procedure */ - if (!ble_ll_conn_chk_phy_upd_start(connsm)) { - CONN_F_HOST_PHY_UPDATE(connsm) = 1; - } else { - /* - * Set flag to send a PHY update complete event. We set flag - * even if we do not do an update procedure since we have to - * inform the host even if we decide not to change anything. - */ - CONN_F_PHY_UPDATE_EVENT(connsm) = 1; - } - } - } - -phy_cmd_param_err: - return rc; -} -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) -int -ble_ll_set_sync_transfer_params(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen) -{ - const struct ble_hci_le_periodic_adv_sync_transfer_params_cp *cmd = (const void *)cmdbuf; - struct ble_hci_le_periodic_adv_sync_transfer_params_rp *rsp = (void *) rspbuf; - struct ble_ll_conn_sm *connsm; - uint16_t sync_timeout; - uint16_t skip; - int rc; - - if (len != sizeof(*cmd)) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - if (cmd->mode > 0x02) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - skip = le16toh(cmd->skip); - if (skip > 0x01f3) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - sync_timeout = le16toh(cmd->sync_timeout); - if ((sync_timeout < 0x000a) || (sync_timeout > 0x4000)) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - /* we don't support any CTE yet */ - if (cmd->sync_cte_type) { - rc = BLE_ERR_UNSUPPORTED; - goto done; - } - - connsm = ble_ll_conn_find_active_conn(le16toh(cmd->conn_handle)); - if (!connsm) { - rc = BLE_ERR_UNK_CONN_ID; - goto done; - } - - /* timeout in 10ms units */ - connsm->sync_transfer_sync_timeout = sync_timeout * 10000; - connsm->sync_transfer_mode = cmd->mode; - connsm->sync_transfer_skip = skip; - - rc = BLE_ERR_SUCCESS; - -done: - rsp->conn_handle = cmd->conn_handle; - *rsplen = sizeof(*rsp); - return rc; -} - -int -ble_ll_set_default_sync_transfer_params(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_default_periodic_sync_transfer_params_cp *cmd = (const void *)cmdbuf; - uint16_t sync_timeout; - uint16_t skip; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (cmd->mode > 0x02) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - skip = le16toh(cmd->skip); - if (skip > 0x01f3) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - sync_timeout = le16toh(cmd->sync_timeout); - if ((sync_timeout < 0x000a) || (sync_timeout > 0x4000)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* we don't support any CTE yet */ - if (cmd->sync_cte_type) { - return BLE_ERR_UNSUPPORTED; - } - - /* timeout in 10ms units */ - g_ble_ll_conn_sync_transfer_params.sync_timeout_us = sync_timeout * 10000; - g_ble_ll_conn_sync_transfer_params.mode = cmd->mode; - g_ble_ll_conn_sync_transfer_params.max_skip = skip; - - return BLE_ERR_SUCCESS; -} -#endif -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_conn_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_conn_priv.h deleted file mode 100644 index e4ade10f9..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_conn_priv.h +++ /dev/null @@ -1,226 +0,0 @@ -/* - * 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_PRIV_ -#define H_BLE_LL_CONN_PRIV_ - -#include "../include/controller/ble_ll_conn.h" -#include "../include/controller/ble_ll_hci.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Definitions for min/max RX/TX time/bytes values allowed for connections. - * Source: Core 5.0 specification, Vol 6, Part B, section 4.5.10 - */ -#define BLE_LL_CONN_SUPP_TIME_MIN (328) /* usecs */ -#define BLE_LL_CONN_SUPP_TIME_MAX (17040) /* usecs */ -#define BLE_LL_CONN_SUPP_TIME_MIN_UNCODED (328) /* usecs */ -#define BLE_LL_CONN_SUPP_TIME_MAX_UNCODED (2120) /* usecs */ -#define BLE_LL_CONN_SUPP_TIME_MIN_CODED (2704) /* usecs */ -#define BLE_LL_CONN_SUPP_TIME_MAX_CODED (17040) /* usecs */ -#define BLE_LL_CONN_SUPP_BYTES_MIN (27) /* bytes */ -#define BLE_LL_CONN_SUPP_BYTES_MAX (251) /* bytes */ - -/* Connection event timing */ -#define BLE_LL_CONN_INITIAL_OFFSET (1250) -#define BLE_LL_CONN_ITVL_USECS (1250) -#define BLE_LL_CONN_TX_WIN_USECS (1250) -#define BLE_LL_CONN_TX_OFF_USECS (1250) -#define BLE_LL_CONN_CE_USECS (625) -#define BLE_LL_CONN_TX_WIN_MIN (1) /* in tx win units */ -#define BLE_LL_CONN_SLAVE_LATENCY_MAX (499) - -/* Connection handle range */ -#define BLE_LL_CONN_MAX_CONN_HANDLE (0x0EFF) - -/* Offset (in bytes) of advertising address in connect request */ -#define BLE_LL_CONN_REQ_ADVA_OFF (BLE_LL_PDU_HDR_LEN + BLE_DEV_ADDR_LEN) - -/* Default authenticated payload timeout (30 seconds; in 10 msecs increments) */ -#define BLE_LL_CONN_DEF_AUTH_PYLD_TMO (3000) -#define BLE_LL_CONN_AUTH_PYLD_OS_TMO(x) ble_npl_time_ms_to_ticks32((x) * 10) - -/* Global Link Layer connection parameters */ -struct ble_ll_conn_global_params -{ - uint8_t master_chan_map[BLE_LL_CONN_CHMAP_LEN]; - uint8_t num_used_chans; - uint8_t supp_max_tx_octets; - uint8_t supp_max_rx_octets; - uint8_t conn_init_max_tx_octets; - uint8_t sugg_tx_octets; - uint16_t sugg_tx_time; - uint16_t conn_init_max_tx_time; - uint16_t conn_init_max_tx_time_uncoded; - uint16_t conn_init_max_tx_time_coded; - uint16_t supp_max_tx_time; - uint16_t supp_max_rx_time; -}; -extern struct ble_ll_conn_global_params g_ble_ll_conn_params; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) -struct ble_ll_conn_sync_transfer_params -{ - uint32_t sync_timeout_us; - uint16_t max_skip; - uint8_t mode; -}; -extern struct ble_ll_conn_sync_transfer_params g_ble_ll_conn_sync_transfer_params; -#endif - -/* Some data structures used by other LL routines */ -SLIST_HEAD(ble_ll_conn_active_list, ble_ll_conn_sm); -STAILQ_HEAD(ble_ll_conn_free_list, ble_ll_conn_sm); -extern struct ble_ll_conn_active_list g_ble_ll_conn_active_list; -extern struct ble_ll_conn_free_list g_ble_ll_conn_free_list; - -/* Pointer to connection state machine we are trying to create */ -extern struct ble_ll_conn_sm *g_ble_ll_conn_create_sm; - -/* Generic interface */ -struct ble_ll_len_req; -struct ble_mbuf_hdr; -struct ble_ll_adv_sm; - -struct hci_create_conn -{ - uint16_t scan_itvl; - uint16_t scan_window; - uint8_t filter_policy; - uint8_t peer_addr_type; - uint8_t peer_addr[BLE_DEV_ADDR_LEN]; - uint8_t own_addr_type; - 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; -}; - -void ble_ll_conn_sm_new(struct ble_ll_conn_sm *connsm); -void ble_ll_conn_end(struct ble_ll_conn_sm *connsm, uint8_t ble_err); -void ble_ll_conn_enqueue_pkt(struct ble_ll_conn_sm *connsm, struct os_mbuf *om, - uint8_t hdr_byte, uint8_t length); -struct ble_ll_conn_sm *ble_ll_conn_sm_get(void); -void ble_ll_conn_master_init(struct ble_ll_conn_sm *connsm, - struct hci_create_conn *hcc); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -void ble_ll_conn_ext_master_init(struct ble_ll_conn_sm *connsm, - struct hci_ext_create_conn *hcc); - -void ble_ll_conn_ext_set_params(struct ble_ll_conn_sm *connsm, - struct hci_ext_conn_params *hcc_params, - int phy); -#endif - -struct ble_ll_conn_sm *ble_ll_conn_find_active_conn(uint16_t handle); -void ble_ll_conn_update_eff_data_len(struct ble_ll_conn_sm *connsm); - -/* Advertising interface */ -int ble_ll_conn_slave_start(uint8_t *rxbuf, uint8_t pat, - struct ble_mbuf_hdr *rxhdr, bool force_csa2); - -/* Link Layer interface */ -void ble_ll_conn_module_init(void); -void ble_ll_conn_set_global_chanmap(uint8_t num_used_chans, const uint8_t *chanmap); -void ble_ll_conn_module_reset(void); -void ble_ll_conn_tx_pkt_in(struct os_mbuf *om, uint16_t handle, uint16_t len); -int ble_ll_conn_rx_isr_start(struct ble_mbuf_hdr *rxhdr, uint32_t aa); -int ble_ll_conn_rx_isr_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr); -void ble_ll_conn_rx_data_pdu(struct os_mbuf *rxpdu, struct ble_mbuf_hdr *hdr); -void ble_ll_init_rx_pkt_in(uint8_t pdu_type, uint8_t *rxbuf, - struct ble_mbuf_hdr *ble_hdr); -int ble_ll_init_rx_isr_start(uint8_t pdu_type, struct ble_mbuf_hdr *ble_hdr); -int ble_ll_init_rx_isr_end(uint8_t *rxbuf, uint8_t crcok, - struct ble_mbuf_hdr *ble_hdr); -void ble_ll_conn_wfr_timer_exp(void); -void ble_ll_conn_init_wfr_timer_exp(void); -int ble_ll_conn_is_lru(struct ble_ll_conn_sm *s1, struct ble_ll_conn_sm *s2); -uint32_t ble_ll_conn_get_ce_end_time(void); -void ble_ll_conn_event_halt(void); -void ble_ll_conn_reset_pending_aux_conn_rsp(void); -bool ble_ll_conn_init_pending_aux_conn_rsp(void); -/* HCI */ -void ble_ll_disconn_comp_event_send(struct ble_ll_conn_sm *connsm, - uint8_t reason); -void ble_ll_auth_pyld_tmo_event_send(struct ble_ll_conn_sm *connsm); -int ble_ll_conn_hci_disconnect_cmd(const uint8_t *cmdbuf, uint8_t len); -int ble_ll_conn_hci_rd_rem_ver_cmd(const uint8_t *cmdbuf, uint8_t len); -int ble_ll_conn_create(const uint8_t *cmdbuf, uint8_t len); -int ble_ll_conn_hci_update(const uint8_t *cmdbuf, uint8_t len); -int ble_ll_conn_hci_set_chan_class(const uint8_t *cmdbuf, uint8_t len); -int ble_ll_conn_hci_param_rr(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen); -int ble_ll_conn_hci_param_nrr(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen); -int ble_ll_conn_create_cancel(ble_ll_hci_post_cmd_complete_cb *post_cmd_cb); -void ble_ll_conn_num_comp_pkts_event_send(struct ble_ll_conn_sm *connsm); -void ble_ll_conn_comp_event_send(struct ble_ll_conn_sm *connsm, uint8_t status, - uint8_t *evbuf, struct ble_ll_adv_sm *advsm); -void ble_ll_conn_timeout(struct ble_ll_conn_sm *connsm, uint8_t ble_err); -int ble_ll_conn_hci_chk_conn_params(uint16_t itvl_min, uint16_t itvl_max, - uint16_t latency, uint16_t spvn_tmo); -int ble_ll_conn_hci_read_rem_features(const uint8_t *cmdbuf, uint8_t len); -int ble_ll_conn_hci_rd_rssi(const uint8_t *cmdbuf, uint8_t len, uint8_t *rspbuf, - uint8_t *rsplen); -int ble_ll_conn_hci_rd_chan_map(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen); -int ble_ll_conn_hci_set_data_len(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen); -int ble_ll_conn_hci_le_start_encrypt(const uint8_t *cmdbuf, uint8_t len); -int ble_ll_conn_hci_le_ltk_reply(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen); -int ble_ll_conn_hci_le_ltk_neg_reply(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen); -int ble_ll_conn_hci_wr_auth_pyld_tmo(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen); -int ble_ll_conn_hci_rd_auth_pyld_tmo(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING) -void ble_ll_conn_auth_pyld_timer_start(struct ble_ll_conn_sm *connsm); -#else -#define ble_ll_conn_auth_pyld_timer_start(x) -#endif - -int ble_ll_hci_cmd_rx(uint8_t *cmd, void *arg); -int ble_ll_hci_acl_rx(struct os_mbuf *om, void *arg); - -int ble_ll_conn_hci_le_rd_phy(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rsp, uint8_t *rsplen); -int ble_ll_conn_hci_le_set_phy(const uint8_t *cmdbuf, uint8_t len); -int ble_ll_conn_chk_phy_upd_start(struct ble_ll_conn_sm *connsm); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -int ble_ll_ext_conn_create(const uint8_t *cmdbuf, uint8_t cmdlen); -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) -int ble_ll_set_sync_transfer_params(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen); -int ble_ll_set_default_sync_transfer_params(const uint8_t *cmdbuf, uint8_t len); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* H_BLE_LL_CONN_PRIV_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_ctrl.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_ctrl.c deleted file mode 100644 index 1d5ed929b..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_ctrl.c +++ /dev/null @@ -1,2747 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/include/nimble/hci_common.h" -#include "../include/controller/ble_ll.h" -#include "../include/controller/ble_ll_hci.h" -#include "../include/controller/ble_ll_ctrl.h" -#include "../include/controller/ble_ll_trace.h" -#include "../include/controller/ble_hw.h" -#include "../include/controller/ble_ll_sync.h" -#include "ble_ll_conn_priv.h" - -/* To use spec sample data for testing */ -#undef BLE_LL_ENCRYPT_USE_TEST_DATA - -/* - * For console debug to show session key calculation. NOTE: if you define - * this the stack requirements for the LL task go up considerably. The - * default stack will not be enough and must be increased. - */ -#undef BLE_LL_ENCRYPT_DEBUG -#ifdef BLE_LL_ENCRYPT_DEBUG -#include "console/console.h" -#endif - -/* - * XXX: - * 1) Do I need to keep track of which procedures have already been done? - * Do I need to worry about repeating procedures? - * 2) Should we create pool of control pdu's?. Dont need more - * than the # of connections and can probably deal with quite a few less - * if we have lots of connections. - * 3) What about procedures that have been completed but try to restart? - * 4) NOTE: there is a supported features procedure. However, in the case - * of data length extension, if the receiving device does not understand - * the pdu or it does not support data length extension, the LL_UNKNOWN_RSP - * pdu is sent. That needs to be processed... - * 5) We are supposed to remember when we do the data length update proc if - * the device sent us an unknown rsp. We should not send it another len req. - * Implement this how? Through remote supported features? - * 8) How to count control pdus sent. DO we count enqueued + sent, or only - * sent (actually attempted to tx). Do we count failures? How? - */ - -/* - * XXX: I definitely have an issue with control procedures and connection - * param request procedure and connection update procedure. This was - * noted when receiving an unknown response. Right now, I am getting confused - * with connection parameter request and updates regarding which procedures - * are running. So I need to go look through all the code and see where I - * used the request procedure and the update procedure and make sure I am doing - * the correct thing. - */ - -/* - * This array contains the length of the CtrData field in LL control PDU's. - * Note that there is a one byte opcode which precedes this field in the LL - * control PDU, so total data channel payload length for the control pdu is - * one greater. - */ -const uint8_t g_ble_ll_ctrl_pkt_lengths[BLE_LL_CTRL_OPCODES] = -{ - BLE_LL_CTRL_CONN_UPD_REQ_LEN, - BLE_LL_CTRL_CHAN_MAP_LEN, - BLE_LL_CTRL_TERMINATE_IND_LEN, - BLE_LL_CTRL_ENC_REQ_LEN, - BLE_LL_CTRL_ENC_RSP_LEN, - BLE_LL_CTRL_START_ENC_REQ_LEN, - BLE_LL_CTRL_START_ENC_RSP_LEN, - BLE_LL_CTRL_UNK_RSP_LEN, - BLE_LL_CTRL_FEATURE_LEN, - BLE_LL_CTRL_FEATURE_LEN, - BLE_LL_CTRL_PAUSE_ENC_REQ_LEN, - BLE_LL_CTRL_PAUSE_ENC_RSP_LEN, - BLE_LL_CTRL_VERSION_IND_LEN, - BLE_LL_CTRL_REJ_IND_LEN, - BLE_LL_CTRL_SLAVE_FEATURE_REQ_LEN, - BLE_LL_CTRL_CONN_PARAMS_LEN, - BLE_LL_CTRL_CONN_PARAMS_LEN, - BLE_LL_CTRL_REJECT_IND_EXT_LEN, - BLE_LL_CTRL_PING_LEN, - BLE_LL_CTRL_PING_LEN, - BLE_LL_CTRL_LENGTH_REQ_LEN, - BLE_LL_CTRL_LENGTH_REQ_LEN, - BLE_LL_CTRL_PHY_REQ_LEN, - BLE_LL_CTRL_PHY_RSP_LEN, - BLE_LL_CTRL_PHY_UPD_IND_LEN, - BLE_LL_CTRL_MIN_USED_CHAN_LEN, - BLE_LL_CTRL_CTE_REQ_LEN, - BLE_LL_CTRL_CTE_RSP_LEN, - BLE_LL_CTRL_PERIODIC_SYNC_IND_LEN, - BLE_LL_CTRL_CLOCK_ACCURACY_REQ_LEN, - BLE_LL_CTRL_CLOCK_ACCURACY_RSP_LEN, -}; - -/** - * Called to determine if a LL control procedure with an instant has - * been initiated. - * - * If the function returns a 0 it means no conflicting procedure has - * been initiated. Otherwise it returns the appropriate BLE error code to - * send. - * - * @param connsm Pointer to connection state machine. - * @param req_ctrl_proc The procedure that the peer is trying to initiate - * - * @return uint8_t - */ -uint8_t -ble_ll_ctrl_proc_with_instant_initiated(struct ble_ll_conn_sm *connsm, - uint8_t req_ctrl_proc) -{ - uint8_t err; - - switch (connsm->cur_ctrl_proc) { - case BLE_LL_CTRL_PROC_PHY_UPDATE: - case BLE_LL_CTRL_PROC_CONN_UPDATE: - case BLE_LL_CTRL_PROC_CONN_PARAM_REQ: - case BLE_LL_CTRL_PROC_CHAN_MAP_UPD: - if (req_ctrl_proc == connsm->cur_ctrl_proc) { - err = BLE_ERR_LMP_COLLISION; - } else if ((connsm->cur_ctrl_proc == BLE_LL_CTRL_PROC_CONN_UPDATE) && - (req_ctrl_proc == BLE_LL_CTRL_PROC_CONN_PARAM_REQ)) { - err = BLE_ERR_LMP_COLLISION; - } else { - err = BLE_ERR_DIFF_TRANS_COLL; - } - break; - default: - err = 0; - } - - return err; -} - -/** - * Create a LL_REJECT_EXT_IND pdu. - * - * @param rej_opcode Opcode to be rejected. - * @param err: error response - * @param ctrdata: Pointer to where CtrData starts in pdu - */ -void -ble_ll_ctrl_rej_ext_ind_make(uint8_t rej_opcode, uint8_t err, uint8_t *ctrdata) -{ - ctrdata[0] = rej_opcode; - ctrdata[1] = err; -} - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) -/** - * Called to cancel a phy update procedure. - * - * @param connsm - * @param ble_err - */ -void -ble_ll_ctrl_phy_update_cancel(struct ble_ll_conn_sm *connsm, uint8_t ble_err) -{ - /* cancel any pending phy update procedures */ - CLR_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_PHY_UPDATE); - - /* Check if the host wants an event */ - if (CONN_F_HOST_PHY_UPDATE(connsm)) { - ble_ll_hci_ev_phy_update(connsm, ble_err); - CONN_F_HOST_PHY_UPDATE(connsm) = 0; - } - - /* Clear any bits for phy updates that might be in progress */ - CONN_F_CTRLR_PHY_UPDATE(connsm) = 0; -} -#endif - -static int -ble_ll_ctrl_len_proc(struct ble_ll_conn_sm *connsm, uint8_t *dptr) -{ - int rc; - struct ble_ll_len_req ctrl_req; - - /* Extract parameters and check if valid */ - ctrl_req.max_rx_bytes = get_le16(dptr); - ctrl_req.max_rx_time = get_le16(dptr + 2); - ctrl_req.max_tx_bytes = get_le16(dptr + 4); - ctrl_req.max_tx_time = get_le16(dptr + 6); - - if ((ctrl_req.max_rx_bytes < BLE_LL_CONN_SUPP_BYTES_MIN) || - (ctrl_req.max_rx_time < BLE_LL_CONN_SUPP_TIME_MIN) || - (ctrl_req.max_tx_bytes < BLE_LL_CONN_SUPP_BYTES_MIN) || - (ctrl_req.max_tx_time < BLE_LL_CONN_SUPP_TIME_MIN)) { - rc = 1; - } else { - /* Update parameters */ - connsm->rem_max_rx_time = ctrl_req.max_rx_time; - connsm->rem_max_tx_time = ctrl_req.max_tx_time; - connsm->rem_max_rx_octets = ctrl_req.max_rx_bytes; - connsm->rem_max_tx_octets = ctrl_req.max_tx_bytes; - - /* Recalculate effective connection parameters */ - ble_ll_conn_update_eff_data_len(connsm); - rc = 0; - } - - return rc; -} - -/** - * Process a received LL_PING_RSP control pdu. - * - * NOTE: we dont have to reset the callout since this packet will have had a - * valid MIC and that will restart the authenticated payload timer - * - * @param connsm - */ -static void -ble_ll_ctrl_rx_ping_rsp(struct ble_ll_conn_sm *connsm) -{ - /* Stop the control procedure */ - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_LE_PING); -} - -/** - * Called when we receive either a connection parameter request or response. - * - * @param connsm - * @param dptr - * @param rspbuf - * @param opcode - * - * @return int - */ -static int -ble_ll_ctrl_conn_param_pdu_proc(struct ble_ll_conn_sm *connsm, uint8_t *dptr, - uint8_t *rspbuf, uint8_t opcode) -{ - int rc; - int indicate; - uint8_t rsp_opcode; - uint8_t ble_err; - struct ble_ll_conn_params *req; - struct hci_conn_update *hcu; - - /* Extract parameters and check if valid */ - req = &connsm->conn_cp; - req->interval_min = get_le16(dptr); - req->interval_max = get_le16(dptr + 2); - req->latency = get_le16(dptr + 4); - req->timeout = get_le16(dptr + 6); - req->pref_periodicity = dptr[8]; - req->ref_conn_event_cnt = get_le16(dptr + 9); - req->offset0 = get_le16(dptr + 11); - req->offset1 = get_le16(dptr + 13); - req->offset2 = get_le16(dptr + 15); - req->offset3 = get_le16(dptr + 17); - req->offset4 = get_le16(dptr + 19); - req->offset5 = get_le16(dptr + 21); - - /* Check if parameters are valid */ - ble_err = BLE_ERR_SUCCESS; - rc = ble_ll_conn_hci_chk_conn_params(req->interval_min, - req->interval_max, - req->latency, - req->timeout); - if (rc) { - ble_err = BLE_ERR_INV_LMP_LL_PARM; - goto conn_param_pdu_exit; - } - - /* - * Check if there is a requested change to either the interval, timeout - * or latency. If not, this may just be an anchor point change and we do - * not have to notify the host. - * XXX: what if we dont like the parameters? When do we check that out? - */ - indicate = 1; - if (opcode == BLE_LL_CTRL_CONN_PARM_REQ) { - if ((connsm->conn_itvl >= req->interval_min) && - (connsm->conn_itvl <= req->interval_max) && - (connsm->supervision_tmo == req->timeout) && - (connsm->slave_latency == req->latency)) { - indicate = 0; - goto conn_parm_req_do_indicate; - } - } - - /* - * A change has been requested. Is it within the values specified by - * the host? Note that for a master we will not be processing a - * connect param request from a slave if we are currently trying to - * update the connection parameters. This means that the previous - * check is all we need for a master (when receiving a request). - */ - if ((connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) || - (opcode == BLE_LL_CTRL_CONN_PARM_RSP)) { - /* - * Not sure what to do about the slave. It is possible that the - * current connection parameters are not the same ones as the local host - * has provided? Not sure what to do here. Do we need to remember what - * host sent us? For now, I will assume that we need to remember what - * the host sent us and check it out. - */ - hcu = &connsm->conn_param_req; - if (hcu->handle != 0) { - if (!((req->interval_min < hcu->conn_itvl_min) || - (req->interval_min > hcu->conn_itvl_max) || - (req->interval_max < hcu->conn_itvl_min) || - (req->interval_max > hcu->conn_itvl_max) || - (req->latency != hcu->conn_latency) || - (req->timeout != hcu->supervision_timeout))) { - indicate = 0; - } - } - } - -conn_parm_req_do_indicate: - /* - * XXX: are the connection update parameters acceptable? If not, we will - * need to know before we indicate to the host that they are acceptable. - */ - if (indicate) { - /* If Host masked out Remote Connection Parameter Request Event, we need to - * send Reject back to the remote device - */ - if (!ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_REM_CONN_PARM_REQ)){ - ble_err = BLE_ERR_UNSUPP_REM_FEATURE; - goto conn_param_pdu_exit; - } - - /* - * Send event to host. At this point we leave and wait to get - * an answer. - */ - ble_ll_hci_ev_rem_conn_parm_req(connsm, req); - connsm->host_reply_opcode = opcode; - connsm->csmflags.cfbit.awaiting_host_reply = 1; - rsp_opcode = 255; - } else { - /* Create reply to connection request */ - rsp_opcode = ble_ll_ctrl_conn_param_reply(connsm, rspbuf, req); - } - -conn_param_pdu_exit: - if (ble_err) { - rsp_opcode = BLE_LL_CTRL_REJECT_IND_EXT; - rspbuf[1] = opcode; - rspbuf[2] = ble_err; - } - return rsp_opcode; -} - -/** - * Called to make a connection update request LL control PDU - * - * Context: Link Layer - * - * @param connsm - * @param rsp - */ -static void -ble_ll_ctrl_conn_upd_make(struct ble_ll_conn_sm *connsm, uint8_t *pyld, - struct ble_ll_conn_params *cp) -{ - uint16_t instant; - uint32_t dt; - uint32_t num_old_ce; - uint32_t new_itvl_usecs; - uint32_t old_itvl_usecs; - struct hci_conn_update *hcu; - struct ble_ll_conn_upd_req *req; - - /* - * Set instant. We set the instant to the current event counter plus - * the amount of slave latency as the slave may not be listening - * at every connection interval and we are not sure when the connect - * request will actually get sent. We add one more event plus the - * minimum as per the spec of 6 connection events. - */ - instant = connsm->event_cntr + connsm->slave_latency + 6 + 1; - - /* - * XXX: This should change in the future, but for now we will just - * start the new instant at the same anchor using win offset 0. - */ - /* Copy parameters in connection update structure */ - hcu = &connsm->conn_param_req; - req = &connsm->conn_update_req; - if (cp) { - /* XXX: so we need to make the new anchor point some time away - * from txwinoffset by some amount of msecs. Not sure how to do - that here. We dont need to, but we should. */ - /* Calculate offset from requested offsets (if any) */ - if (cp->offset0 != 0xFFFF) { - new_itvl_usecs = cp->interval_max * BLE_LL_CONN_ITVL_USECS; - old_itvl_usecs = connsm->conn_itvl * BLE_LL_CONN_ITVL_USECS; - if ((int16_t)(cp->ref_conn_event_cnt - instant) >= 0) { - num_old_ce = cp->ref_conn_event_cnt - instant; - dt = old_itvl_usecs * num_old_ce; - dt += (cp->offset0 * BLE_LL_CONN_ITVL_USECS); - dt = dt % new_itvl_usecs; - } else { - num_old_ce = instant - cp->ref_conn_event_cnt; - dt = old_itvl_usecs * num_old_ce; - dt -= (cp->offset0 * BLE_LL_CONN_ITVL_USECS); - dt = dt % new_itvl_usecs; - dt = new_itvl_usecs - dt; - } - req->winoffset = dt / BLE_LL_CONN_TX_WIN_USECS; - } else { - req->winoffset = 0; - } - req->interval = cp->interval_max; - req->timeout = cp->timeout; - req->latency = cp->latency; - req->winsize = 1; - } else { - req->interval = hcu->conn_itvl_max; - req->timeout = hcu->supervision_timeout; - req->latency = hcu->conn_latency; - req->winoffset = 0; - req->winsize = connsm->tx_win_size; - } - req->instant = instant; - - /* XXX: make sure this works for the connection parameter request proc. */ - pyld[0] = req->winsize; - put_le16(pyld + 1, req->winoffset); - put_le16(pyld + 3, req->interval); - put_le16(pyld + 5, req->latency); - put_le16(pyld + 7, req->timeout); - put_le16(pyld + 9, instant); - - /* Set flag in state machine to denote we have scheduled an update */ - connsm->csmflags.cfbit.conn_update_sched = 1; -} - -/** - * Called to process and UNKNOWN_RSP LL control packet. - * - * Context: Link Layer Task - * - * @param dptr - */ -static int -ble_ll_ctrl_proc_unk_rsp(struct ble_ll_conn_sm *connsm, uint8_t *dptr, uint8_t *rspdata) -{ - uint8_t ctrl_proc; - uint8_t opcode; - - /* Get opcode of unknown LL control frame */ - opcode = dptr[0]; - - /* Convert opcode to control procedure id */ - switch (opcode) { - case BLE_LL_CTRL_LENGTH_REQ: - ctrl_proc = BLE_LL_CTRL_PROC_DATA_LEN_UPD; - BLE_LL_CONN_CLEAR_FEATURE(connsm, BLE_LL_FEAT_DATA_LEN_EXT); - break; - case BLE_LL_CTRL_CONN_UPDATE_IND: - ctrl_proc = BLE_LL_CTRL_PROC_CONN_UPDATE; - break; - case BLE_LL_CTRL_SLAVE_FEATURE_REQ: - ctrl_proc = BLE_LL_CTRL_PROC_FEATURE_XCHG; - BLE_LL_CONN_CLEAR_FEATURE(connsm, BLE_LL_FEAT_SLAVE_INIT); - break; - case BLE_LL_CTRL_CONN_PARM_REQ: - BLE_LL_CONN_CLEAR_FEATURE(connsm, BLE_LL_FEAT_CONN_PARM_REQ); - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - ble_ll_ctrl_conn_upd_make(connsm, rspdata, NULL); - connsm->reject_reason = BLE_ERR_SUCCESS; - return BLE_LL_CTRL_CONN_UPDATE_IND; - } - /* note: fall-through intentional */ - case BLE_LL_CTRL_CONN_PARM_RSP: - ctrl_proc = BLE_LL_CTRL_PROC_CONN_PARAM_REQ; - break; - case BLE_LL_CTRL_PING_REQ: - /* LL can authenticate remote device even if remote device does not - * support LE Ping feature. - */ - ctrl_proc = BLE_LL_CTRL_PROC_LE_PING; - BLE_LL_CONN_CLEAR_FEATURE(connsm, BLE_LL_FEAT_LE_PING); - break; -#if (BLE_LL_BT5_PHY_SUPPORTED ==1) - case BLE_LL_CTRL_PHY_REQ: - ble_ll_ctrl_phy_update_cancel(connsm, BLE_ERR_UNSUPP_REM_FEATURE); - ctrl_proc = BLE_LL_CTRL_PROC_PHY_UPDATE; - break; -#endif - default: - ctrl_proc = BLE_LL_CTRL_PROC_NUM; - break; - } - - /* If we are running this one currently, stop it */ - if (connsm->cur_ctrl_proc == ctrl_proc) { - /* Stop the control procedure */ - ble_ll_ctrl_proc_stop(connsm, ctrl_proc); - if (ctrl_proc == BLE_LL_CTRL_PROC_CONN_PARAM_REQ) { - ble_ll_hci_ev_conn_update(connsm, BLE_ERR_UNSUPP_REM_FEATURE); - } else if (ctrl_proc == BLE_LL_CTRL_PROC_FEATURE_XCHG) { - if (connsm->csmflags.cfbit.pending_hci_rd_features) { - ble_ll_hci_ev_rd_rem_used_feat(connsm, - BLE_ERR_UNSUPP_REM_FEATURE); - } - connsm->csmflags.cfbit.pending_hci_rd_features = 0; - } - } - - return BLE_ERR_MAX; -} - -/** - * Callback when LL control procedure times out (for a given connection). If - * this is called, it means that we need to end the connection because it - * has not responded to a LL control request. - * - * Context: Link Layer - * - * @param arg Pointer to connection state machine. - */ -static void -ble_ll_ctrl_proc_rsp_timer_cb(struct ble_npl_event *ev) -{ - /* Control procedure has timed out. Kill the connection */ - ble_ll_conn_timeout((struct ble_ll_conn_sm *)ble_npl_event_get_arg(ev), - BLE_ERR_LMP_LL_RSP_TMO); -} - -static void -ble_ll_ctrl_start_rsp_timer(struct ble_ll_conn_sm *connsm) -{ - ble_npl_callout_init(&connsm->ctrl_proc_rsp_timer, - &g_ble_ll_data.ll_evq, - ble_ll_ctrl_proc_rsp_timer_cb, - connsm); - - /* Re-start timer. Control procedure timeout is 40 seconds */ - ble_npl_callout_reset(&connsm->ctrl_proc_rsp_timer, - ble_npl_time_ms_to_ticks32(BLE_LL_CTRL_PROC_TIMEOUT_MS)); -} - -/** - * Convert a phy mask to a numeric phy value. - * - * NOTE: only one bit should be set here and there should be at least one. - * If this function returns a 0 it is an error! - * - * @param phy_mask Bitmask of phy - * - * @return uint8_t The numeric value associated with the phy mask - * - * BLE_HCI_LE_PHY_1M (1) - * BLE_HCI_LE_PHY_2M (2) - * BLE_HCI_LE_PHY_CODED (3) - */ -uint8_t -ble_ll_ctrl_phy_from_phy_mask(uint8_t phy_mask) -{ - uint8_t phy; - - /* - * NOTE: wipe out unsupported PHYs. There should not be an unsupported - * in this mask if the other side is working correctly. - */ -#if !MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) - phy_mask &= ~BLE_HCI_LE_PHY_2M_PREF_MASK; -#endif -#if !MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - phy_mask &= ~BLE_HCI_LE_PHY_CODED_PREF_MASK; -#endif - - if (phy_mask & BLE_PHY_MASK_1M) { - phy = BLE_PHY_1M; - phy_mask &= ~BLE_PHY_MASK_1M; - } else if (phy_mask & BLE_PHY_MASK_2M) { - phy = BLE_PHY_2M; - phy_mask &= ~BLE_PHY_MASK_2M; - } else if (phy_mask & BLE_PHY_MASK_CODED) { - phy = BLE_PHY_CODED; - phy_mask &= ~BLE_PHY_MASK_CODED; - } else { - phy = 0; - } - - if (phy_mask != 0) { - phy = 0; - } - - return phy; -} - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) -uint8_t -ble_ll_ctrl_phy_tx_transition_get(uint8_t phy_mask) -{ - /* - * Evaluate PHYs in transition starting from the one with longest TX time - * so we select the one that allows shortest payload to be sent. This is - * to make sure we do not violate timing restriction on new PHY. - */ - if (phy_mask & BLE_PHY_MASK_CODED) { - return BLE_PHY_CODED; - } else if (phy_mask & BLE_PHY_MASK_1M) { - return BLE_PHY_1M; - } else if (phy_mask & BLE_PHY_MASK_2M) { - return BLE_PHY_2M; - } - - return 0; -} - -void -ble_ll_ctrl_phy_update_proc_complete(struct ble_ll_conn_sm *connsm) -{ - int chk_proc_stop; - int chk_host_phy; - - chk_proc_stop = 1; - chk_host_phy = 1; - - connsm->phy_tx_transition = 0; - - if (CONN_F_PEER_PHY_UPDATE(connsm)) { - CONN_F_PEER_PHY_UPDATE(connsm) = 0; - } else if (CONN_F_CTRLR_PHY_UPDATE(connsm)) { - CONN_F_CTRLR_PHY_UPDATE(connsm) = 0; - } else { - /* Must be a host-initiated update */ - CONN_F_HOST_PHY_UPDATE(connsm) = 0; - chk_host_phy = 0; - if (CONN_F_PHY_UPDATE_EVENT(connsm) == 0) { - ble_ll_hci_ev_phy_update(connsm, BLE_ERR_SUCCESS); - } - } - - /* Must check if we need to start host procedure */ - if (chk_host_phy) { - if (CONN_F_HOST_PHY_UPDATE(connsm)) { - if (ble_ll_conn_chk_phy_upd_start(connsm)) { - CONN_F_HOST_PHY_UPDATE(connsm) = 0; - } else { - chk_proc_stop = 0; - } - } - } - - if (chk_proc_stop) { - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_PHY_UPDATE); - } -} - -/** - * - * There is probably a better way for the controller to choose which PHY use. - * There are no BER metrics and RSSI does not give you S/N so for now we will - * choose this heirarchy: - * -> if 2Mbps available, use it. - * -> If 1Mbps available, use it. - * -> otherwise use coded phy. - * - * @param prefs The mask of preferred phys - * @return uint8_t The phy to use (not a mask) - */ -static uint8_t -ble_ll_ctrl_find_new_phy(uint8_t phy_mask_prefs) -{ - uint8_t new_phy; - - new_phy = phy_mask_prefs; - if (new_phy) { - if (new_phy & BLE_PHY_MASK_2M) { - new_phy = BLE_PHY_2M; - } else if (new_phy & BLE_PHY_MASK_1M) { - new_phy = BLE_PHY_1M; - } else { - new_phy = BLE_PHY_CODED; - } - } - - return new_phy; -} - -/** - * Create a LL_PHY_UPDATE_IND pdu - * - * @param connsm Pointer to connection state machine - * @param dptr Pointer to PHY_REQ or PHY_RSP data. - * @param ctrdata: Pointer to where CtrData of UPDATE_IND pdu starts - * @param slave_req flag denoting if slave requested this. 0: no 1:yes - */ -static void -ble_ll_ctrl_phy_update_ind_make(struct ble_ll_conn_sm *connsm, uint8_t *dptr, - uint8_t *ctrdata, int slave_req) -{ - uint8_t m_to_s; - uint8_t s_to_m; - uint8_t tx_phys; - uint8_t rx_phys; - uint16_t instant; - uint8_t is_slave_sym = 0; - - /* Get preferences from PDU */ - tx_phys = dptr[0]; - rx_phys = dptr[1]; - - /* If we are master, check if slave requested symmetric PHY */ - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - is_slave_sym = tx_phys == rx_phys; - is_slave_sym &= __builtin_popcount(tx_phys) == 1; - } - - /* Get m_to_s and s_to_m masks */ - if (slave_req) { - m_to_s = connsm->phy_data.host_pref_tx_phys_mask & rx_phys; - s_to_m = connsm->phy_data.host_pref_rx_phys_mask & tx_phys; - } else { - m_to_s = connsm->phy_data.req_pref_tx_phys_mask & rx_phys; - s_to_m = connsm->phy_data.req_pref_rx_phys_mask & tx_phys; - } - - if (is_slave_sym) { - /* - * If either s_to_m or m_to_s is 0, it means for at least one direction - * requested PHY is not our preferred one so make sure we keep current - * PHY in both directions - * - * Core 5.2, Vol 6, PartB, 5.1.10 - * If the slave specified a single PHY in both the TX_PHYS and - * RX_PHYS fields and both fields are the same, the master shall - * either select the PHY specified by the slave for both directions - * or shall leave both directions unchanged. - */ - if ((s_to_m == 0) || (m_to_s == 0)) { - s_to_m = 0; - m_to_s = 0; - } else { - BLE_LL_ASSERT(s_to_m == m_to_s); - } - } - - /* Calculate new PHYs to use */ - m_to_s = ble_ll_ctrl_find_new_phy(m_to_s); - s_to_m = ble_ll_ctrl_find_new_phy(s_to_m); - - /* Make sure we do not indicate PHY change if the same as current one */ - if (m_to_s == connsm->phy_data.cur_tx_phy) { - m_to_s = 0; - } - if (s_to_m == connsm->phy_data.cur_rx_phy) { - s_to_m = 0; - } - - /* At this point, m_to_s and s_to_m are not masks; they are numeric */ - - /* - * If not changing we still send update ind. Check if hosts expects - * the event and if so send it. Stop control procedure if it is the - * one running. - */ - if ((m_to_s == 0) && (s_to_m == 0)) { - if (CONN_F_PEER_PHY_UPDATE(connsm)) { - CONN_F_PEER_PHY_UPDATE(connsm) = 0; - } else if (CONN_F_CTRLR_PHY_UPDATE(connsm)) { - CONN_F_CTRLR_PHY_UPDATE(connsm) = 0; - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_PHY_UPDATE); - } else { - ble_ll_hci_ev_phy_update(connsm, BLE_ERR_SUCCESS); - CONN_F_HOST_PHY_UPDATE(connsm) = 0; - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_PHY_UPDATE); - } - instant = 0; - } else { - /* Determine instant we will use. 6 more is minimum */ - instant = connsm->event_cntr + connsm->slave_latency + 6 + 1; - connsm->phy_instant = instant; - CONN_F_PHY_UPDATE_SCHED(connsm) = 1; - - /* Set new phys to use when instant occurs */ - connsm->phy_data.new_tx_phy = m_to_s; - connsm->phy_data.new_rx_phy = s_to_m; - - /* Convert m_to_s and s_to_m to masks */ - if (m_to_s) { - m_to_s = 1 << (m_to_s - 1); - } - - if (s_to_m) { - s_to_m = 1 << (s_to_m - 1); - } - } - - ctrdata[0] = m_to_s; - ctrdata[1] = s_to_m; - put_le16(ctrdata + 2, instant); -} - -/** - * Create a LL_PHY_REQ or LL_PHY_RSP pdu - * - * @param connsm Pointer to connection state machine - * @param ctrdata: Pointer to where CtrData starts in pdu - */ -static void -ble_ll_ctrl_phy_req_rsp_make(struct ble_ll_conn_sm *connsm, uint8_t *ctrdata) -{ - /* If no preference we use current phy */ - if (connsm->phy_data.host_pref_tx_phys_mask == 0) { - ctrdata[0] = CONN_CUR_TX_PHY_MASK(connsm); - } else { - ctrdata[0] = connsm->phy_data.host_pref_tx_phys_mask; - } - if (connsm->phy_data.host_pref_rx_phys_mask == 0) { - ctrdata[1] = CONN_CUR_RX_PHY_MASK(connsm); - } else { - ctrdata[1] = connsm->phy_data.host_pref_rx_phys_mask; - } -} - -static uint8_t -ble_ll_ctrl_rx_phy_req(struct ble_ll_conn_sm *connsm, uint8_t *req, - uint8_t *rsp) -{ - uint8_t rsp_opcode; - uint8_t err; - - /* - * XXX: TODO if we have an instant in progress we should end connection. - * At least it seems that is the case. Need to figure out more from - * the spec here. - */ - - /* Check if we have already initiated a procedure with an instant */ - err = ble_ll_ctrl_proc_with_instant_initiated(connsm, - BLE_LL_CTRL_PROC_PHY_UPDATE); - - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - if (err) { - ble_ll_ctrl_rej_ext_ind_make(BLE_LL_CTRL_PHY_REQ, err, rsp); - rsp_opcode = BLE_LL_CTRL_REJECT_IND_EXT; - } else { - /* - * NOTE: do not change order of these two lines as the call to - * make the LL_PHY_UPDATE_IND pdu might clear the flag. - */ - CONN_F_PEER_PHY_UPDATE(connsm) = 1; - ble_ll_ctrl_phy_update_ind_make(connsm, req, rsp, 1); - rsp_opcode = BLE_LL_CTRL_PHY_UPDATE_IND; - } - } else { - /* XXX: deal with other control procedures that we need to stop */ - if (err) { - if (connsm->cur_ctrl_proc == BLE_LL_CTRL_PROC_PHY_UPDATE) { - ble_npl_callout_stop(&connsm->ctrl_proc_rsp_timer); - connsm->cur_ctrl_proc = BLE_LL_CTRL_PROC_IDLE; - } - - /* If there is a PHY update procedure pending cancel it */ - ble_ll_ctrl_phy_update_cancel(connsm, err); - - /* XXX: ? Should not be any phy update events */ - CONN_F_PHY_UPDATE_EVENT(connsm) = 0; - } - - /* XXX: TODO: if we started another procedure with an instant - * why are we doing this? Need to look into this.*/ - - /* Respond to master's phy update procedure */ - CONN_F_PEER_PHY_UPDATE(connsm) = 1; - ble_ll_ctrl_phy_req_rsp_make(connsm, rsp); - rsp_opcode = BLE_LL_CTRL_PHY_RSP; - - connsm->phy_tx_transition = ble_ll_ctrl_phy_tx_transition_get(req[1] | rsp[0]); - - /* Start response timer */ - connsm->cur_ctrl_proc = BLE_LL_CTRL_PROC_PHY_UPDATE; - ble_ll_ctrl_start_rsp_timer(connsm); - } - return rsp_opcode; -} - -/** - * Process a received LL_PHY_RSP pdu - * - * @param connsm - * @param dptr Pointer to LL_PHY_RSP ctrdata - * @param rsp Pointer to CtrData of PHY_UPDATE_IND. - * - * @return uint8_t - */ -static uint8_t -ble_ll_ctrl_rx_phy_rsp(struct ble_ll_conn_sm *connsm, uint8_t *dptr, - uint8_t *rsp) -{ - uint8_t rsp_opcode; - - rsp_opcode = BLE_ERR_MAX; - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - if (connsm->cur_ctrl_proc == BLE_LL_CTRL_PROC_PHY_UPDATE) { - ble_ll_ctrl_phy_update_ind_make(connsm, dptr, rsp, 0); - ble_npl_callout_stop(&connsm->ctrl_proc_rsp_timer); - rsp_opcode = BLE_LL_CTRL_PHY_UPDATE_IND; - } - - /* - * If not in the process of doing this control procedure something - * is wrong. End connection? Assert? - * - * XXX: TODO count some stat? - */ - } else { - rsp_opcode = BLE_LL_CTRL_UNKNOWN_RSP; - } - - /* NOTE: slave should never receive one of these */ - - return rsp_opcode; -} - -/** - * Called when a LL_PHY_UPDATE_IND pdu is received - * - * NOTE: slave is the only device that should receive this. - * - * @param connsm - * @param dptr - * - * @return uint8_t - */ -static uint8_t -ble_ll_ctrl_rx_phy_update_ind(struct ble_ll_conn_sm *connsm, uint8_t *dptr) -{ - int no_change; - uint8_t new_m_to_s_mask; - uint8_t new_s_to_m_mask; - uint8_t new_tx_phy; - uint8_t new_rx_phy; - uint16_t instant; - uint16_t delta; - - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - return BLE_LL_CTRL_UNKNOWN_RSP; - } - - /* - * Reception stops the procedure response timer but does not - * complete the procedure - */ - if (connsm->cur_ctrl_proc == BLE_LL_CTRL_PROC_PHY_UPDATE) { - ble_npl_callout_stop(&connsm->ctrl_proc_rsp_timer); - } - - /* - * XXX: Should we check to see if we are expecting to receive one - * of these, and if not, kill connection? Meaning we better be - * doing either a PEER, CTRLR, or HOST phy update. - */ - /* get the new phy masks and see if we need to change */ - new_m_to_s_mask = dptr[0]; - new_s_to_m_mask = dptr[1]; - instant = get_le16(dptr + 2); - - if ((new_m_to_s_mask == 0) && (new_s_to_m_mask == 0)) { - /* No change in phy */ - no_change = 1; - } else { - no_change = 0; - /* - * NOTE: from the slaves perspective, the m to s phy is the one - * that the slave will receive on; s to m is the one it will - * transmit on - */ - new_rx_phy = ble_ll_ctrl_phy_from_phy_mask(new_m_to_s_mask); - new_tx_phy = ble_ll_ctrl_phy_from_phy_mask(new_s_to_m_mask); - - if ((new_tx_phy == 0) && (new_rx_phy == 0)) { - /* XXX: this is an error! What to do??? */ - no_change = 1; - } - - if ((new_tx_phy == connsm->phy_data.cur_tx_phy) && - (new_rx_phy == connsm->phy_data.cur_rx_phy)) { - no_change = 1; - } - } - - if (!no_change) { - /* If instant is in the past, we have to end the connection */ - delta = (instant - connsm->event_cntr) & 0xFFFF; - if (delta >= 32767) { - ble_ll_conn_timeout(connsm, BLE_ERR_INSTANT_PASSED); - } else { - connsm->phy_data.new_tx_phy = new_tx_phy; - connsm->phy_data.new_rx_phy = new_rx_phy; - connsm->phy_instant = instant; - CONN_F_PHY_UPDATE_SCHED(connsm) = 1; - } - return BLE_ERR_MAX; - } - - ble_ll_ctrl_phy_update_proc_complete(connsm); - - return BLE_ERR_MAX; -} -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) -/** - * Called when a BLE_LL_CTRL_PERIODIC_SYNC_IND PDU is received - * - * @param connsm - * @param dptr - * - * @return uint8_t - */ -static uint8_t -ble_ll_ctrl_rx_periodic_sync_ind(struct ble_ll_conn_sm *connsm, uint8_t *dptr) -{ - if (connsm->sync_transfer_mode) { - ble_ll_sync_periodic_ind(connsm, dptr, connsm->sync_transfer_mode == 1, - connsm->sync_transfer_skip, - connsm->sync_transfer_sync_timeout); - } - - return BLE_ERR_MAX; -} -#endif - -/** - * Create a link layer length request or length response PDU. - * - * NOTE: this function does not set the LL data pdu header nor does it - * set the opcode in the buffer. - * - * @param connsm - * @param dptr: Pointer to where control pdu payload starts - */ -static void -ble_ll_ctrl_datalen_upd_make(struct ble_ll_conn_sm *connsm, uint8_t *dptr) -{ - put_le16(dptr + 1, connsm->max_rx_octets); - put_le16(dptr + 3, connsm->max_rx_time); - put_le16(dptr + 5, connsm->max_tx_octets); - put_le16(dptr + 7, connsm->max_tx_time); -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) -void -ble_ll_calc_session_key(struct ble_ll_conn_sm *connsm) -{ -#ifdef BLE_LL_ENCRYPT_DEBUG - int cnt; -#endif - - /* XXX: possibly have some way out of this if this locks up */ - while (1) { - if (!ble_hw_encrypt_block(&connsm->enc_data.enc_block)) { - break; - } - } - -#ifdef BLE_LL_ENCRYPT_DEBUG - console_printf("Calculating Session Key for handle=%u", - connsm->conn_handle); - - console_printf("\nLTK:"); - for (cnt = 0; cnt < 16; ++cnt) { - console_printf("%02x", connsm->enc_data.enc_block.key[cnt]); - } - console_printf("\nSKD:"); - for (cnt = 0; cnt < 16; ++cnt) { - console_printf("%02x", connsm->enc_data.enc_block.plain_text[cnt]); - } - console_printf("\nSession Key:"); - for (cnt = 0; cnt < 16; ++cnt) { - console_printf("%02x", connsm->enc_data.enc_block.cipher_text[cnt]); - } - console_printf("\nIV:"); - for (cnt = 0; cnt < 8; ++ cnt) { - console_printf("%02x", connsm->enc_data.iv[cnt]); - } - console_printf("\n"); -#endif -} - -/** - * Called to determine if this is a control PDU we are allowed to send. This - * is called when a link is being encrypted, as only certain control PDU's - * area lowed to be sent. - * - * XXX: the current code may actually allow some control pdu's to be sent - * in states where they shouldnt. I dont expect those states to occur so I - * dont try to check for them but we could do more... for example there are - * different PDUs allowed for master/slave and TX/RX - * - * @param llid - * @param opcode - * @param len - * - * @return int - */ -static int -ble_ll_ctrl_enc_allowed_pdu(uint8_t llid, uint8_t len, uint8_t opcode) -{ - int allowed; - - allowed = 0; - - switch (llid) { - case BLE_LL_LLID_CTRL: - switch (opcode) { - case BLE_LL_CTRL_REJECT_IND: - case BLE_LL_CTRL_REJECT_IND_EXT: - case BLE_LL_CTRL_START_ENC_RSP: - case BLE_LL_CTRL_START_ENC_REQ: - case BLE_LL_CTRL_ENC_REQ: - case BLE_LL_CTRL_ENC_RSP: - case BLE_LL_CTRL_PAUSE_ENC_REQ: - case BLE_LL_CTRL_PAUSE_ENC_RSP: - case BLE_LL_CTRL_TERMINATE_IND: - allowed = 1; - break; - } - break; - case BLE_LL_LLID_DATA_FRAG: - if (len == 0) { - /* Empty PDUs are allowed */ - allowed = 1; - } - break; - } - - return allowed; -} - -int -ble_ll_ctrl_enc_allowed_pdu_rx(struct os_mbuf *rxpdu) -{ - uint8_t llid; - uint8_t len; - uint8_t opcode; - - llid = rxpdu->om_data[0] & BLE_LL_DATA_HDR_LLID_MASK; - len = rxpdu->om_data[1]; - if (llid == BLE_LL_LLID_CTRL) { - opcode = rxpdu->om_data[2]; - } else { - opcode = 0; - } - - return ble_ll_ctrl_enc_allowed_pdu(llid, len, opcode); -} - -int -ble_ll_ctrl_enc_allowed_pdu_tx(struct os_mbuf_pkthdr *pkthdr) -{ - struct os_mbuf *m; - struct ble_mbuf_hdr *ble_hdr; - uint8_t llid; - uint8_t len; - uint8_t opcode; - - m = OS_MBUF_PKTHDR_TO_MBUF(pkthdr); - ble_hdr = BLE_MBUF_HDR_PTR(m); - - llid = ble_hdr->txinfo.hdr_byte & BLE_LL_DATA_HDR_LLID_MASK; - len = ble_hdr->txinfo.pyld_len; - if (llid == BLE_LL_LLID_CTRL) { - opcode = m->om_data[0]; - } else { - opcode = 0; - } - - return ble_ll_ctrl_enc_allowed_pdu(llid, len, opcode); -} - -int -ble_ll_ctrl_is_start_enc_rsp(struct os_mbuf *txpdu) -{ - int is_start_enc_rsp; - uint8_t opcode; - uint8_t llid; - struct ble_mbuf_hdr *ble_hdr; - - is_start_enc_rsp = 0; - ble_hdr = BLE_MBUF_HDR_PTR(txpdu); - - llid = ble_hdr->txinfo.hdr_byte & BLE_LL_DATA_HDR_LLID_MASK; - if (llid == BLE_LL_LLID_CTRL) { - opcode = txpdu->om_data[0]; - if (opcode == BLE_LL_CTRL_START_ENC_RSP) { - is_start_enc_rsp = 1; - } - } - - return is_start_enc_rsp; -} - -/** - * Called to create and send a LL_START_ENC_REQ - * - * @param connsm - * @param err - * - * @return int - */ -int -ble_ll_ctrl_start_enc_send(struct ble_ll_conn_sm *connsm) -{ - int rc; - struct os_mbuf *om; - - om = os_msys_get_pkthdr(BLE_LL_CTRL_MAX_PDU_LEN, - sizeof(struct ble_mbuf_hdr)); - if (om) { - om->om_data[0] = BLE_LL_CTRL_START_ENC_REQ; - ble_ll_conn_enqueue_pkt(connsm, om, BLE_LL_LLID_CTRL, 1); - - /* Wait for LL_START_ENC_RSP. If there is already procedure in progress, - * LL response timer is already running. - */ - if (connsm->cur_ctrl_proc == BLE_LL_CTRL_PROC_IDLE) { - connsm->cur_ctrl_proc = BLE_LL_CTRL_PROC_ENCRYPT; - ble_ll_ctrl_start_rsp_timer(connsm); - } - - rc = 0; - } else { - rc = -1; - } - return rc; -} - -/** - * Create a link layer control "encrypt request" PDU. - * - * The LL_ENC_REQ PDU format is: - * Rand (8) - * EDIV (2) - * SKDm (8) - * IVm (4) - * - * The random number and encrypted diversifier come from the host command. - * Controller generates master portion of SDK and IV. - * - * NOTE: this function does not set the LL data pdu header nor does it - * set the opcode in the buffer. - * - * @param connsm - * @param dptr: Pointer to where control pdu payload starts - */ -static void -ble_ll_ctrl_enc_req_make(struct ble_ll_conn_sm *connsm, uint8_t *dptr) -{ - put_le64(dptr, connsm->enc_data.host_rand_num); - put_le16(dptr + 8, connsm->enc_data.enc_div); - -#ifdef BLE_LL_ENCRYPT_USE_TEST_DATA - /* IV stored LSB to MSB, IVm is LSB, IVs is MSB */ - put_le64(dptr + 10, g_bletest_SKDm); - swap_buf(connsm->enc_data.enc_block.plain_text + 8, dptr + 10, 8); - put_le32(dptr + 18, g_bletest_IVm); - memcpy(connsm->enc_data.iv, dptr + 18, 4); - return; -#endif - - ble_ll_rand_data_get(connsm->enc_data.enc_block.plain_text + 8, 8); - swap_buf(dptr + 10, connsm->enc_data.enc_block.plain_text + 8, 8); - ble_ll_rand_data_get(connsm->enc_data.iv, 4); - memcpy(dptr + 18, connsm->enc_data.iv, 4); -} - -/** - * Called when LL_ENC_RSP is received by the master. - * - * Context: Link Layer Task. - * - * Format of the LL_ENC_RSP is: - * SKDs (8) - * IVs (4) - * - * The master now has the long term key (from the start encrypt command) - * and the SKD (stored in the plain text encryption block). From this the - * sessionKey is generated. - * - * @param connsm - * @param dptr - */ -static void -ble_ll_ctrl_rx_enc_rsp(struct ble_ll_conn_sm *connsm, uint8_t *dptr) -{ - /* Calculate session key now that we have received the ENC_RSP */ - if (connsm->cur_ctrl_proc == BLE_LL_CTRL_PROC_ENCRYPT) { - /* In case we were already encrypted we need to reset packet counters */ - connsm->enc_data.rx_pkt_cntr = 0; - connsm->enc_data.tx_pkt_cntr = 0; - connsm->enc_data.tx_encrypted = 0; - - swap_buf(connsm->enc_data.enc_block.plain_text, dptr, 8); - memcpy(connsm->enc_data.iv + 4, dptr + 8, 4); - ble_ll_calc_session_key(connsm); - connsm->enc_data.enc_state = CONN_ENC_S_START_ENC_REQ_WAIT; - } -} - -/** - * Called when we have received a LL control encryption request PDU. This - * should only be received by a slave. - * - * The LL_ENC_REQ PDU format is: - * Rand (8) - * EDIV (2) - * SKDm (8) - * IVm (4) - * - * This function returns the response opcode. Typically this will be ENC_RSP - * but it could be a reject ind. Note that the caller of this function - * will send the REJECT_IND_EXT if supported by remote. - * - * NOTE: if this is received by a master we will silently discard the PDU - * (denoted by return BLE_ERR_MAX). - * - * @param connsm - * @param dptr Pointer to start of encrypt request data. - * @param rspbuf - */ -static uint8_t -ble_ll_ctrl_rx_enc_req(struct ble_ll_conn_sm *connsm, uint8_t *dptr, - uint8_t *rspdata) -{ - if (connsm->conn_role != BLE_LL_CONN_ROLE_SLAVE) { - return BLE_LL_CTRL_UNKNOWN_RSP; - } - - connsm->enc_data.enc_state = CONN_ENC_S_LTK_REQ_WAIT; - - /* In case we were already encrypted we need to reset packet counters */ - connsm->enc_data.rx_pkt_cntr = 0; - connsm->enc_data.tx_pkt_cntr = 0; - connsm->enc_data.tx_encrypted = 0; - - /* Extract information from request */ - connsm->enc_data.host_rand_num = get_le64(dptr); - connsm->enc_data.enc_div = get_le16(dptr + 8); - -#if BLE_LL_ENCRYPT_USE_TEST_DATA - swap_buf(connsm->enc_data.enc_block.plain_text + 8, dptr + 10, 8); - memcpy(connsm->enc_data.iv, dptr + 18, 4); - - put_le64(rspdata, g_bletest_SKDs); - swap_buf(connsm->enc_data.enc_block.plain_text, rspdata, 8); - put_le32(rspdata + 8, g_bletest_IVs); - memcpy(connsm->enc_data.iv + 4, rspdata + 8, 4); - return BLE_LL_CTRL_ENC_RSP; -#endif - - swap_buf(connsm->enc_data.enc_block.plain_text + 8, dptr + 10, 8); - memcpy(connsm->enc_data.iv, dptr + 18, 4); - - /* Create the ENC_RSP. Concatenate our SKD and IV */ - ble_ll_rand_data_get(connsm->enc_data.enc_block.plain_text, 8); - swap_buf(rspdata, connsm->enc_data.enc_block.plain_text, 8); - ble_ll_rand_data_get(connsm->enc_data.iv + 4, 4); - memcpy(rspdata + 8, connsm->enc_data.iv + 4, 4); - - return BLE_LL_CTRL_ENC_RSP; -} - -static uint8_t -ble_ll_ctrl_rx_start_enc_req(struct ble_ll_conn_sm *connsm) -{ - int rc; - - /* Only master should receive start enc request */ - rc = BLE_ERR_MAX; - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - /* We only want to send a START_ENC_RSP if we havent yet */ - if (connsm->enc_data.enc_state == CONN_ENC_S_START_ENC_REQ_WAIT) { - connsm->enc_data.enc_state = CONN_ENC_S_START_ENC_RSP_WAIT; - rc = BLE_LL_CTRL_START_ENC_RSP; - } - } else { - rc = BLE_LL_CTRL_UNKNOWN_RSP; - } - return rc; -} - -static uint8_t -ble_ll_ctrl_rx_pause_enc_req(struct ble_ll_conn_sm *connsm) -{ - int rc; - - /* - * The spec does not say what to do here, but if we receive a pause - * encryption request and we are not encrypted, what do we do? We - * ignore it... - */ - rc = BLE_ERR_MAX; - if ((connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) && - (connsm->enc_data.enc_state == CONN_ENC_S_ENCRYPTED)) { - rc = BLE_LL_CTRL_PAUSE_ENC_RSP; - } else { - rc = BLE_LL_CTRL_UNKNOWN_RSP; - } - - return rc; -} - -/** - * Called when a LL control pdu with opcode PAUSE_ENC_RSP is received. - * - * - * @param connsm - * - * @return uint8_t - */ -static uint8_t -ble_ll_ctrl_rx_pause_enc_rsp(struct ble_ll_conn_sm *connsm) -{ - int rc; - - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - rc = BLE_LL_CTRL_PAUSE_ENC_RSP; - } else if (connsm->enc_data.enc_state == CONN_ENC_S_PAUSE_ENC_RSP_WAIT) { - /* Master sends back unencrypted LL_PAUSE_ENC_RSP. - * From this moment encryption is paused. - */ - rc = BLE_ERR_MAX; - connsm->enc_data.enc_state = CONN_ENC_S_PAUSED; - } else { - rc = BLE_LL_CTRL_UNKNOWN_RSP; - } - - return rc; -} - -/** - * Called when we have received a LL_CTRL_START_ENC_RSP. - * - * Context: Link-layer task - * - * @param connsm - * - * @return uint8_t - */ -static uint8_t -ble_ll_ctrl_rx_start_enc_rsp(struct ble_ll_conn_sm *connsm) -{ - int rc; - - /* Not in proper state. Discard */ - if (connsm->enc_data.enc_state != CONN_ENC_S_START_ENC_RSP_WAIT) { - return BLE_ERR_MAX; - } - - /* If master, we are done. Stop control procedure and sent event to host */ - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_ENCRYPT); - - /* We are encrypted */ - connsm->enc_data.enc_state = CONN_ENC_S_ENCRYPTED; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING) - ble_ll_conn_auth_pyld_timer_start(connsm); -#endif - rc = BLE_ERR_MAX; - } else { - /* Procedure has completed but slave needs to send START_ENC_RSP */ - rc = BLE_LL_CTRL_START_ENC_RSP; - - /* Stop timer if it was started when sending START_ENC_REQ */ - if (connsm->cur_ctrl_proc == BLE_LL_CTRL_PROC_ENCRYPT) { - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_ENCRYPT); - } - } - - /* - * XXX: for now, a Slave sends this event when it receivest the - * START_ENC_RSP from the master. It might be technically incorrect - * to send it before we transmit our own START_ENC_RSP. - */ - ble_ll_hci_ev_encrypt_chg(connsm, BLE_ERR_SUCCESS); - - return rc; -} - -#endif - -/** - * Called to make a connection parameter request or response control pdu. - * - * @param connsm - * @param dptr Pointer to start of data. NOTE: the opcode is not part - * of the data. - */ -static void -ble_ll_ctrl_conn_param_pdu_make(struct ble_ll_conn_sm *connsm, uint8_t *dptr, - struct ble_ll_conn_params *req) -{ - uint16_t offset; - struct hci_conn_update *hcu; - - /* If we were passed in a request, we use the parameters from the request */ - if (req) { - put_le16(dptr, req->interval_min); - put_le16(dptr + 2, req->interval_max); - put_le16(dptr + 4, req->latency); - put_le16(dptr + 6, req->timeout); - } else { - hcu = &connsm->conn_param_req; - /* The host should have provided the parameters! */ - BLE_LL_ASSERT(hcu->handle != 0); - put_le16(dptr, hcu->conn_itvl_min); - put_le16(dptr + 2, hcu->conn_itvl_max); - put_le16(dptr + 4, hcu->conn_latency); - put_le16(dptr + 6, hcu->supervision_timeout); - } - - /* XXX: NOTE: if interval min and interval max are != to each - * other this value should be set to non-zero. I think this - * applies only when an offset field is set. See section 5.1.7.1 pg 103 - * Vol 6 Part B. - */ - /* XXX: for now, set periodicity to 0 */ - dptr[8] = 0; - - /* XXX: deal with reference event count. what to put here? */ - put_le16(dptr + 9, connsm->event_cntr); - - /* XXX: For now, dont use offsets */ - offset = 0xFFFF; - put_le16(dptr + 11, offset); - put_le16(dptr + 13, offset); - put_le16(dptr + 15, offset); - put_le16(dptr + 17, offset); - put_le16(dptr + 19, offset); - put_le16(dptr + 21, offset); -} - -static void -ble_ll_ctrl_version_ind_make(struct ble_ll_conn_sm *connsm, uint8_t *pyld) -{ - /* Set flag to denote we have sent/received this */ - connsm->csmflags.cfbit.version_ind_sent = 1; - - /* Fill out response */ - pyld[0] = BLE_HCI_VER_BCS; - put_le16(pyld + 1, MYNEWT_VAL(BLE_LL_MFRG_ID)); - put_le16(pyld + 3, BLE_LL_SUB_VERS_NR); -} - -/** - * Called to make a LL control channel map request PDU. - * - * @param connsm Pointer to connection state machine - * @param pyld Pointer to payload of LL control PDU - */ -static void -ble_ll_ctrl_chanmap_req_make(struct ble_ll_conn_sm *connsm, uint8_t *pyld) -{ - /* Copy channel map that host desires into request */ - memcpy(pyld, g_ble_ll_conn_params.master_chan_map, BLE_LL_CONN_CHMAP_LEN); - memcpy(connsm->req_chanmap, pyld, BLE_LL_CONN_CHMAP_LEN); - - /* Place instant into request */ - connsm->chanmap_instant = connsm->event_cntr + connsm->slave_latency + 6 + 1; - put_le16(pyld + BLE_LL_CONN_CHMAP_LEN, connsm->chanmap_instant); - - /* Set scheduled flag */ - connsm->csmflags.cfbit.chanmap_update_scheduled = 1; -} - -/** - * Called to respond to a LL control PDU connection parameter request or - * response. - * - * @param connsm - * @param rsp - * @param req - * - * @return uint8_t - */ -uint8_t -ble_ll_ctrl_conn_param_reply(struct ble_ll_conn_sm *connsm, uint8_t *rsp, - struct ble_ll_conn_params *req) -{ - uint8_t rsp_opcode; - - if (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) { - /* Create a connection parameter response */ - ble_ll_ctrl_conn_param_pdu_make(connsm, rsp + 1, req); - rsp_opcode = BLE_LL_CTRL_CONN_PARM_RSP; - } else { - /* Create a connection update pdu */ - ble_ll_ctrl_conn_upd_make(connsm, rsp + 1, req); - rsp_opcode = BLE_LL_CTRL_CONN_UPDATE_IND; - } - - return rsp_opcode; -} - -/** - * Called when we have received a LL_REJECT_IND or LL_REJECT_IND_EXT link - * layer control Data Channel pdu. - * - * @param connsm - * @param dptr - * @param opcode - */ -static int -ble_ll_ctrl_rx_reject_ind(struct ble_ll_conn_sm *connsm, uint8_t *dptr, - uint8_t opcode, uint8_t *rspdata) -{ - uint8_t ble_error; - uint8_t rsp_opcode = BLE_ERR_MAX; - - /* Get error out of received PDU */ - if (opcode == BLE_LL_CTRL_REJECT_IND) { - ble_error = dptr[0]; - } else { - ble_error = dptr[1]; - } - - /* XXX: should I check to make sure the rejected opcode is sane - if we receive ind ext? */ - switch (connsm->cur_ctrl_proc) { - case BLE_LL_CTRL_PROC_CONN_PARAM_REQ: - if (opcode == BLE_LL_CTRL_REJECT_IND_EXT) { - /* As a master we should send connection update indication in this point */ - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - rsp_opcode = BLE_LL_CTRL_CONN_UPDATE_IND; - ble_ll_ctrl_conn_upd_make(connsm, rspdata, NULL); - connsm->reject_reason = BLE_ERR_SUCCESS; - } else { - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_CONN_PARAM_REQ); - ble_ll_hci_ev_conn_update(connsm, ble_error); - } - } - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - case BLE_LL_CTRL_PROC_ENCRYPT: - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_ENCRYPT); - ble_ll_hci_ev_encrypt_chg(connsm, ble_error); - connsm->enc_data.enc_state = CONN_ENC_S_UNENCRYPTED; - break; -#endif -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - case BLE_LL_CTRL_PROC_PHY_UPDATE: - ble_ll_ctrl_phy_update_cancel(connsm, ble_error); - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_PHY_UPDATE); - break; -#endif - case BLE_LL_CTRL_PROC_DATA_LEN_UPD: - /* That should not happen according to Bluetooth 5.0 Vol6 Part B, 5.1.9 - * However we need this workaround as there are devices on the market - * which do send LL_REJECT on LL_LENGTH_REQ when collision happens - */ - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_DATA_LEN_UPD); - break; - default: - break; - } - - return rsp_opcode; -} - -/** - * Called when we receive a connection update event - * - * @param connsm - * @param dptr - * - * @return int - */ -static int -ble_ll_ctrl_rx_conn_update(struct ble_ll_conn_sm *connsm, uint8_t *dptr) -{ - uint8_t rsp_opcode; - uint16_t conn_events; - struct ble_ll_conn_upd_req *reqdata; - - /* Only a slave should receive this */ - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - return BLE_LL_CTRL_UNKNOWN_RSP; - } - - /* Retrieve parameters */ - reqdata = &connsm->conn_update_req; - reqdata->winsize = dptr[0]; - reqdata->winoffset = get_le16(dptr + 1); - reqdata->interval = get_le16(dptr + 3); - reqdata->latency = get_le16(dptr + 5); - reqdata->timeout = get_le16(dptr + 7); - reqdata->instant = get_le16(dptr + 9); - - /* XXX: validate them at some point. If they dont check out, we - return the unknown response */ - rsp_opcode = BLE_ERR_MAX; - - /* If instant is in the past, we have to end the connection */ - conn_events = (reqdata->instant - connsm->event_cntr) & 0xFFFF; - if (conn_events >= 32767) { - ble_ll_conn_timeout(connsm, BLE_ERR_INSTANT_PASSED); - } else { - connsm->csmflags.cfbit.conn_update_sched = 1; - - /* - * Errata says that receiving a connection update when the event - * counter is equal to the instant means wesimply ignore the window - * offset and window size. Anchor point has already been set based on - * first packet received in connection event. Given that we increment - * the event counter BEFORE checking to see if the instant is equal to - * the event counter what we do here is increment the instant and set - * the window offset and size to 0. - */ - if (conn_events == 0) { - reqdata->winoffset = 0; - reqdata->winsize = 0; - reqdata->instant += 1; - } - } - - return rsp_opcode; -} - -void -ble_ll_ctrl_initiate_dle(struct ble_ll_conn_sm *connsm) -{ - if (!(connsm->conn_features & BLE_LL_FEAT_DATA_LEN_EXT)) { - return; - } - - /* - * Section 4.5.10 Vol 6 PART B. If the max tx/rx time or octets - * exceeds the minimum, data length procedure needs to occur - */ - if ((connsm->max_tx_octets <= BLE_LL_CONN_SUPP_BYTES_MIN) && - (connsm->max_rx_octets <= BLE_LL_CONN_SUPP_BYTES_MIN) && - (connsm->max_tx_time <= BLE_LL_CONN_SUPP_TIME_MIN) && - (connsm->max_rx_time <= BLE_LL_CONN_SUPP_TIME_MIN)) { - return; - } - - ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_DATA_LEN_UPD); -} - -static void -ble_ll_ctrl_update_features(struct ble_ll_conn_sm *connsm, uint8_t *feat) -{ - connsm->conn_features = feat[0]; - memcpy(connsm->remote_features, feat + 1, 7); - - /* If we received peer's features for the 1st time, we should try DLE */ - if (!connsm->csmflags.cfbit.rxd_features) { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - /* - * If connection was established on uncoded PHY, by default we use - * MaxTxTime and MaxRxTime applicable for that PHY since we are not - * allowed to indicate longer supported time if peer does not support - * LE Coded PHY. However, once we know that peer does support it we can - * update those values to ones applicable for coded PHY. - */ - if (connsm->remote_features[0] & (BLE_LL_FEAT_LE_CODED_PHY >> 8)) { - if (connsm->host_req_max_tx_time) { - connsm->max_tx_time = max(connsm->max_tx_time, - connsm->host_req_max_tx_time); - } else { - connsm->max_tx_time = g_ble_ll_conn_params.conn_init_max_tx_time_coded; - } - connsm->max_rx_time = BLE_LL_CONN_SUPP_TIME_MAX_CODED; - } -#endif - - connsm->csmflags.cfbit.pending_initiate_dle = 1; - connsm->csmflags.cfbit.rxd_features = 1; - } -} - -/** - * Called when we receive a feature request or a slave initiated feature - * request. - * - * - * @param connsm - * @param dptr - * @param rspbuf - * @param opcode - * @param new_features - * - * @return int - */ -static int -ble_ll_ctrl_rx_feature_req(struct ble_ll_conn_sm *connsm, uint8_t *dptr, - uint8_t *rspbuf, uint8_t opcode) -{ - uint8_t rsp_opcode; - uint64_t our_feat; - - /* - * Only accept slave feature requests if we are a master and feature - * requests if we are a slave. - */ - if (opcode == BLE_LL_CTRL_SLAVE_FEATURE_REQ) { - if (connsm->conn_role != BLE_LL_CONN_ROLE_MASTER) { - return BLE_LL_CTRL_UNKNOWN_RSP; - } - } else { - /* XXX: not sure this is correct but do it anyway */ - if (connsm->conn_role != BLE_LL_CONN_ROLE_SLAVE) { - return BLE_LL_CTRL_UNKNOWN_RSP; - } - } - - our_feat = ble_ll_read_supp_features(); - - rsp_opcode = BLE_LL_CTRL_FEATURE_RSP; - - ble_ll_ctrl_update_features(connsm, dptr); - - /* - * 1st octet of features should be common features of local and remote - * controller - we call this 'connection features' - * remaining octets are features of controller which sends PDU, in this case - * it's our controller - * - * See: Vol 6, Part B, section 2.4.2.10 - */ - connsm->conn_features &= our_feat; - - put_le64(rspbuf + 1, our_feat); - rspbuf[1] = connsm->conn_features; - - return rsp_opcode; -} - -/** - * Called when we receive a feature response - * - * @param connsm - * @param dptr - * @param new_features - * - */ -static void -ble_ll_ctrl_rx_feature_rsp(struct ble_ll_conn_sm *connsm, uint8_t *dptr) -{ - ble_ll_ctrl_update_features(connsm, dptr); - - /* Stop the control procedure */ - if (IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_FEATURE_XCHG)) { - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_FEATURE_XCHG); - } - - /* Send event to host if pending features read */ - if (connsm->csmflags.cfbit.pending_hci_rd_features) { - ble_ll_hci_ev_rd_rem_used_feat(connsm, BLE_ERR_SUCCESS); - connsm->csmflags.cfbit.pending_hci_rd_features = 0; - } -} - -/** - * - * - * Context: Link Layer task - * - * @param connsm - * @param dptr - * @param rspbuf - * - * @return int - */ -static int -ble_ll_ctrl_rx_conn_param_req(struct ble_ll_conn_sm *connsm, uint8_t *dptr, - uint8_t *rspbuf) -{ - uint8_t rsp_opcode; - - /* - * This is not in the specification per se but it simplifies the - * implementation. If we get a connection parameter request and we - * are awaiting a reply from the host, simply ignore the request. This - * might not be a good idea if the parameters are different, but oh - * well. This is not expected to happen anyway. A return of BLE_ERR_MAX - * means that we will simply discard the connection parameter request - */ - if (connsm->csmflags.cfbit.awaiting_host_reply) { - return BLE_ERR_MAX; - } - - /* XXX: remember to deal with this on the master: if the slave has - * initiated a procedure we may have received its connection parameter - * update request and have signaled the host with an event. If that - * is the case, we will need to drop the host command when we get it - and also clear any applicable states. */ - - /* XXX: Read 5.3 again. There are multiple control procedures that might - * be pending (a connection update) that will cause collisions and the - behavior below. */ - /* - * Check for procedure collision (Vol 6 PartB 5.3). If we are a slave - * and we receive a request we "consider the slave initiated - * procedure as complete". This means send a connection update complete - * event (with error). - * - * If a master, we send reject with a - * transaction collision error code. - */ - if (IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_CONN_PARAM_REQ)) { - if (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) { - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_CONN_PARAM_REQ); - ble_ll_hci_ev_conn_update(connsm, BLE_ERR_LMP_COLLISION); - } else { - /* The master sends reject ind ext w/error code 0x23 */ - rsp_opcode = BLE_LL_CTRL_REJECT_IND_EXT; - rspbuf[1] = BLE_LL_CTRL_CONN_PARM_REQ; - rspbuf[2] = BLE_ERR_LMP_COLLISION; - return rsp_opcode; - } - } - - /* - * If we are a master and we currently performing a channel map - * update procedure we need to return an error - */ - if ((connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) && - (connsm->csmflags.cfbit.chanmap_update_scheduled)) { - rsp_opcode = BLE_LL_CTRL_REJECT_IND_EXT; - rspbuf[1] = BLE_LL_CTRL_CONN_PARM_REQ; - rspbuf[2] = BLE_ERR_DIFF_TRANS_COLL; - return rsp_opcode; - } - - /* Process the received connection parameter request */ - rsp_opcode = ble_ll_ctrl_conn_param_pdu_proc(connsm, dptr, rspbuf, - BLE_LL_CTRL_CONN_PARM_REQ); - return rsp_opcode; -} - -static int -ble_ll_ctrl_rx_conn_param_rsp(struct ble_ll_conn_sm *connsm, uint8_t *dptr, - uint8_t *rspbuf) -{ - uint8_t rsp_opcode; - - /* A slave should never receive this response */ - if (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) { - return BLE_LL_CTRL_UNKNOWN_RSP; - } - - /* - * This case should never happen! It means that the slave initiated a - * procedure and the master initiated one as well. If we do get in this - * state just clear the awaiting reply. The slave will hopefully stop its - * procedure when we reply. - */ - if (connsm->csmflags.cfbit.awaiting_host_reply) { - connsm->csmflags.cfbit.awaiting_host_reply = 0; - } - - /* If we receive a response and no procedure is pending, just leave */ - if (!IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_CONN_PARAM_REQ)) { - return BLE_ERR_MAX; - } - - /* Process the received connection parameter response */ - rsp_opcode = ble_ll_ctrl_conn_param_pdu_proc(connsm, dptr, rspbuf, - BLE_LL_CTRL_CONN_PARM_RSP); - return rsp_opcode; -} - -/** - * Called to process the LL control PDU VERSION_IND - * - * Context: Link Layer task - * - * @param connsm - * @param dptr - * @param rspbuf - * - * @return int - */ -static int -ble_ll_ctrl_rx_version_ind(struct ble_ll_conn_sm *connsm, uint8_t *dptr, - uint8_t *rspbuf) -{ - uint8_t rsp_opcode; - - /* Process the packet */ - connsm->vers_nr = dptr[0]; - connsm->comp_id = get_le16(dptr + 1); - connsm->sub_vers_nr = get_le16(dptr + 3); - connsm->csmflags.cfbit.rxd_version_ind = 1; - - rsp_opcode = BLE_ERR_MAX; - if (!connsm->csmflags.cfbit.version_ind_sent) { - rsp_opcode = BLE_LL_CTRL_VERSION_IND; - ble_ll_ctrl_version_ind_make(connsm, rspbuf); - } - - /* Stop the control procedure */ - if (IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_VERSION_XCHG)) { - ble_ll_hci_ev_rd_rem_ver(connsm, BLE_ERR_SUCCESS); - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_VERSION_XCHG); - } - return rsp_opcode; -} - -/** - * Called to process a received channel map request control pdu. - * - * Context: Link Layer task - * - * @param connsm - * @param dptr - */ -static int -ble_ll_ctrl_rx_chanmap_req(struct ble_ll_conn_sm *connsm, uint8_t *dptr) -{ - uint16_t instant; - uint16_t conn_events; - - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - return BLE_LL_CTRL_UNKNOWN_RSP; - } - - /* If instant is in the past, we have to end the connection */ - instant = get_le16(dptr + BLE_LL_CONN_CHMAP_LEN); - conn_events = (instant - connsm->event_cntr) & 0xFFFF; - if (conn_events >= 32767) { - ble_ll_conn_timeout(connsm, BLE_ERR_INSTANT_PASSED); - } else { - connsm->chanmap_instant = instant; - memcpy(connsm->req_chanmap, dptr, BLE_LL_CONN_CHMAP_LEN); - connsm->csmflags.cfbit.chanmap_update_scheduled = 1; - } - - return BLE_ERR_MAX; -} - -/** - * Initiate LL control procedure. - * - * This function is called to obtain a mbuf to send a LL control PDU. The data - * channel PDU header is not part of the mbuf data; it is part of the BLE - * header (which is part of the mbuf). - * - * Context: LL task. - * - * @param connsm - * @param ctrl_proc - */ -static struct os_mbuf * -ble_ll_ctrl_proc_init(struct ble_ll_conn_sm *connsm, int ctrl_proc) -{ - uint8_t len; - uint8_t opcode; - uint8_t *dptr; - uint8_t *ctrdata; - struct os_mbuf *om; - - /* Get an mbuf for the control pdu */ - om = os_msys_get_pkthdr(BLE_LL_CTRL_MAX_PDU_LEN, sizeof(struct ble_mbuf_hdr)); - - if (om) { - /* The control data starts after the opcode (1 byte) */ - dptr = om->om_data; - ctrdata = dptr + 1; - - switch (ctrl_proc) { - case BLE_LL_CTRL_PROC_CONN_UPDATE: - opcode = BLE_LL_CTRL_CONN_UPDATE_IND; - ble_ll_ctrl_conn_upd_make(connsm, ctrdata, NULL); - break; - case BLE_LL_CTRL_PROC_CHAN_MAP_UPD: - opcode = BLE_LL_CTRL_CHANNEL_MAP_REQ; - ble_ll_ctrl_chanmap_req_make(connsm, ctrdata); - break; - case BLE_LL_CTRL_PROC_FEATURE_XCHG: - if (connsm->conn_role == BLE_LL_CONN_ROLE_MASTER) { - opcode = BLE_LL_CTRL_FEATURE_REQ; - } else { - opcode = BLE_LL_CTRL_SLAVE_FEATURE_REQ; - } - put_le64(ctrdata, ble_ll_read_supp_features()); - break; - case BLE_LL_CTRL_PROC_VERSION_XCHG: - opcode = BLE_LL_CTRL_VERSION_IND; - ble_ll_ctrl_version_ind_make(connsm, ctrdata); - break; - case BLE_LL_CTRL_PROC_TERMINATE: - opcode = BLE_LL_CTRL_TERMINATE_IND; - ctrdata[0] = connsm->disconnect_reason; - break; - case BLE_LL_CTRL_PROC_CONN_PARAM_REQ: - opcode = BLE_LL_CTRL_CONN_PARM_REQ; - ble_ll_ctrl_conn_param_pdu_make(connsm, ctrdata, NULL); - break; - case BLE_LL_CTRL_PROC_LE_PING: - opcode = BLE_LL_CTRL_PING_REQ; - break; - case BLE_LL_CTRL_PROC_DATA_LEN_UPD: - opcode = BLE_LL_CTRL_LENGTH_REQ; - ble_ll_ctrl_datalen_upd_make(connsm, dptr); - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - /* XXX: deal with already encrypted connection.*/ - case BLE_LL_CTRL_PROC_ENCRYPT: - /* If we are already encrypted we do pause procedure */ - if (connsm->enc_data.enc_state == CONN_ENC_S_ENCRYPTED) { - opcode = BLE_LL_CTRL_PAUSE_ENC_REQ; - } else { - opcode = BLE_LL_CTRL_ENC_REQ; - ble_ll_ctrl_enc_req_make(connsm, ctrdata); - } - break; -#endif -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - case BLE_LL_CTRL_PROC_PHY_UPDATE: - opcode = BLE_LL_CTRL_PHY_REQ; - ble_ll_ctrl_phy_req_rsp_make(connsm, ctrdata); - break; -#endif - default: - BLE_LL_ASSERT(0); - break; - } - - /* Set llid, length and opcode */ - dptr[0] = opcode; - len = g_ble_ll_ctrl_pkt_lengths[opcode] + 1; - - /* Add packet to transmit queue of connection */ - ble_ll_conn_enqueue_pkt(connsm, om, BLE_LL_LLID_CTRL, len); - } - - return om; -} - -/** - * Called to determine if the pdu is a TERMINATE_IND - * - * @param hdr - * @param opcode - * - * @return int - */ -int -ble_ll_ctrl_is_terminate_ind(uint8_t hdr, uint8_t opcode) -{ - int rc; - - rc = 0; - if ((hdr & BLE_LL_DATA_HDR_LLID_MASK) == BLE_LL_LLID_CTRL) { - if (opcode == BLE_LL_CTRL_TERMINATE_IND) { - rc = 1; - } - } - return rc; -} - -/** - * Stops the LL control procedure indicated by 'ctrl_proc'. - * - * Context: Link Layer task - * - * @param connsm - * @param ctrl_proc - */ -void -ble_ll_ctrl_proc_stop(struct ble_ll_conn_sm *connsm, int ctrl_proc) -{ - if (connsm->cur_ctrl_proc == ctrl_proc) { - ble_npl_callout_stop(&connsm->ctrl_proc_rsp_timer); - connsm->cur_ctrl_proc = BLE_LL_CTRL_PROC_IDLE; - } - CLR_PENDING_CTRL_PROC(connsm, ctrl_proc); - - /* If there are others, start them */ - ble_ll_ctrl_chk_proc_start(connsm); -} - -/** - * Called to start the terminate procedure. - * - * Context: Link Layer task. - * - * @param connsm - */ -void -ble_ll_ctrl_terminate_start(struct ble_ll_conn_sm *connsm) -{ - int ctrl_proc; - uint32_t usecs; - struct os_mbuf *om; - - BLE_LL_ASSERT(connsm->disconnect_reason != 0); - - ctrl_proc = BLE_LL_CTRL_PROC_TERMINATE; - om = ble_ll_ctrl_proc_init(connsm, ctrl_proc); - if (om) { - CONN_F_TERMINATE_STARTED(connsm) = 1; - - /* Set terminate "timeout" */ - usecs = connsm->supervision_tmo * BLE_HCI_CONN_SPVN_TMO_UNITS * 1000; - connsm->terminate_timeout = os_cputime_get32() + - os_cputime_usecs_to_ticks(usecs); - } -} - -/** - * Called to start a LL control procedure except for the terminate procedure. We - * always set the control procedure pending bit even if the control procedure - * has been initiated. - * - * Context: Link Layer task. - * - * @param connsm Pointer to connection state machine. - */ -void -ble_ll_ctrl_proc_start(struct ble_ll_conn_sm *connsm, int ctrl_proc) -{ - struct os_mbuf *om; - - BLE_LL_ASSERT(ctrl_proc != BLE_LL_CTRL_PROC_TERMINATE); - - om = NULL; - if (connsm->cur_ctrl_proc == BLE_LL_CTRL_PROC_IDLE) { - /* Initiate the control procedure. */ - om = ble_ll_ctrl_proc_init(connsm, ctrl_proc); - if (om) { - /* Set the current control procedure */ - connsm->cur_ctrl_proc = ctrl_proc; - - /* Initialize the procedure response timeout */ - if (ctrl_proc != BLE_LL_CTRL_PROC_CHAN_MAP_UPD) { - ble_ll_ctrl_start_rsp_timer(connsm); - } - } - } - - /* Set bitmask denoting control procedure is pending */ - connsm->pending_ctrl_procs |= (1 << ctrl_proc); -} - -/** - * Called to determine if we need to start a LL control procedure for the given - * connection. - * - * Context: Link Layer - * - * @param connsm Pointer to connection state machine. - */ -void -ble_ll_ctrl_chk_proc_start(struct ble_ll_conn_sm *connsm) -{ - int i; - - /* XXX: TODO new rules! Cannot start certain control procedures if other - * ones are peer initiated. We need to wait. Deal with this. - */ - - /* - * If we are terminating, dont start any new procedures but start - * terminate if needed - */ - if (connsm->disconnect_reason) { - if (!CONN_F_TERMINATE_STARTED(connsm)) { - /* - * If the terminate procedure has not started it means we were not - * able to start it right away (no control pdu was available). - * Start it now. No need to start any other procedures. - */ - ble_ll_ctrl_terminate_start(connsm); - } - return; - } - - /* If there is a running procedure or no pending, do nothing */ - if ((connsm->cur_ctrl_proc == BLE_LL_CTRL_PROC_IDLE) && - (connsm->pending_ctrl_procs != 0)) { - /* - * The specification says there is no priority to control procedures - * so just start from the first one for now. - */ - for (i = 0; i < BLE_LL_CTRL_PROC_NUM; ++i) { - if (IS_PENDING_CTRL_PROC(connsm, i)) { - /* - * The version exchange is a special case. If we have already - * received the information dont start it. - */ - if ((i == BLE_LL_CTRL_PROC_VERSION_XCHG) && - (connsm->csmflags.cfbit.rxd_version_ind)) { - ble_ll_hci_ev_rd_rem_ver(connsm, BLE_ERR_SUCCESS); - CLR_PENDING_CTRL_PROC(connsm, i); - } else { - ble_ll_ctrl_proc_start(connsm, i); - break; - } - } - } - } -} - -/** - * Called when the Link Layer receives a LL control PDU. - * - * NOTE: this function uses the received PDU for the response in some cases. If - * the received PDU is not used it needs to be freed here. - * - * XXX: may want to check, for both master and slave, whether the control - * pdu should be received by that role. Might make for less code... - * Context: Link Layer - * - * @param om - * @param connsm - */ -int -ble_ll_ctrl_rx_pdu(struct ble_ll_conn_sm *connsm, struct os_mbuf *om) -{ - uint32_t features; - uint32_t feature; - uint8_t len; - uint8_t opcode; - uint8_t rsp_opcode; - uint8_t *dptr; - uint8_t *rspbuf; - uint8_t *rspdata; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - int restart_encryption; -#endif - int rc = 0; - - /* XXX: where do we validate length received and packet header length? - * do this in LL task when received. Someplace!!! What I mean - * is we should validate the over the air length with the mbuf length. - Should the PHY do that???? */ - - /* - * dptr points to om_data pointer. The first byte of om_data is the - * first byte of the Data Channel PDU header. Get length from header and - * opcode from LL control PDU. - */ - dptr = om->om_data; - len = dptr[1]; - opcode = dptr[2]; - - /* - * rspbuf points to first byte of response. The response buffer does not - * contain the Data Channel PDU. Thus, the first byte of rspbuf is the - * LL control PDU payload (the opcode of the control PDU). rspdata - * points to CtrData in the control PDU. - */ - rspbuf = dptr; - rspdata = rspbuf + 1; - - /* Move data pointer to start of control data (2 byte PDU hdr + opcode) */ - dptr += (BLE_LL_PDU_HDR_LEN + 1); - - /* - * Subtract the opcode from the length. Note that if the length was zero, - * which would be an error, we will fail the check against the length - * of the control packet. - */ - --len; - - ble_ll_trace_u32x2(BLE_LL_TRACE_ID_CTRL_RX, opcode, len); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - restart_encryption = 0; -#endif - - /* If opcode comes from reserved value or CtrlData fields is invalid - * we shall respond with LL_UNKNOWN_RSP - */ - if ((opcode >= BLE_LL_CTRL_OPCODES) || - (len != g_ble_ll_ctrl_pkt_lengths[opcode])) { - rc = -1; - rsp_opcode = BLE_LL_CTRL_UNKNOWN_RSP; - goto ll_ctrl_send_rsp; - } - - /* Check if the feature is supported. */ - switch (opcode) { - case BLE_LL_CTRL_LENGTH_REQ: - feature = BLE_LL_FEAT_DATA_LEN_EXT; - break; - case BLE_LL_CTRL_SLAVE_FEATURE_REQ: - feature = BLE_LL_FEAT_SLAVE_INIT; - break; - case BLE_LL_CTRL_CONN_PARM_REQ: - case BLE_LL_CTRL_CONN_PARM_RSP: - feature = BLE_LL_FEAT_CONN_PARM_REQ; - break; - case BLE_LL_CTRL_ENC_REQ: - case BLE_LL_CTRL_START_ENC_REQ: - case BLE_LL_CTRL_PAUSE_ENC_REQ: - feature = BLE_LL_FEAT_LE_ENCRYPTION; - break; - case BLE_LL_CTRL_PING_REQ: - feature = BLE_LL_FEAT_LE_PING; - break; - case BLE_LL_CTRL_PHY_REQ: - feature = BLE_LL_FEAT_LE_2M_PHY | BLE_LL_FEAT_LE_CODED_PHY; - break; - case BLE_LL_CTRL_MIN_USED_CHAN_IND: - feature = BLE_LL_FEAT_MIN_USED_CHAN; - break; - case BLE_LL_CTRL_PERIODIC_SYNC_IND: - feature = BLE_LL_FEAT_SYNC_TRANS_RECV; - break; - default: - feature = 0; - break; - } - - if (feature) { - features = ble_ll_read_supp_features(); - if ((features & feature) == 0) { - if (opcode == BLE_LL_CTRL_ENC_REQ) { - if (connsm->conn_features & BLE_LL_FEAT_EXTENDED_REJ) { - rsp_opcode = BLE_LL_CTRL_REJECT_IND_EXT; - rspbuf[1] = opcode; - rspbuf[2] = BLE_ERR_UNSUPP_REM_FEATURE; - - } else { - rsp_opcode = BLE_LL_CTRL_REJECT_IND; - rspbuf[1] = BLE_ERR_UNSUPP_REM_FEATURE; - } - } else { - /* Construct unknown rsp pdu */ - rsp_opcode = BLE_LL_CTRL_UNKNOWN_RSP; - } - goto ll_ctrl_send_rsp; - } - } - - /* Process opcode */ - rsp_opcode = BLE_ERR_MAX; - switch (opcode) { - case BLE_LL_CTRL_CONN_UPDATE_IND: - rsp_opcode = ble_ll_ctrl_rx_conn_update(connsm, dptr); - break; - case BLE_LL_CTRL_CHANNEL_MAP_REQ: - rsp_opcode = ble_ll_ctrl_rx_chanmap_req(connsm, dptr); - break; - case BLE_LL_CTRL_LENGTH_REQ: - /* Extract parameters and check if valid */ - if (ble_ll_ctrl_len_proc(connsm, dptr)) { - rc = -1; - rsp_opcode = BLE_LL_CTRL_UNKNOWN_RSP; - goto ll_ctrl_send_rsp; - } - - /* - * If we have not started this procedure ourselves and it is - * pending, no need to perform it. - */ - if ((connsm->cur_ctrl_proc != BLE_LL_CTRL_PROC_DATA_LEN_UPD) && - IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_DATA_LEN_UPD)) { - CLR_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_DATA_LEN_UPD); - } - - /* Send a response */ - rsp_opcode = BLE_LL_CTRL_LENGTH_RSP; - ble_ll_ctrl_datalen_upd_make(connsm, rspbuf); - break; - case BLE_LL_CTRL_LENGTH_RSP: - /* According to specification, process this only if we asked for it. */ - if (connsm->cur_ctrl_proc == BLE_LL_CTRL_PROC_DATA_LEN_UPD) { - /* - * Process the received data. If received data is invalid, we'll - * reply with LL_UNKNOWN_RSP as per spec, but we still need to stop - * control procedure to avoid timeout. - */ - if (ble_ll_ctrl_len_proc(connsm, dptr)) { - rc = -1; - rsp_opcode = BLE_LL_CTRL_UNKNOWN_RSP; - } - - /* Stop the control procedure */ - ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_DATA_LEN_UPD); - } - break; - case BLE_LL_CTRL_UNKNOWN_RSP: - rsp_opcode = ble_ll_ctrl_proc_unk_rsp(connsm, dptr, rspdata); - break; - case BLE_LL_CTRL_FEATURE_REQ: - rsp_opcode = ble_ll_ctrl_rx_feature_req(connsm, dptr, rspbuf, opcode); - break; - /* XXX: check to see if ctrl procedure was running? Do we care? */ - case BLE_LL_CTRL_FEATURE_RSP: - ble_ll_ctrl_rx_feature_rsp(connsm, dptr); - break; - case BLE_LL_CTRL_VERSION_IND: - rsp_opcode = ble_ll_ctrl_rx_version_ind(connsm, dptr, rspdata); - break; - case BLE_LL_CTRL_SLAVE_FEATURE_REQ: - rsp_opcode = ble_ll_ctrl_rx_feature_req(connsm, dptr, rspbuf, opcode); - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - case BLE_LL_CTRL_ENC_REQ: - rsp_opcode = ble_ll_ctrl_rx_enc_req(connsm, dptr, rspdata); - break; - case BLE_LL_CTRL_ENC_RSP: - ble_ll_ctrl_rx_enc_rsp(connsm, dptr); - break; - case BLE_LL_CTRL_START_ENC_REQ: - rsp_opcode = ble_ll_ctrl_rx_start_enc_req(connsm); - break; - case BLE_LL_CTRL_START_ENC_RSP: - rsp_opcode = ble_ll_ctrl_rx_start_enc_rsp(connsm); - break; - case BLE_LL_CTRL_PAUSE_ENC_REQ: - rsp_opcode = ble_ll_ctrl_rx_pause_enc_req(connsm); - break; - case BLE_LL_CTRL_PAUSE_ENC_RSP: - rsp_opcode = ble_ll_ctrl_rx_pause_enc_rsp(connsm); - if (rsp_opcode == BLE_LL_CTRL_PAUSE_ENC_RSP) { - restart_encryption = 1; - } - break; -#endif - case BLE_LL_CTRL_PING_REQ: - rsp_opcode = BLE_LL_CTRL_PING_RSP; - break; - case BLE_LL_CTRL_PING_RSP: - ble_ll_ctrl_rx_ping_rsp(connsm); - break; - case BLE_LL_CTRL_CONN_PARM_REQ: - rsp_opcode = ble_ll_ctrl_rx_conn_param_req(connsm, dptr, rspbuf); - break; - case BLE_LL_CTRL_CONN_PARM_RSP: - rsp_opcode = ble_ll_ctrl_rx_conn_param_rsp(connsm, dptr, rspbuf); - break; - /* Fall-through intentional... */ - case BLE_LL_CTRL_REJECT_IND: - case BLE_LL_CTRL_REJECT_IND_EXT: - /* Sometimes reject triggers sending other LL CTRL msg */ - rsp_opcode = ble_ll_ctrl_rx_reject_ind(connsm, dptr, opcode, rspdata); - break; -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - case BLE_LL_CTRL_PHY_REQ: - rsp_opcode = ble_ll_ctrl_rx_phy_req(connsm, dptr, rspdata); - break; - case BLE_LL_CTRL_PHY_RSP: - rsp_opcode = ble_ll_ctrl_rx_phy_rsp(connsm, dptr, rspdata); - break; - case BLE_LL_CTRL_PHY_UPDATE_IND: - rsp_opcode = ble_ll_ctrl_rx_phy_update_ind(connsm, dptr); - break; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - case BLE_LL_CTRL_PERIODIC_SYNC_IND: - rsp_opcode = ble_ll_ctrl_rx_periodic_sync_ind(connsm, dptr); - break; -#endif - default: - /* Nothing to do here */ - break; - } - - /* Free mbuf or send response */ -ll_ctrl_send_rsp: - if (rsp_opcode == BLE_ERR_MAX) { - os_mbuf_free_chain(om); - } else { - /* - * Write the response opcode into the buffer. If this is an unknown - * response, put opcode of unknown pdu into buffer. - */ - rspbuf[0] = rsp_opcode; - if (rsp_opcode == BLE_LL_CTRL_UNKNOWN_RSP) { - rspbuf[1] = opcode; - } - len = g_ble_ll_ctrl_pkt_lengths[rsp_opcode] + 1; - ble_ll_conn_enqueue_pkt(connsm, om, BLE_LL_LLID_CTRL, len); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (restart_encryption) { - /* XXX: what happens if this fails? Meaning we cant allocate - mbuf? */ - ble_ll_ctrl_proc_init(connsm, BLE_LL_CTRL_PROC_ENCRYPT); - } -#endif - } - - if (connsm->csmflags.cfbit.pending_initiate_dle) { - connsm->csmflags.cfbit.pending_initiate_dle = 0; - ble_ll_ctrl_initiate_dle(connsm); - } - - return rc; -} - -/** - * Called to create and send a REJECT_IND_EXT control PDU or a REJECT_IND - * - * @param connsm - * @param rej_opcode - * @param err - * - * @return int - */ -int -ble_ll_ctrl_reject_ind_send(struct ble_ll_conn_sm *connsm, uint8_t rej_opcode, - uint8_t err) -{ - int rc; - uint8_t len; - uint8_t opcode; - uint8_t *rspbuf; - struct os_mbuf *om; - - om = os_msys_get_pkthdr(BLE_LL_CTRL_MAX_PDU_LEN, - sizeof(struct ble_mbuf_hdr)); - if (om) { - rspbuf = om->om_data; - opcode = BLE_LL_CTRL_REJECT_IND_EXT; - if (rej_opcode == BLE_LL_CTRL_ENC_REQ) { - if ((connsm->conn_features & BLE_LL_FEAT_EXTENDED_REJ) == 0) { - opcode = BLE_LL_CTRL_REJECT_IND; - } - } - rspbuf[0] = opcode; - if (opcode == BLE_LL_CTRL_REJECT_IND) { - rspbuf[1] = err; - len = BLE_LL_CTRL_REJ_IND_LEN + 1; - } else { - rspbuf[1] = rej_opcode; - rspbuf[2] = err; - len = BLE_LL_CTRL_REJECT_IND_EXT_LEN + 1; - } - ble_ll_conn_enqueue_pkt(connsm, om, BLE_LL_LLID_CTRL, len); - rc = 0; - } else { - rc = 1; - } - return rc; -} - -/** - * Called when a Link Layer Control pdu has been transmitted successfully. - * This is called when we have a received a PDU during the ISR. - * - * Context: ISR - * - * @param txpdu - * - * @return int - */ -int -ble_ll_ctrl_tx_done(struct os_mbuf *txpdu, struct ble_ll_conn_sm *connsm) -{ - int rc; - uint8_t opcode; - - rc = 0; - opcode = txpdu->om_data[0]; - switch (opcode) { - case BLE_LL_CTRL_TERMINATE_IND: - connsm->csmflags.cfbit.terminate_ind_txd = 1; - rc = -1; - break; - case BLE_LL_CTRL_REJECT_IND_EXT: - if (connsm->cur_ctrl_proc == BLE_LL_CTRL_PROC_CONN_PARAM_REQ) { - /* If rejecting opcode is BLE_LL_CTRL_PROC_CONN_PARAM_REQ and - * reason is LMP collision that means we are master on the link and - * peer wanted to start procedure which we already started. - * Let's wait for response and do not close procedure. */ - if (txpdu->om_data[1] == BLE_LL_CTRL_CONN_PARM_REQ && - txpdu->om_data[2] != BLE_ERR_LMP_COLLISION) { - connsm->reject_reason = txpdu->om_data[2]; - connsm->csmflags.cfbit.host_expects_upd_event = 1; - } - } -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (connsm->enc_data.enc_state > CONN_ENC_S_ENCRYPTED) { - connsm->enc_data.enc_state = CONN_ENC_S_UNENCRYPTED; - } -#endif - break; - case BLE_LL_CTRL_REJECT_IND: -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - connsm->enc_data.enc_state = CONN_ENC_S_UNENCRYPTED; -#endif - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - case BLE_LL_CTRL_PAUSE_ENC_REQ: - /* note: fall-through intentional */ - case BLE_LL_CTRL_ENC_REQ: - connsm->enc_data.enc_state = CONN_ENC_S_ENC_RSP_WAIT; - break; - case BLE_LL_CTRL_ENC_RSP: - connsm->csmflags.cfbit.send_ltk_req = 1; - break; - case BLE_LL_CTRL_START_ENC_RSP: - if (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) { - connsm->enc_data.enc_state = CONN_ENC_S_ENCRYPTED; - if (CONN_F_LE_PING_SUPP(connsm)) { - ble_ll_conn_auth_pyld_timer_start(connsm); - } - } - break; - case BLE_LL_CTRL_PAUSE_ENC_RSP: - if (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) { - connsm->enc_data.enc_state = CONN_ENC_S_PAUSE_ENC_RSP_WAIT; - } - break; -#endif -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - case BLE_LL_CTRL_PHY_REQ: - connsm->phy_tx_transition = - ble_ll_ctrl_phy_tx_transition_get(connsm->phy_data.req_pref_tx_phys_mask); - break; - case BLE_LL_CTRL_PHY_UPDATE_IND: - connsm->phy_tx_transition = - ble_ll_ctrl_phy_tx_transition_get(txpdu->om_data[2]); - break; -#endif - default: - break; - } - - os_mbuf_free_chain(txpdu); - return rc; -} -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_dtm.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_dtm.c deleted file mode 100644 index baf8c2570..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_dtm.c +++ /dev/null @@ -1,728 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/sysinit/sysinit.h" - -#if MYNEWT_VAL(BLE_LL_DTM) - -#include -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/nimble/porting/nimble/include/stats/stats.h" -#include "../include/controller/ble_ll.h" -#include "../include/controller/ble_phy.h" -#include "../include/controller/ble_ll_sched.h" -#include "../include/controller/ble_ll_rfmgmt.h" -#include "ble_ll_dtm_priv.h" - -STATS_SECT_START(ble_ll_dtm_stats) - STATS_SECT_ENTRY(rx_count) - STATS_SECT_ENTRY(tx_failed) - STATS_SECT_ENTRY(rx_failed) -STATS_SECT_END -STATS_SECT_DECL(ble_ll_dtm_stats) ble_ll_dtm_stats; - -STATS_NAME_START(ble_ll_dtm_stats) - STATS_NAME(ble_ll_dtm_stats, rx_count) - STATS_NAME(ble_ll_dtm_stats, tx_failed) - STATS_NAME(ble_ll_dtm_stats, rx_failed) -STATS_NAME_END(ble_phy_stats) - -struct dtm_ctx { - uint8_t payload_packet; - uint8_t itvl_rem_usec; - uint16_t num_of_packets; - uint32_t itvl_ticks; -#if MYNEWT_VAL(BLE_LL_DTM_EXTENSIONS) - uint16_t num_of_packets_max; -#endif - int active; - uint8_t rf_channel; - uint8_t phy_mode; - struct os_mbuf *om; - struct ble_npl_event evt; - struct ble_ll_sched_item sch; - uint32_t pdu_start_ticks; - uint8_t pdu_start_usecs; -}; - -static struct dtm_ctx g_ble_ll_dtm_ctx; - -static const uint8_t g_ble_ll_dtm_prbs9_data[] = -{ - 0xff, 0xc1, 0xfb, 0xe8, 0x4c, 0x90, 0x72, 0x8b, - 0xe7, 0xb3, 0x51, 0x89, 0x63, 0xab, 0x23, 0x23, - 0x02, 0x84, 0x18, 0x72, 0xaa, 0x61, 0x2f, 0x3b, - 0x51, 0xa8, 0xe5, 0x37, 0x49, 0xfb, 0xc9, 0xca, - 0x0c, 0x18, 0x53, 0x2c, 0xfd, 0x45, 0xe3, 0x9a, - 0xe6, 0xf1, 0x5d, 0xb0, 0xb6, 0x1b, 0xb4, 0xbe, - 0x2a, 0x50, 0xea, 0xe9, 0x0e, 0x9c, 0x4b, 0x5e, - 0x57, 0x24, 0xcc, 0xa1, 0xb7, 0x59, 0xb8, 0x87, - 0xff, 0xe0, 0x7d, 0x74, 0x26, 0x48, 0xb9, 0xc5, - 0xf3, 0xd9, 0xa8, 0xc4, 0xb1, 0xd5, 0x91, 0x11, - 0x01, 0x42, 0x0c, 0x39, 0xd5, 0xb0, 0x97, 0x9d, - 0x28, 0xd4, 0xf2, 0x9b, 0xa4, 0xfd, 0x64, 0x65, - 0x06, 0x8c, 0x29, 0x96, 0xfe, 0xa2, 0x71, 0x4d, - 0xf3, 0xf8, 0x2e, 0x58, 0xdb, 0x0d, 0x5a, 0x5f, - 0x15, 0x28, 0xf5, 0x74, 0x07, 0xce, 0x25, 0xaf, - 0x2b, 0x12, 0xe6, 0xd0, 0xdb, 0x2c, 0xdc, 0xc3, - 0x7f, 0xf0, 0x3e, 0x3a, 0x13, 0xa4, 0xdc, 0xe2, - 0xf9, 0x6c, 0x54, 0xe2, 0xd8, 0xea, 0xc8, 0x88, - 0x00, 0x21, 0x86, 0x9c, 0x6a, 0xd8, 0xcb, 0x4e, - 0x14, 0x6a, 0xf9, 0x4d, 0xd2, 0x7e, 0xb2, 0x32, - 0x03, 0xc6, 0x14, 0x4b, 0x7f, 0xd1, 0xb8, 0xa6, - 0x79, 0x7c, 0x17, 0xac, 0xed, 0x06, 0xad, 0xaf, - 0x0a, 0x94, 0x7a, 0xba, 0x03, 0xe7, 0x92, 0xd7, - 0x15, 0x09, 0x73, 0xe8, 0x6d, 0x16, 0xee, 0xe1, - 0x3f, 0x78, 0x1f, 0x9d, 0x09, 0x52, 0x6e, 0xf1, - 0x7c, 0x36, 0x2a, 0x71, 0x6c, 0x75, 0x64, 0x44, - 0x80, 0x10, 0x43, 0x4e, 0x35, 0xec, 0x65, 0x27, - 0x0a, 0xb5, 0xfc, 0x26, 0x69, 0x3f, 0x59, 0x99, - 0x01, 0x63, 0x8a, 0xa5, 0xbf, 0x68, 0x5c, 0xd3, - 0x3c, 0xbe, 0x0b, 0xd6, 0x76, 0x83, 0xd6, 0x57, - 0x05, 0x4a, 0x3d, 0xdd, 0x81, 0x73, 0xc9, 0xeb, - 0x8a, 0x84, 0x39, 0xf4, 0x36, 0x0b, 0xf7 -}; - -static const uint8_t g_ble_ll_dtm_prbs15_data[] = -{ - 0xff, 0x7f, 0xf0, 0x3e, 0x3a, 0x13, 0xa4, 0xdc, - 0xe2, 0xf9, 0x6c, 0x54, 0xe2, 0xd8, 0xea, 0xc8, - 0x88, 0x00, 0x21, 0x86, 0x9c, 0x6a, 0xd8, 0xcb, - 0x4e, 0x14, 0x6a, 0xf9, 0x4d, 0xd2, 0x7e, 0xb2, - 0x32, 0x03, 0xc6, 0x14, 0x4b, 0x7f, 0xd1, 0xb8, - 0xa6, 0x79, 0x7c, 0x17, 0xac, 0xed, 0x06, 0xad, - 0xaf, 0x0a, 0x94, 0x7a, 0xba, 0x03, 0xe7, 0x92, - 0xd7, 0x15, 0x09, 0x73, 0xe8, 0x6d, 0x16, 0xee, - 0xe1, 0x3f, 0x78, 0x1f, 0x9d, 0x09, 0x52, 0x6e, - 0xf1, 0x7c, 0x36, 0x2a, 0x71, 0x6c, 0x75, 0x64, - 0x44, 0x80, 0x10, 0x43, 0x4e, 0x35, 0xec, 0x65, - 0x27, 0x0a, 0xb5, 0xfc, 0x26, 0x69, 0x3f, 0x59, - 0x99, 0x01, 0x63, 0x8a, 0xa5, 0xbf, 0x68, 0x5c, - 0xd3, 0x3c, 0xbe, 0x0b, 0xd6, 0x76, 0x83, 0xd6, - 0x57, 0x05, 0x4a, 0x3d, 0xdd, 0x81, 0x73, 0xc9, - 0xeb, 0x8a, 0x84, 0x39, 0xf4, 0x36, 0x0b, 0xf7, - 0xf0, 0x1f, 0xbc, 0x8f, 0xce, 0x04, 0x29, 0xb7, - 0x78, 0x3e, 0x1b, 0x95, 0x38, 0xb6, 0x3a, 0x32, - 0x22, 0x40, 0x88, 0x21, 0xa7, 0x1a, 0xf6, 0xb2, - 0x13, 0x85, 0x5a, 0x7e, 0x93, 0xb4, 0x9f, 0xac, - 0xcc, 0x80, 0x31, 0xc5, 0xd2, 0x5f, 0x34, 0xae, - 0x69, 0x1e, 0xdf, 0x05, 0x6b, 0xbb, 0x41, 0xeb, - 0xab, 0x02, 0xa5, 0x9e, 0xee, 0xc0, 0xb9, 0xe4, - 0x75, 0x45, 0xc2, 0x1c, 0x7a, 0x9b, 0x85, 0x7b, - 0xf8, 0x0f, 0xde, 0x47, 0x67, 0x82, 0x94, 0x5b, - 0x3c, 0x9f, 0x8d, 0x4a, 0x1c, 0x5b, 0x1d, 0x19, - 0x11, 0x20, 0xc4, 0x90, 0x53, 0x0d, 0x7b, 0xd9, - 0x89, 0x42, 0x2d, 0xbf, 0x49, 0xda, 0x4f, 0x56, - 0x66, 0xc0, 0x98, 0x62, 0xe9, 0x2f, 0x1a, 0xd7, - 0x34, 0x8f, 0xef, 0x82, 0xb5, 0xdd, 0xa0, 0xf5, - 0x55, 0x81, 0x52, 0x4f, 0x77, 0xe0, 0x5c, 0xf2, - 0xba, 0x22, 0x61, 0x0e, 0xbd, 0xcd, 0xc2 -}; - -static const uint8_t channel_rf_to_index[] = { - 37, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 38, 11 ,12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 39 -}; - -#define BLE_DTM_SYNC_WORD (0x71764129) -#define BLE_DTM_CRC (0x555555) - -static void ble_ll_dtm_ctx_free(struct dtm_ctx * ctx); - -static void -ble_ll_dtm_set_next(struct dtm_ctx *ctx) -{ - struct ble_ll_sched_item *sch = &ctx->sch; - - ctx->pdu_start_ticks += ctx->itvl_ticks; - ctx->pdu_start_usecs += ctx->itvl_rem_usec; - if (ctx->pdu_start_usecs >= 31) { - ctx->pdu_start_ticks++; - ctx->pdu_start_usecs -= 31; - } - - sch->start_time = ctx->pdu_start_ticks; - sch->remainder = ctx->pdu_start_usecs; - - sch->start_time -= g_ble_ll_sched_offset_ticks; -} - -static void -ble_ll_dtm_ev_tx_resched_cb(struct ble_npl_event *evt) { - /* It is called in LL context */ - struct dtm_ctx *ctx = ble_npl_event_get_arg(evt); - int rc; - os_sr_t sr; - - OS_ENTER_CRITICAL(sr); - if (!ctx->active || !ctx->om) { - OS_EXIT_CRITICAL(sr); - return; - } - OS_EXIT_CRITICAL(sr); - -#if MYNEWT_VAL(BLE_LL_DTM_EXTENSIONS) - if (g_ble_ll_dtm_ctx.num_of_packets_max && - (g_ble_ll_dtm_ctx.num_of_packets == g_ble_ll_dtm_ctx.num_of_packets_max)) { - /* - * XXX do not send more packets, but also do not stop DTM - it shall be - * stopped as usual by HCI command since there is no standard way to - * signal end of test to host. - */ - return; - } -#endif - - ble_ll_dtm_set_next(ctx); - rc = ble_ll_sched_dtm(&ctx->sch); - BLE_LL_ASSERT(rc == 0); -} - -static int ble_ll_dtm_rx_start(void); - -static void -ble_ll_dtm_ev_rx_restart_cb(struct ble_npl_event *evt) { - if (ble_ll_dtm_rx_start() != 0) { - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &g_ble_ll_dtm_ctx.evt); - STATS_INC(ble_ll_dtm_stats, rx_failed); - } -} - -static void -ble_ll_dtm_tx_done(void *arg) -{ - struct dtm_ctx *ctx; - - ctx = arg; - if (!ctx->active) { - return; - } - - g_ble_ll_dtm_ctx.num_of_packets++; - - /* Reschedule event in LL context */ - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &ctx->evt); - - ble_ll_state_set(BLE_LL_STATE_STANDBY); -} - -static int -ble_ll_dtm_tx_sched_cb(struct ble_ll_sched_item *sch) -{ - struct dtm_ctx *ctx = sch->cb_arg; - int rc; - - if (!ctx->active) { - return BLE_LL_SCHED_STATE_DONE; - } - - rc = ble_phy_setchan(channel_rf_to_index[ctx->rf_channel], - BLE_DTM_SYNC_WORD, BLE_DTM_CRC); - if (rc != 0) { - BLE_LL_ASSERT(0); - return BLE_LL_SCHED_STATE_DONE; - } - -#if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) || MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY)) - ble_phy_mode_set(ctx->phy_mode, ctx->phy_mode); -#endif - ble_phy_set_txend_cb(ble_ll_dtm_tx_done, ctx); - ble_phy_txpwr_set(0); - - sch->start_time += g_ble_ll_sched_offset_ticks; - - rc = ble_phy_tx_set_start_time(sch->start_time, sch->remainder); - if (rc) { - goto resched; - } - - rc = ble_phy_tx(ble_ll_tx_mbuf_pducb, ctx->om, BLE_PHY_TRANSITION_NONE); - if (rc) { - goto resched; - } - - ble_ll_state_set(BLE_LL_STATE_DTM); - - return BLE_LL_SCHED_STATE_DONE; - -resched: - /* Reschedule from LL task if late for this PDU */ - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &ctx->evt); - - STATS_INC(ble_ll_dtm_stats, tx_failed); - - return BLE_LL_SCHED_STATE_DONE; -} - -static void -ble_ll_dtm_calculate_itvl(struct dtm_ctx *ctx, uint8_t len, - uint16_t cmd_interval, int phy_mode) -{ - uint32_t l; - uint32_t itvl_usec; - uint32_t itvl_ticks; - - /* Calculate interval as per spec Bluetooth 5.0 Vol 6. Part F, 4.1.6 */ - l = ble_ll_pdu_tx_time_get(len + BLE_LL_PDU_HDR_LEN, phy_mode); - itvl_usec = ((l + 249 + 624) / 625) * 625; - -#if MYNEWT_VAL(BLE_LL_DTM_EXTENSIONS) - if (cmd_interval > itvl_usec) { - itvl_usec = cmd_interval; - } -#endif - - itvl_ticks = os_cputime_usecs_to_ticks(itvl_usec); - ctx->itvl_rem_usec = (itvl_usec - os_cputime_ticks_to_usecs(itvl_ticks)); - if (ctx->itvl_rem_usec == 31) { - ctx->itvl_rem_usec = 0; - ++itvl_ticks; - } - ctx->itvl_ticks = itvl_ticks; -} - -static int -ble_ll_dtm_tx_create_ctx(uint8_t packet_payload, uint8_t len, - uint8_t rf_channel, uint8_t phy_mode, - uint16_t cmd_interval, uint16_t cmd_pkt_count) -{ - int rc = 0; - uint8_t byte_pattern; - struct ble_mbuf_hdr *ble_hdr; - struct os_mbuf *m; - struct dtm_ctx *ctx = &g_ble_ll_dtm_ctx; - struct ble_ll_sched_item *sch = &ctx->sch; - - /* MSYS is big enough to get continues memory */ - m = os_msys_get_pkthdr(len, sizeof(struct ble_mbuf_hdr)); - ctx->om = m; - BLE_LL_ASSERT(g_ble_ll_dtm_ctx.om); - - ctx->phy_mode = phy_mode; - ctx->rf_channel = rf_channel; - ctx->num_of_packets = 0; -#if MYNEWT_VAL(BLE_LL_DTM_EXTENSIONS) - ctx->num_of_packets_max = cmd_pkt_count; -#endif - - /* Set BLE transmit header */ - ble_hdr = BLE_MBUF_HDR_PTR(m); - ble_hdr->txinfo.flags = 0; - ble_hdr->txinfo.offset = 0; - ble_hdr->txinfo.pyld_len = len; - ble_hdr->txinfo.hdr_byte = packet_payload; - - switch(packet_payload) { - case 0x00: - if (os_mbuf_copyinto(m, 0, &g_ble_ll_dtm_prbs9_data, len)) { - return 1; - } - goto schedule; - case 0x01: - byte_pattern = 0x0F; - break; - case 0x02: - byte_pattern = 0x55; - break; - case 0x03: - if (os_mbuf_copyinto(m, 0, &g_ble_ll_dtm_prbs15_data, len)) { - return 1; - } - goto schedule; - case 0x04: - byte_pattern = 0xFF; - break; - case 0x05: - byte_pattern = 0x00; - break; - case 0x06: - byte_pattern = 0xF0; - break; - case 0x07: - byte_pattern = 0xAA; - break; - default: - return 1; - } - - for (rc = 0; rc < len; rc++) { - if (os_mbuf_copyinto(m, rc, &byte_pattern, 1)) { - return 1; - } - } - -schedule: - ble_phy_enable_dtm(); - - sch->sched_cb = ble_ll_dtm_tx_sched_cb; - sch->cb_arg = ctx; - sch->sched_type = BLE_LL_SCHED_TYPE_DTM; - - /* Prepare os_event */ - ble_npl_event_init(&ctx->evt, ble_ll_dtm_ev_tx_resched_cb, ctx); - - ble_ll_dtm_calculate_itvl(ctx, len, cmd_interval, phy_mode); - - ctx->pdu_start_ticks = ble_ll_rfmgmt_enable_now(); - ctx->pdu_start_usecs = 0; - ble_ll_dtm_set_next(ctx); - - /* Set some start point for TX packets */ - rc = ble_ll_sched_dtm(sch); - BLE_LL_ASSERT(rc == 0); - - g_ble_ll_dtm_ctx.active = 1; - return 0; -} - -static int -ble_ll_dtm_rx_start(void) -{ - os_sr_t sr; - int rc; - - rc = ble_phy_setchan(channel_rf_to_index[g_ble_ll_dtm_ctx.rf_channel], - BLE_DTM_SYNC_WORD, BLE_DTM_CRC); - if (rc) { - return rc; - } - -#if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) || MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY)) - ble_phy_mode_set(g_ble_ll_dtm_ctx.phy_mode, g_ble_ll_dtm_ctx.phy_mode); -#endif - - OS_ENTER_CRITICAL(sr); - rc = ble_phy_rx_set_start_time(os_cputime_get32(), 0); - OS_EXIT_CRITICAL(sr); - if (rc && rc != BLE_PHY_ERR_RX_LATE) { - return rc; - } - - ble_ll_state_set(BLE_LL_STATE_DTM); - - return 0; -} - -static int -ble_ll_dtm_rx_sched_cb(struct ble_ll_sched_item *sch) -{ - if (ble_ll_dtm_rx_start() != 0) { - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &g_ble_ll_dtm_ctx.evt); - STATS_INC(ble_ll_dtm_stats, rx_failed); - } - - return BLE_LL_SCHED_STATE_DONE; -} - -static int -ble_ll_dtm_rx_create_ctx(uint8_t rf_channel, uint8_t phy_mode) -{ - struct ble_ll_sched_item *sch = &g_ble_ll_dtm_ctx.sch; - int rc; - - g_ble_ll_dtm_ctx.phy_mode = phy_mode; - g_ble_ll_dtm_ctx.rf_channel = rf_channel; - - STATS_CLEAR(ble_ll_dtm_stats, rx_count); - - ble_npl_event_init(&g_ble_ll_dtm_ctx.evt, ble_ll_dtm_ev_rx_restart_cb, - NULL); - - sch->sched_cb = ble_ll_dtm_rx_sched_cb; - sch->cb_arg = &g_ble_ll_dtm_ctx; - sch->sched_type = BLE_LL_SCHED_TYPE_DTM; - sch->start_time = ble_ll_rfmgmt_enable_now(); - - rc = ble_ll_sched_dtm(sch); - BLE_LL_ASSERT(rc == 0); - - ble_phy_enable_dtm(); - - g_ble_ll_dtm_ctx.active = 1; - return 0; -} - -static void -ble_ll_dtm_ctx_free(struct dtm_ctx * ctx) -{ - os_sr_t sr; - - OS_ENTER_CRITICAL(sr); - if (!ctx->active) { - OS_EXIT_CRITICAL(sr); - return; - } - - ble_ll_sched_rmv_elem(&ctx->sch); - ble_npl_eventq_remove(&g_ble_ll_data.ll_evq, &g_ble_ll_dtm_ctx.evt); - - ble_phy_disable(); - ble_phy_disable_dtm(); - ble_ll_state_set(BLE_LL_STATE_STANDBY); - ble_ll_rfmgmt_release(); - - os_mbuf_free_chain(ctx->om); - memset(ctx, 0, sizeof(*ctx)); - OS_EXIT_CRITICAL(sr); -} - -static int -ble_ll_dtm_tx_test(uint8_t tx_chan, uint8_t len, uint8_t packet_payload, - uint8_t hci_phy, uint16_t interval, uint16_t pkt_count) -{ - uint8_t phy_mode; - - if (g_ble_ll_dtm_ctx.active) { - return BLE_ERR_CTLR_BUSY; - } - - switch (hci_phy) { - case BLE_HCI_LE_PHY_1M: - phy_mode = BLE_PHY_MODE_1M; - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) - case BLE_HCI_LE_PHY_2M: - phy_mode = BLE_PHY_MODE_2M; - break; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - case BLE_HCI_LE_PHY_CODED_S8: - phy_mode = BLE_PHY_MODE_CODED_125KBPS; - break; - case BLE_HCI_LE_PHY_CODED_S2: - phy_mode = BLE_PHY_MODE_CODED_500KBPS; - break; -#endif - default: - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (tx_chan > 0x27 || packet_payload > 0x07) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (ble_ll_dtm_tx_create_ctx(packet_payload, len, tx_chan, phy_mode, - interval, pkt_count)) { - return BLE_ERR_UNSPECIFIED; - } - - return BLE_ERR_SUCCESS; -} - -#if MYNEWT_VAL(BLE_LL_DTM_EXTENSIONS) -static int -ble_ll_hci_dtm_tx_test_ext(const uint8_t *cmdbuf) -{ - const struct ble_hci_le_tx_test_ext_cp *cmd = (const void *) cmdbuf; - - return ble_ll_dtm_tx_test(cmd->tx_chan, cmd->test_data_len, cmd->payload, - BLE_HCI_LE_PHY_1M, le16toh(cmd->interval), - le16toh(cmd->pkt_count)); -} - -static int -ble_ll_hci_dtm_tx_test_v2_ext(const uint8_t *cmdbuf) -{ - const struct ble_hci_le_tx_test_v2_ext_cp *cmd = (const void *) cmdbuf; - - return ble_ll_dtm_tx_test(cmd->tx_chan, cmd->test_data_len, cmd->payload, - cmd->phy, le16toh(cmd->interval), - le16toh(cmd->pkt_count)); -} -#endif - -int -ble_ll_hci_dtm_tx_test(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_tx_test_cp *cmd = (const void *) cmdbuf; - -#if MYNEWT_VAL(BLE_LL_DTM_EXTENSIONS) - if (len == sizeof(struct ble_hci_le_tx_test_ext_cp)) { - return ble_ll_hci_dtm_tx_test_ext(cmdbuf); - } -#endif - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - return ble_ll_dtm_tx_test(cmd->tx_chan, cmd->test_data_len, cmd->payload, - BLE_HCI_LE_PHY_1M, 0, 0); -} - -int -ble_ll_hci_dtm_tx_test_v2(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_tx_test_v2_cp *cmd = (const void *) cmdbuf; - -#if MYNEWT_VAL(BLE_LL_DTM_EXTENSIONS) - if (len == sizeof(struct ble_hci_le_tx_test_v2_ext_cp)) { - return ble_ll_hci_dtm_tx_test_v2_ext(cmdbuf); - } -#endif - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - return ble_ll_dtm_tx_test(cmd->tx_chan, cmd->test_data_len, cmd->payload, - cmd->phy, 0, 0); -} - -static int -ble_ll_dtm_rx_test(uint8_t rx_chan, uint8_t hci_phy) -{ - uint8_t phy_mode; - - if (g_ble_ll_dtm_ctx.active) { - return BLE_ERR_CTLR_BUSY; - } - - switch (hci_phy) { - case BLE_HCI_LE_PHY_1M: - phy_mode = BLE_PHY_MODE_1M; - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) - case BLE_HCI_LE_PHY_2M: - phy_mode = BLE_PHY_MODE_2M; - break; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - case BLE_HCI_LE_PHY_CODED: - phy_mode = BLE_PHY_MODE_CODED_500KBPS; - break; -#endif - default: - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (rx_chan > 0x27) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (ble_ll_dtm_rx_create_ctx(rx_chan, phy_mode)) { - return BLE_ERR_UNSPECIFIED; - } - - return BLE_ERR_SUCCESS; -} - -int ble_ll_hci_dtm_rx_test(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_rx_test_cp *cmd = (const void *) cmdbuf; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - return ble_ll_dtm_rx_test(cmd->rx_chan, BLE_HCI_LE_PHY_1M); -} - -int ble_ll_hci_dtm_rx_test_v2(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_rx_test_v2_cp *cmd = (const void *) cmdbuf; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* TODO ignoring modulation index */ - - return ble_ll_dtm_rx_test(cmd->rx_chan, cmd->phy); -} - -int ble_ll_dtm_end_test(uint8_t *rsp, uint8_t *rsplen) -{ - put_le16(rsp, g_ble_ll_dtm_ctx. num_of_packets); - *rsplen = 2; - - ble_ll_dtm_ctx_free(&g_ble_ll_dtm_ctx); - return BLE_ERR_SUCCESS; -} - -int ble_ll_dtm_rx_isr_start(struct ble_mbuf_hdr *rxhdr, uint32_t aa) -{ - return 0; -} - -void -ble_ll_dtm_rx_pkt_in(struct os_mbuf *rxpdu, struct ble_mbuf_hdr *hdr) -{ - if (BLE_MBUF_HDR_CRC_OK(hdr)) { - /* XXX Compare data. */ - g_ble_ll_dtm_ctx.num_of_packets++; - STATS_INC(ble_ll_dtm_stats, rx_count); - } - - if (ble_ll_dtm_rx_start() != 0) { - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &g_ble_ll_dtm_ctx.evt); - STATS_INC(ble_ll_dtm_stats, rx_failed); - } -} - -int -ble_ll_dtm_rx_isr_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr) -{ - struct os_mbuf *rxpdu; - - if (!g_ble_ll_dtm_ctx.active) { - return -1; - } - - rxpdu = ble_ll_rxpdu_alloc(rxbuf[1] + BLE_LL_PDU_HDR_LEN); - - /* Copy the received pdu and hand it up */ - if (rxpdu) { - ble_phy_rxpdu_copy(rxbuf, rxpdu); - ble_ll_rx_pdu_in(rxpdu); - } - - return 0; -} - -void -ble_ll_dtm_wfr_timer_exp(void) -{ - /* Should not be needed */ - BLE_LL_ASSERT(0); -} - - -void -ble_ll_dtm_reset(void) -{ - ble_ll_dtm_ctx_free(&g_ble_ll_dtm_ctx); -} - -void -ble_ll_dtm_init(void) -{ - int rc; - - rc = stats_init_and_reg(STATS_HDR(ble_ll_dtm_stats), - STATS_SIZE_INIT_PARMS(ble_ll_dtm_stats, STATS_SIZE_32), - STATS_NAME_INIT_PARMS(ble_ll_dtm_stats), - "ble_ll_dtm"); - SYSINIT_PANIC_ASSERT(rc == 0); -} -#endif -#endif \ No newline at end of file diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_dtm_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_dtm_priv.h deleted file mode 100644 index e04af07be..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_dtm_priv.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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_TEST_PRIV_ -#define H_BLE_LL_TEST_PRIV_ - -#include -#include -#include "nimble/ble.h" - -int ble_ll_hci_dtm_tx_test(const uint8_t *cmdbuf, uint8_t len); -int ble_ll_hci_dtm_tx_test_v2(const uint8_t *cmdbuf, uint8_t len); - -int ble_ll_hci_dtm_rx_test(const uint8_t *cmdbuf, uint8_t len); -int ble_ll_hci_dtm_rx_test_v2(const uint8_t *cmdbuf, uint8_t len); - -int ble_ll_dtm_end_test(uint8_t *rsp, uint8_t *rsplen); - -int ble_ll_dtm_rx_isr_start(struct ble_mbuf_hdr *rxhdr, uint32_t aa); -int ble_ll_dtm_rx_isr_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr); -void ble_ll_dtm_rx_pkt_in(struct os_mbuf *rxpdu, struct ble_mbuf_hdr *hdr); -void ble_ll_dtm_wfr_timer_exp(void); -void ble_ll_dtm_reset(void); -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_hci.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_hci.c deleted file mode 100644 index d83af2c01..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_hci.c +++ /dev/null @@ -1,1519 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/include/nimble/hci_common.h" -#include "nimble/nimble/include/nimble/ble_hci_trans.h" -#include "../include/controller/ble_hw.h" -#include "../include/controller/ble_ll_adv.h" -#include "../include/controller/ble_ll_scan.h" -#include "../include/controller/ble_ll.h" -#include "../include/controller/ble_ll_hci.h" -#include "../include/controller/ble_ll_whitelist.h" -#include "../include/controller/ble_ll_resolv.h" -#include "../include/controller/ble_ll_sync.h" -#include "ble_ll_priv.h" -#include "ble_ll_conn_priv.h" - -#if MYNEWT_VAL(BLE_LL_DTM) -#include "ble_ll_dtm_priv.h" -#endif - -static void ble_ll_hci_cmd_proc(struct ble_npl_event *ev); - -/* OS event to enqueue command */ -static struct ble_npl_event g_ble_ll_hci_cmd_ev; - -/* LE event mask */ -static uint64_t g_ble_ll_hci_le_event_mask; -static uint64_t g_ble_ll_hci_event_mask; -static uint64_t g_ble_ll_hci_event_mask2; - -static int16_t rx_path_pwr_compensation; -static int16_t tx_path_pwr_compensation; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static enum { - ADV_MODE_ANY, - ADV_MODE_LEGACY, - ADV_MODE_EXT, -} hci_adv_mode; - -bool ble_ll_hci_adv_mode_ext(void) -{ - return hci_adv_mode == ADV_MODE_EXT; -} -#else -bool -ble_ll_hci_adv_mode_ext(void) -{ - return false; -} -#endif - -/** - * ll hci get num cmd pkts - * - * Returns the number of command packets that the host is allowed to send - * to the controller. - * - * @return uint8_t - */ -static uint8_t -ble_ll_hci_get_num_cmd_pkts(void) -{ - return BLE_LL_CFG_NUM_HCI_CMD_PKTS; -} - -/** - * Send an event to the host. - * - * @param evbuf Pointer to event buffer to send - * - * @return int 0: success; -1 otherwise. - */ -int -ble_ll_hci_event_send(struct ble_hci_ev *hci_ev) -{ - int rc; - - BLE_LL_DEBUG_GPIO(HCI_EV, 1); - - BLE_LL_ASSERT(sizeof(*hci_ev) + hci_ev->length <= BLE_LL_MAX_EVT_LEN); - - /* Count number of events sent */ - STATS_INC(ble_ll_stats, hci_events_sent); - - /* Send the event to the host */ - rc = ble_hci_trans_ll_evt_tx((uint8_t *)hci_ev); - - BLE_LL_DEBUG_GPIO(HCI_EV, 0); - - return rc; -} - -/** - * Created and sends a command complete event with the no-op opcode to the - * host. - */ -void -ble_ll_hci_send_noop(void) -{ - struct ble_hci_ev_command_complete_nop *ev; - struct ble_hci_ev *hci_ev; - - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - /* Create a command complete event with a NO-OP opcode */ - hci_ev->opcode = BLE_HCI_EVCODE_COMMAND_COMPLETE; - - hci_ev->length = sizeof(*ev); - ev = (void *)hci_ev->data; - - ev->num_packets = ble_ll_hci_get_num_cmd_pkts(); - ev->opcode = BLE_HCI_OPCODE_NOP; - - ble_ll_hci_event_send(hci_ev); - } -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) -/** - * LE encrypt command - * - * @param cmdbuf - * @param rspbuf - * @param rsplen - * - * @return int - */ -static int -ble_ll_hci_le_encrypt(const uint8_t *cmdbuf, uint8_t len, uint8_t *rspbuf, - uint8_t *rsplen) -{ - const struct ble_hci_le_encrypt_cp *cmd = (const void *) cmdbuf; - struct ble_hci_le_encrypt_rp *rsp = (void *)rspbuf; - struct ble_encryption_block ecb; - int rc; - - /* Call the link layer to encrypt the data */ - swap_buf(ecb.key, cmd->key, BLE_ENC_BLOCK_SIZE); - swap_buf(ecb.plain_text, cmd->data, BLE_ENC_BLOCK_SIZE); - rc = ble_hw_encrypt_block(&ecb); - if (!rc) { - swap_buf(rsp->data, ecb.cipher_text, BLE_ENC_BLOCK_SIZE); - *rsplen = sizeof(*rsp); - rc = BLE_ERR_SUCCESS; - } else { - rc = BLE_ERR_CTLR_BUSY; - } - - return rc; -} -#endif - -/** - * LE rand command - * - * @param cmdbuf - * @param rspbuf - * @param rsplen - * - * @return int - */ -static int -ble_ll_hci_le_rand(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_le_rand_rp *rsp = (void *) rspbuf; - - ble_ll_rand_data_get((uint8_t *)&rsp->random_number, - sizeof(rsp->random_number)); - - *rsplen = sizeof(*rsp); - return BLE_ERR_SUCCESS; -} - -/** - * Read local version - * - * @param rspbuf - * @param rsplen - * - * @return int - */ -static int -ble_ll_hci_rd_local_version(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_ip_rd_local_ver_rp *rsp = (void *) rspbuf; - - rsp->hci_ver = BLE_HCI_VER_BCS; - rsp->hci_rev = 0; - rsp->lmp_ver = BLE_LMP_VER_BCS; - rsp->manufacturer = htole16(MYNEWT_VAL(BLE_LL_MFRG_ID)); - rsp->lmp_subver = 0; - - *rsplen = sizeof(*rsp); - return BLE_ERR_SUCCESS; -} - -/** - * Read local supported features - * - * @param rspbuf - * @param rsplen - * - * @return int - */ -static int -ble_ll_hci_rd_local_supp_feat(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_ip_rd_loc_supp_feat_rp *rsp = (void *) rspbuf; - - /* - * The only two bits we set here currently are (5th byte): - * BR/EDR not supported (bit 5) - * LE supported (controller) (bit 6) - */ - rsp->features = htole64(0x0000006000000000); - - *rsplen = sizeof(*rsp); - return BLE_ERR_SUCCESS; -} - -/** - * Read local supported commands - * - * @param rspbuf - * @param rsplen - * - * @return int - */ -static int -ble_ll_hci_rd_local_supp_cmd(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_ip_rd_loc_supp_cmd_rp *rsp = (void *) rspbuf; - - memset(rsp->commands, 0, sizeof(rsp->commands)); - memcpy(rsp->commands, g_ble_ll_supp_cmds, sizeof(g_ble_ll_supp_cmds)); - - *rsplen = sizeof(*rsp); - return BLE_ERR_SUCCESS; -} - -/** - * Called to read the public device address of the device - * - * - * @param rspbuf - * @param rsplen - * - * @return int - */ -static int -ble_ll_hci_rd_bd_addr(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_ip_rd_bd_addr_rp *rsp = (void *) rspbuf; - - memcpy(rsp->addr, g_dev_addr, BLE_DEV_ADDR_LEN); - - *rsplen = sizeof(*rsp); - return BLE_ERR_SUCCESS; -} - -/** - * ll hci set le event mask - * - * Called when the LL controller receives a set LE event mask command. - * - * Context: Link Layer task (HCI command parser) - * - * @param cmdbuf Pointer to command buf. - * - * @return int BLE_ERR_SUCCESS. Does not return any errors. - */ -static int -ble_ll_hci_set_le_event_mask(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_event_mask_cp *cmd = (const void *) cmdbuf; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - g_ble_ll_hci_le_event_mask = le64toh(cmd->event_mask); - - return BLE_ERR_SUCCESS; -} - -/** - * HCI read buffer size command. Returns the ACL data packet length and - * num data packets. - * - * @param rspbuf Pointer to response buffer - * @param rsplen Length of response buffer - * - * @return int BLE error code - */ -static int -ble_ll_hci_le_read_bufsize(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_le_rd_buf_size_rp *rp = (void *) rspbuf; - - rp->data_len = htole16(g_ble_ll_data.ll_acl_pkt_size); - rp->data_packets = g_ble_ll_data.ll_num_acl_pkts; - - *rsplen = sizeof(*rp); - return BLE_ERR_SUCCESS; -} - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) -/** - * Checks the preferred phy masks for validity and places the preferred masks - * in the input phy masks - - * @return int BLE_ERR_SUCCESS or BLE_ERR_INV_HCI_CMD_PARMS or BLE_ERR_UNSUPPORTED - */ -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) -{ - /* Check for RFU */ - if ((tx_phys & ~BLE_HCI_LE_PHY_PREF_MASK_ALL) || - (rx_phys & ~BLE_HCI_LE_PHY_PREF_MASK_ALL)) { - return BLE_ERR_UNSUPPORTED; - } - - if ((!(all_phys & BLE_HCI_LE_PHY_NO_TX_PREF_MASK) && (tx_phys == 0)) || - (!(all_phys & BLE_HCI_LE_PHY_NO_RX_PREF_MASK) && (rx_phys == 0))) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* If phy not supported, return error */ -#if !MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) - if((tx_phys & BLE_HCI_LE_PHY_2M_PREF_MASK) || - (rx_phys & BLE_HCI_LE_PHY_2M_PREF_MASK)) { - return BLE_ERR_UNSUPPORTED; - } -#endif -#if !MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - if ((tx_phys & BLE_HCI_LE_PHY_CODED_PREF_MASK) || - (rx_phys & BLE_HCI_LE_PHY_CODED_PREF_MASK)) { - return BLE_ERR_UNSUPPORTED; - } -#endif - /* Set the default PHY preferences */ - if (all_phys & BLE_HCI_LE_PHY_NO_TX_PREF_MASK) { - tx_phys = BLE_HCI_LE_PHY_PREF_MASK_ALL; - } - *txphy = tx_phys; - - if (all_phys & BLE_HCI_LE_PHY_NO_RX_PREF_MASK) { - rx_phys = BLE_HCI_LE_PHY_PREF_MASK_ALL; - } - *rxphy = rx_phys; - - return BLE_ERR_SUCCESS; -} - -/** - * Set PHY preferences for connection - * - * @param cmdbuf - * - * @return int - */ -static int -ble_ll_hci_le_set_def_phy(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_default_phy_cp *cmd = (const void *) cmdbuf; - int rc; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - rc = ble_ll_hci_chk_phy_masks(cmd->all_phys, cmd->tx_phys, cmd->rx_phys, - &g_ble_ll_data.ll_pref_tx_phys, - &g_ble_ll_data.ll_pref_rx_phys); - return rc; -} -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_DATA_LEN_EXT) -/** - * HCI write suggested default data length command. - * - * This command is used by the host to change the initial max tx octets/time - * for all connections. Note that if the controller does not support the - * requested times no error is returned; the controller simply ignores the - * request (but remembers what the host requested for the read suggested - * default data length command). The spec allows for the controller to - * disregard the host. - * - * @param rspbuf Pointer to response buffer - * @param rsplen Length of response buffer - * - * @return int BLE error code - */ -static int -ble_ll_hci_le_wr_sugg_data_len(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_wr_sugg_def_data_len_cp *cmd = (const void*) cmdbuf; - uint16_t tx_oct; - uint16_t tx_time; - int rc; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Get suggested octets and time */ - tx_oct = le16toh(cmd->max_tx_octets); - tx_time = le16toh(cmd->max_tx_time); - - /* If valid, write into suggested and change connection initial times */ - if (ble_ll_chk_txrx_octets(tx_oct) && ble_ll_chk_txrx_time(tx_time)) { - g_ble_ll_conn_params.sugg_tx_octets = (uint8_t)tx_oct; - g_ble_ll_conn_params.sugg_tx_time = tx_time; - - /* - * We can disregard host suggestion, but we are a nice controller so - * let's use host suggestion, unless they exceed max supported values - * in which case we just use our max. - */ - g_ble_ll_conn_params.conn_init_max_tx_octets = - min(tx_oct, g_ble_ll_conn_params.supp_max_tx_octets); - g_ble_ll_conn_params.conn_init_max_tx_time = - min(tx_time, g_ble_ll_conn_params.supp_max_tx_time); - - /* - * Use the same for coded and uncoded defaults. These are used when PHY - * parameters are initialized and we want to use values overridden by - * host. Make sure we do not exceed max supported time on uncoded. - */ - g_ble_ll_conn_params.conn_init_max_tx_time_uncoded = - min(BLE_LL_CONN_SUPP_TIME_MAX_UNCODED, - g_ble_ll_conn_params.conn_init_max_tx_time); - g_ble_ll_conn_params.conn_init_max_tx_time_coded = - g_ble_ll_conn_params.conn_init_max_tx_time; - - rc = BLE_ERR_SUCCESS; - } else { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - } - - return rc; -} - -/** - * HCI read suggested default data length command. Returns the controllers - * initial max tx octet/time. - * - * @param rspbuf Pointer to response buffer - * @param rsplen Length of response buffer - * - * @return int BLE error code - */ -static int -ble_ll_hci_le_rd_sugg_data_len(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_le_rd_sugg_def_data_len_rp *rsp = (void *) rspbuf; - - /* Place the data packet length and number of packets in the buffer */ - rsp->max_tx_octets = htole16(g_ble_ll_conn_params.sugg_tx_octets); - rsp->max_tx_time = htole16(g_ble_ll_conn_params.sugg_tx_time); - - *rsplen = sizeof(*rsp); - return BLE_ERR_SUCCESS; -} - -/** - * HCI read maximum data length command. Returns the controllers max supported - * rx/tx octets/times. - * - * @param rspbuf Pointer to response buffer - * @param rsplen Length of response buffer - * - * @return int BLE error code - */ -static int -ble_ll_hci_le_rd_max_data_len(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_le_rd_max_data_len_rp *rsp = (void *)rspbuf; - - /* Place the data packet length and number of packets in the buffer */ - rsp->max_tx_octests = htole16(g_ble_ll_conn_params.supp_max_tx_octets); - rsp->max_tx_time = htole16(g_ble_ll_conn_params.supp_max_tx_time); - rsp->max_rx_octests = htole16(g_ble_ll_conn_params.supp_max_rx_octets); - rsp->max_rx_time = htole16(g_ble_ll_conn_params.supp_max_rx_time); - - *rsplen = sizeof(*rsp); - return BLE_ERR_SUCCESS; -} -#endif - -/** - * HCI read local supported features command. Returns the features - * supported by the controller. - * - * @param rspbuf Pointer to response buffer - * @param rsplen Length of response buffer - * - * @return int BLE error code - */ -static int -ble_ll_hci_le_read_local_features(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_le_rd_loc_supp_feat_rp *rsp = (void *) rspbuf; - - rsp->features = htole64(ble_ll_read_supp_features()); - - *rsplen = sizeof(*rsp); - return BLE_ERR_SUCCESS; -} - -/** - * HCI read local supported states command. Returns the states - * supported by the controller. - * - * @param rspbuf Pointer to response buffer - * @param rsplen Length of response buffer - * - * @return int BLE error code - */ -static int -ble_ll_hci_le_read_supp_states(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_le_rd_supp_states_rp *rsp = (void *) rspbuf; - - /* Add list of supported states. */ - rsp->states = htole64(ble_ll_read_supp_states()); - - *rsplen = sizeof(*rsp); - return BLE_ERR_SUCCESS; -} - - -/** - * Checks to see if a LE event has been disabled by the host. - * - * @param subev Sub-event code of the LE Meta event. Note that this can - * be a value from 1 to 64, inclusive. - * - * @return uint8_t 0: event is not enabled; otherwise event is enabled. - */ -bool -ble_ll_hci_is_le_event_enabled(unsigned int subev) -{ - /* The LE meta event must be enabled for any LE event to be enabled */ - if (g_ble_ll_hci_event_mask & (1ull << (BLE_HCI_EVCODE_LE_META - 1))) { - return g_ble_ll_hci_le_event_mask & (1ull << (subev - 1)); - } - - return false; -} - -/** - * Checks to see if an event has been disabled by the host. - * - * NOTE: there are two "pages" of event masks; the first page is for event - * codes between 0 and 63 and the second page is for event codes 64 and - * greater. - * - * @param evcode This is the event code for the event. - * - * @return uint8_t 0: event is not enabled; otherwise event is enabled. - */ -bool -ble_ll_hci_is_event_enabled(unsigned int evcode) -{ - if (evcode >= 64) { - return g_ble_ll_hci_event_mask2 & (1ull << (evcode - 64)); - } - - return g_ble_ll_hci_event_mask & (1ull << (evcode - 1)); -} - -/** - * Called to determine if the reply to the command should be a command complete - * event or a command status event. - * - * @param ocf - * - * @return int 0: return command complete; 1: return command status event - */ -static int -ble_ll_hci_le_cmd_send_cmd_status(uint16_t ocf) -{ - int rc; - - switch (ocf) { - case BLE_HCI_OCF_LE_RD_REM_FEAT: - case BLE_HCI_OCF_LE_CREATE_CONN: - case BLE_HCI_OCF_LE_EXT_CREATE_CONN: - case BLE_HCI_OCF_LE_CONN_UPDATE: - case BLE_HCI_OCF_LE_START_ENCRYPT: - case BLE_HCI_OCF_LE_RD_P256_PUBKEY: - case BLE_HCI_OCF_LE_GEN_DHKEY: - case BLE_HCI_OCF_LE_SET_PHY: - case BLE_HCI_OCF_LE_PERIODIC_ADV_CREATE_SYNC: - rc = 1; - break; - default: - rc = 0; - break; - } - return rc; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -/** HCI LE read maximum advertising data length command. Returns the controllers -* max supported advertising data length; -* -* @param rspbuf Pointer to response buffer -* @param rsplen Length of response buffer -* -* @return int BLE error code -*/ -static int -ble_ll_adv_rd_max_adv_data_len(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_le_rd_max_adv_data_len_rp *rsp = (void *) rspbuf; - - rsp->max_adv_data_len = htole16(BLE_ADV_DATA_MAX_LEN); - - *rsplen = sizeof(*rsp); - return BLE_ERR_SUCCESS; -} - -/** - * HCI LE read number of supported advertising sets - * - * @param rspbuf Pointer to response buffer - * @param rsplen Length of response buffer - * - * @return int BLE error code - */ -static int -ble_ll_adv_rd_sup_adv_sets(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_le_rd_num_of_adv_sets_rp *rsp = (void *)rspbuf; - - rsp->num_sets = BLE_ADV_INSTANCES; - - *rsplen = sizeof(*rsp); - return BLE_ERR_SUCCESS; -} - -static bool -ble_ll_is_valid_adv_mode(uint8_t ocf) -{ - /* - * If, since the last power-on or reset, the Host has ever issued a legacy - * advertising command and then issues an extended advertising command, or - * has ever issued an extended advertising command and then issues a legacy - * advertising command, the Controller shall return the error code Command - * Disallowed (0x0C). - */ - - switch(ocf) { - case BLE_HCI_OCF_LE_CREATE_CONN: - case BLE_HCI_OCF_LE_SET_ADV_PARAMS: - case BLE_HCI_OCF_LE_SET_ADV_ENABLE: - case BLE_HCI_OCF_LE_SET_ADV_DATA: - case BLE_HCI_OCF_LE_SET_SCAN_PARAMS: - case BLE_HCI_OCF_LE_SET_SCAN_ENABLE: - case BLE_HCI_OCF_LE_SET_SCAN_RSP_DATA: - case BLE_HCI_OCF_LE_RD_ADV_CHAN_TXPWR: - if (hci_adv_mode == ADV_MODE_EXT) { - return false; - } - - hci_adv_mode = ADV_MODE_LEGACY; - break; - case BLE_HCI_OCF_LE_EXT_CREATE_CONN: - case BLE_HCI_OCF_LE_SET_EXT_ADV_DATA: - case BLE_HCI_OCF_LE_SET_EXT_ADV_ENABLE: - case BLE_HCI_OCF_LE_SET_EXT_ADV_PARAM: - case BLE_HCI_OCF_LE_SET_EXT_SCAN_ENABLE: - case BLE_HCI_OCF_LE_SET_EXT_SCAN_PARAM: - case BLE_HCI_OCF_LE_SET_EXT_SCAN_RSP_DATA: - case BLE_HCI_OCF_LE_RD_MAX_ADV_DATA_LEN: - case BLE_HCI_OCF_LE_RD_NUM_OF_ADV_SETS: - case BLE_HCI_OCF_LE_REMOVE_ADV_SET: - case BLE_HCI_OCF_LE_CLEAR_ADV_SETS: - case BLE_HCI_OCF_LE_SET_PERIODIC_ADV_PARAMS: - case BLE_HCI_OCF_LE_SET_PERIODIC_ADV_DATA: - case BLE_HCI_OCF_LE_SET_PERIODIC_ADV_ENABLE: - case BLE_HCI_OCF_LE_PERIODIC_ADV_CREATE_SYNC: - case BLE_HCI_OCF_LE_PERIODIC_ADV_CREATE_SYNC_CANCEL: - case BLE_HCI_OCF_LE_PERIODIC_ADV_TERM_SYNC: - case BLE_HCI_OCF_LE_ADD_DEV_TO_PERIODIC_ADV_LIST: - case BLE_HCI_OCF_LE_REM_DEV_FROM_PERIODIC_ADV_LIST: - case BLE_HCI_OCF_LE_CLEAR_PERIODIC_ADV_LIST: - case BLE_HCI_OCF_LE_RD_PERIODIC_ADV_LIST_SIZE: -#if MYNEWT_VAL(BLE_VERSION) >= 51 - case BLE_HCI_OCF_LE_PERIODIC_ADV_RECEIVE_ENABLE: -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - case BLE_HCI_OCF_LE_PERIODIC_ADV_SYNC_TRANSFER: - case BLE_HCI_OCF_LE_PERIODIC_ADV_SET_INFO_TRANSFER: - case BLE_HCI_OCF_LE_PERIODIC_ADV_SYNC_TRANSFER_PARAMS: - case BLE_HCI_OCF_LE_SET_DEFAULT_SYNC_TRANSFER_PARAMS: -#endif - if (hci_adv_mode == ADV_MODE_LEGACY) { - return false; - } - - hci_adv_mode = ADV_MODE_EXT; - break; - default: - break; - } - - return true; -} -#endif - -static int -ble_ll_read_tx_power(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_le_rd_transmit_power_rp *rsp = (void *) rspbuf; - - rsp->min_tx_power = ble_phy_txpower_round(-127); - rsp->max_tx_power = ble_phy_txpower_round(126); - - *rsplen = sizeof(*rsp); - return BLE_ERR_SUCCESS; -} - -static int -ble_ll_read_rf_path_compensation(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_le_rd_rf_path_compensation_rp *rsp = (void *) rspbuf; - - rsp->rx_path_compensation = htole16(rx_path_pwr_compensation); - rsp->tx_path_compensation = htole16(tx_path_pwr_compensation); - - *rsplen = sizeof(*rsp);; - return BLE_ERR_SUCCESS; -} - -static int -ble_ll_write_rf_path_compensation(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_wr_rf_path_compensation_cp *cmd = (const void *)cmdbuf; - int16_t rx; - int16_t tx; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - tx = le16toh(cmd->tx_path_compensation); - rx = le16toh(cmd->rx_path_compensation); - - if ((tx < -1280) || (tx > 1280) || (rx < -1280) || (rx > 1280)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - tx_path_pwr_compensation = tx; - rx_path_pwr_compensation = rx; - - ble_phy_set_rx_pwr_compensation(rx_path_pwr_compensation / 10); - - return BLE_ERR_SUCCESS; -} - -int8_t -ble_ll_get_tx_pwr_compensation(void) -{ - return tx_path_pwr_compensation / 10; -} - -/** - * Process a LE command sent from the host to the controller. The HCI command - * has a 3 byte command header followed by data. The header is: - * -> opcode (2 bytes) - * -> Length of parameters (1 byte; does include command header bytes). - * - * @param cmdbuf Pointer to command buffer. Points to start of command header. - * @param ocf Opcode command field. - * @param *rsplen Pointer to length of response - * - * @return int This function returns a BLE error code. If a command status - * event should be returned as opposed to command complete, - * 256 gets added to the return value. - */ -static int -ble_ll_hci_le_cmd_proc(const uint8_t *cmdbuf, uint8_t len, uint16_t ocf, - uint8_t *rspbuf, uint8_t *rsplen, - ble_ll_hci_post_cmd_complete_cb *cb) -{ - int rc; - - /* Assume error; if all pass rc gets set to 0 */ - rc = BLE_ERR_INV_HCI_CMD_PARMS; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (!ble_ll_is_valid_adv_mode(ocf)) { - rc = BLE_ERR_CMD_DISALLOWED; - - /* - * This code is here because we add 256 to the return code to denote - * that the reply to this command should be command status (as opposed to - * command complete). - * - * For unknown HCI command let us return always command status as per - * specification Bluetooth 5, Vol. 2, Chapter 4.4 - */ - if (ble_ll_hci_le_cmd_send_cmd_status(ocf)) { - rc += (BLE_ERR_MAX + 1); - } - - return rc; - } -#endif - - switch (ocf) { - case BLE_HCI_OCF_LE_SET_EVENT_MASK: - rc = ble_ll_hci_set_le_event_mask(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_RD_BUF_SIZE: - if (len == 0) { - rc = ble_ll_hci_le_read_bufsize(rspbuf, rsplen); - } - break; - case BLE_HCI_OCF_LE_RD_LOC_SUPP_FEAT: - if (len == 0) { - rc = ble_ll_hci_le_read_local_features(rspbuf, rsplen); - } - break; - case BLE_HCI_OCF_LE_SET_RAND_ADDR: -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - rc = ble_ll_set_random_addr(cmdbuf, len, hci_adv_mode == ADV_MODE_EXT); -#else - rc = ble_ll_set_random_addr(cmdbuf, len, false); -#endif - break; - case BLE_HCI_OCF_LE_SET_ADV_PARAMS: - rc = ble_ll_adv_set_adv_params(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_RD_ADV_CHAN_TXPWR: - if (len == 0) { - rc = ble_ll_adv_read_txpwr(rspbuf, rsplen); - } - break; - case BLE_HCI_OCF_LE_SET_ADV_DATA: - rc = ble_ll_hci_set_adv_data(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_SET_SCAN_RSP_DATA: - rc = ble_ll_hci_set_scan_rsp_data(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_SET_ADV_ENABLE: - rc = ble_ll_hci_adv_set_enable(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_SET_SCAN_PARAMS: - rc = ble_ll_scan_set_scan_params(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_SET_SCAN_ENABLE: - rc = ble_ll_hci_scan_set_enable(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_CREATE_CONN: - rc = ble_ll_conn_create(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_CREATE_CONN_CANCEL: - if (len == 0) { - rc = ble_ll_conn_create_cancel(cb); - } - break; - case BLE_HCI_OCF_LE_RD_WHITE_LIST_SIZE: - if (len == 0) { - rc = ble_ll_whitelist_read_size(rspbuf, rsplen); - } - break; - case BLE_HCI_OCF_LE_CLEAR_WHITE_LIST: - if (len == 0) { - rc = ble_ll_whitelist_clear(); - } - break; - case BLE_HCI_OCF_LE_ADD_WHITE_LIST: - rc = ble_ll_whitelist_add(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_RMV_WHITE_LIST: - rc = ble_ll_whitelist_rmv(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_CONN_UPDATE: - rc = ble_ll_conn_hci_update(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_SET_HOST_CHAN_CLASS: - rc = ble_ll_conn_hci_set_chan_class(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_RD_CHAN_MAP: - rc = ble_ll_conn_hci_rd_chan_map(cmdbuf, len, rspbuf, rsplen); - break; - case BLE_HCI_OCF_LE_RD_REM_FEAT: - rc = ble_ll_conn_hci_read_rem_features(cmdbuf, len); - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - case BLE_HCI_OCF_LE_ENCRYPT: - rc = ble_ll_hci_le_encrypt(cmdbuf, len, rspbuf, rsplen); - break; -#endif - case BLE_HCI_OCF_LE_RAND: - if (len == 0) { - rc = ble_ll_hci_le_rand(rspbuf, rsplen); - } - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - case BLE_HCI_OCF_LE_START_ENCRYPT: - rc = ble_ll_conn_hci_le_start_encrypt(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_LT_KEY_REQ_REPLY: - rc = ble_ll_conn_hci_le_ltk_reply(cmdbuf, len, rspbuf, rsplen); - break; - case BLE_HCI_OCF_LE_LT_KEY_REQ_NEG_REPLY: - rc = ble_ll_conn_hci_le_ltk_neg_reply(cmdbuf, len, rspbuf, rsplen); - break; -#endif - case BLE_HCI_OCF_LE_RD_SUPP_STATES : - if (len == 0) { - rc = ble_ll_hci_le_read_supp_states(rspbuf, rsplen); - } - break; -#if MYNEWT_VAL(BLE_LL_DTM) - case BLE_HCI_OCF_LE_TX_TEST: - rc = ble_ll_hci_dtm_tx_test(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_RX_TEST: - rc = ble_ll_hci_dtm_rx_test(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_TEST_END: - if (len == 0) { - rc = ble_ll_dtm_end_test(rspbuf, rsplen); - } - break; -#endif - case BLE_HCI_OCF_LE_REM_CONN_PARAM_RR: - rc = ble_ll_conn_hci_param_rr(cmdbuf, len, rspbuf, rsplen); - break; - case BLE_HCI_OCF_LE_REM_CONN_PARAM_NRR: - rc = ble_ll_conn_hci_param_nrr(cmdbuf, len, rspbuf, rsplen); - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_DATA_LEN_EXT) - case BLE_HCI_OCF_LE_SET_DATA_LEN: - rc = ble_ll_conn_hci_set_data_len(cmdbuf, len, rspbuf, rsplen); - break; - case BLE_HCI_OCF_LE_RD_SUGG_DEF_DATA_LEN: - if (len == 0) { - rc = ble_ll_hci_le_rd_sugg_data_len(rspbuf, rsplen); - } - break; - case BLE_HCI_OCF_LE_WR_SUGG_DEF_DATA_LEN: - rc = ble_ll_hci_le_wr_sugg_data_len(cmdbuf, len); - break; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - case BLE_HCI_OCF_LE_ADD_RESOLV_LIST: - rc = ble_ll_resolv_list_add(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_RMV_RESOLV_LIST: - rc = ble_ll_resolv_list_rmv(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_CLR_RESOLV_LIST: - if (len == 0) { - rc = ble_ll_resolv_list_clr(); - } - break; - case BLE_HCI_OCF_LE_RD_RESOLV_LIST_SIZE: - if (len == 0) { - rc = ble_ll_resolv_list_read_size(rspbuf, rsplen); - } - break; - case BLE_HCI_OCF_LE_RD_PEER_RESOLV_ADDR: - rc = ble_ll_resolv_peer_addr_rd(cmdbuf, len, rspbuf, rsplen); - break; - case BLE_HCI_OCF_LE_RD_LOCAL_RESOLV_ADDR: - rc = ble_ll_resolv_local_addr_rd(cmdbuf, len, rspbuf, rsplen); - break; - case BLE_HCI_OCF_LE_SET_ADDR_RES_EN: - rc = ble_ll_resolv_enable_cmd(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_SET_RPA_TMO: - rc = ble_ll_resolv_set_rpa_tmo(cmdbuf, len); - break; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_DATA_LEN_EXT) - case BLE_HCI_OCF_LE_RD_MAX_DATA_LEN: - if (len == 0) { - rc = ble_ll_hci_le_rd_max_data_len(rspbuf, rsplen); - } - break; -#endif -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - case BLE_HCI_OCF_LE_RD_PHY: - rc = ble_ll_conn_hci_le_rd_phy(cmdbuf, len, rspbuf, rsplen); - break; - case BLE_HCI_OCF_LE_SET_DEFAULT_PHY: - rc = ble_ll_hci_le_set_def_phy(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_SET_PHY: - rc = ble_ll_conn_hci_le_set_phy(cmdbuf, len); - break; -#endif -#if MYNEWT_VAL(BLE_LL_DTM) - case BLE_HCI_OCF_LE_RX_TEST_V2: - rc = ble_ll_hci_dtm_rx_test_v2(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_TX_TEST_V2: - rc = ble_ll_hci_dtm_tx_test_v2(cmdbuf, len); - break; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - case BLE_HCI_OCF_LE_SET_ADV_SET_RND_ADDR: - rc = ble_ll_adv_hci_set_random_addr(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_SET_EXT_ADV_PARAM: - rc = ble_ll_adv_ext_set_param(cmdbuf, len, rspbuf, rsplen); - break; - case BLE_HCI_OCF_LE_SET_EXT_ADV_DATA: - rc = ble_ll_adv_ext_set_adv_data(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_SET_EXT_SCAN_RSP_DATA: - rc = ble_ll_adv_ext_set_scan_rsp(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_SET_EXT_ADV_ENABLE: - rc = ble_ll_adv_ext_set_enable(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_RD_MAX_ADV_DATA_LEN: - if (len == 0) { - rc = ble_ll_adv_rd_max_adv_data_len(rspbuf, rsplen); - } - break; - case BLE_HCI_OCF_LE_RD_NUM_OF_ADV_SETS: - if (len == 0) { - rc = ble_ll_adv_rd_sup_adv_sets(rspbuf, rsplen); - } - break; - case BLE_HCI_OCF_LE_REMOVE_ADV_SET: - rc = ble_ll_adv_remove(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_CLEAR_ADV_SETS: - if (len == 0) { - rc = ble_ll_adv_clear_all(); - } - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - case BLE_HCI_OCF_LE_SET_PERIODIC_ADV_PARAMS: - rc = ble_ll_adv_periodic_set_param(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_SET_PERIODIC_ADV_DATA: - rc = ble_ll_adv_periodic_set_data(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_SET_PERIODIC_ADV_ENABLE: - rc = ble_ll_adv_periodic_enable(cmdbuf, len); - break; -#endif -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - case BLE_HCI_OCF_LE_SET_EXT_SCAN_PARAM: - rc = ble_ll_set_ext_scan_params(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_SET_EXT_SCAN_ENABLE: - rc = ble_ll_hci_ext_scan_set_enable(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_EXT_CREATE_CONN: - rc = ble_ll_ext_conn_create(cmdbuf, len); - break; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - case BLE_HCI_OCF_LE_PERIODIC_ADV_CREATE_SYNC: - rc = ble_ll_sync_create(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_PERIODIC_ADV_CREATE_SYNC_CANCEL: - if (len == 0) { - rc = ble_ll_sync_cancel(cb); - } - break; - case BLE_HCI_OCF_LE_PERIODIC_ADV_TERM_SYNC: - rc = ble_ll_sync_terminate(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_ADD_DEV_TO_PERIODIC_ADV_LIST: - rc = ble_ll_sync_list_add(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_REM_DEV_FROM_PERIODIC_ADV_LIST: - rc = ble_ll_sync_list_remove(cmdbuf, len); - break; - case BLE_HCI_OCF_LE_CLEAR_PERIODIC_ADV_LIST: - if (len == 0) { - rc = ble_ll_sync_list_clear(); - } - break; - case BLE_HCI_OCF_LE_RD_PERIODIC_ADV_LIST_SIZE: - if (len == 0) { - rc = ble_ll_sync_list_size(rspbuf, rsplen); - } - break; -#if MYNEWT_VAL(BLE_VERSION) >= 51 - case BLE_HCI_OCF_LE_PERIODIC_ADV_RECEIVE_ENABLE: - rc = ble_ll_sync_receive_enable(cmdbuf, len); - break; -#endif -#endif - case BLE_HCI_OCF_LE_RD_TRANSMIT_POWER: - rc = ble_ll_read_tx_power(rspbuf, rsplen); - break; - case BLE_HCI_OCF_LE_RD_RF_PATH_COMPENSATION: - rc = ble_ll_read_rf_path_compensation(rspbuf, rsplen); - break; - case BLE_HCI_OCF_LE_WR_RF_PATH_COMPENSATION: - rc = ble_ll_write_rf_path_compensation(cmdbuf, len); - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - case BLE_HCI_OCF_LE_SET_PRIVACY_MODE: - rc = ble_ll_resolve_set_priv_mode(cmdbuf, len); - break; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - case BLE_HCI_OCF_LE_PERIODIC_ADV_SYNC_TRANSFER: - rc = ble_ll_sync_transfer(cmdbuf, len, rspbuf, rsplen); - break; - case BLE_HCI_OCF_LE_PERIODIC_ADV_SET_INFO_TRANSFER: - rc = ble_ll_adv_periodic_set_info_transfer(cmdbuf, len, rspbuf, rsplen); - break; - case BLE_HCI_OCF_LE_PERIODIC_ADV_SYNC_TRANSFER_PARAMS: - rc = ble_ll_set_sync_transfer_params(cmdbuf, len, rspbuf, rsplen); - break; - case BLE_HCI_OCF_LE_SET_DEFAULT_SYNC_TRANSFER_PARAMS: - rc = ble_ll_set_default_sync_transfer_params(cmdbuf, len); - break; -#endif -#if MYNEWT_VAL(BLE_VERSION) >= 52 - case BLE_HCI_OCF_LE_SET_HOST_FEAT: - rc = ble_ll_set_host_feat(cmdbuf, len); - break; -#endif - default: - rc = BLE_ERR_UNKNOWN_HCI_CMD; - break; - } - - /* - * This code is here because we add 256 to the return code to denote - * that the reply to this command should be command status (as opposed to - * command complete). - * - * For unknown HCI command let us return always command status as per - * specification Bluetooth 5, Vol. 2, Chapter 4.4 - */ - if (ble_ll_hci_le_cmd_send_cmd_status(ocf) || rc == BLE_ERR_UNKNOWN_HCI_CMD) { - rc += (BLE_ERR_MAX + 1); - } - - return rc; -} - -/** - * Process a link control command sent from the host to the controller. The HCI - * command has a 3 byte command header followed by data. The header is: - * -> opcode (2 bytes) - * -> Length of parameters (1 byte; does include command header bytes). - * - * @param cmdbuf Pointer to command buffer. Points to start of command header. - * @param ocf Opcode command field. - * - * @return int This function returns a BLE error code. If a command status - * event should be returned as opposed to command complete, - * 256 gets added to the return value. - */ -static int -ble_ll_hci_link_ctrl_cmd_proc(const uint8_t *cmdbuf, uint8_t len, uint16_t ocf) -{ - int rc; - - switch (ocf) { - case BLE_HCI_OCF_DISCONNECT_CMD: - rc = ble_ll_conn_hci_disconnect_cmd(cmdbuf, len); - /* Send command status instead of command complete */ - rc += (BLE_ERR_MAX + 1); - break; - - case BLE_HCI_OCF_RD_REM_VER_INFO: - rc = ble_ll_conn_hci_rd_rem_ver_cmd(cmdbuf, len); - /* Send command status instead of command complete */ - rc += (BLE_ERR_MAX + 1); - break; - - default: - rc = BLE_ERR_UNKNOWN_HCI_CMD; - break; - } - - return rc; -} - -static int -ble_ll_hci_cb_set_event_mask(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_cb_set_event_mask_cp *cmd = (const void *) cmdbuf; - - if (len != sizeof (*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - g_ble_ll_hci_event_mask = le64toh(cmd->event_mask); - - return BLE_ERR_SUCCESS; -} - -static int -ble_ll_hci_cb_set_event_mask2(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_cb_set_event_mask2_cp *cmd = (const void *) cmdbuf; - - if (len != sizeof (*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - g_ble_ll_hci_event_mask2 = le64toh(cmd->event_mask2); - - return BLE_ERR_SUCCESS; -} - -static int -ble_ll_hci_ctlr_bb_cmd_proc(const uint8_t *cmdbuf, uint8_t len, uint16_t ocf, - uint8_t *rspbuf, uint8_t *rsplen) -{ - int rc; - - /* Assume error; if all pass rc gets set to 0 */ - rc = BLE_ERR_INV_HCI_CMD_PARMS; - - switch (ocf) { - case BLE_HCI_OCF_CB_SET_EVENT_MASK: - rc = ble_ll_hci_cb_set_event_mask(cmdbuf, len); - break; - case BLE_HCI_OCF_CB_RESET: - if (len == 0) { - rc = ble_ll_reset(); - } - break; - case BLE_HCI_OCF_CB_SET_EVENT_MASK2: - rc = ble_ll_hci_cb_set_event_mask2(cmdbuf, len); - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING) - case BLE_HCI_OCF_CB_RD_AUTH_PYLD_TMO: - rc = ble_ll_conn_hci_rd_auth_pyld_tmo(cmdbuf, len, rspbuf, rsplen); - break; - case BLE_HCI_OCF_CB_WR_AUTH_PYLD_TMO: - rc = ble_ll_conn_hci_wr_auth_pyld_tmo(cmdbuf, len, rspbuf, rsplen); - break; -#endif - default: - rc = BLE_ERR_UNKNOWN_HCI_CMD; - break; - } - - return rc; -} - -static int -ble_ll_hci_info_params_cmd_proc(const uint8_t *cmdbuf, uint8_t len, - uint16_t ocf, uint8_t *rspbuf, uint8_t *rsplen) -{ - int rc; - - /* Assume error; if all pass rc gets set to 0 */ - rc = BLE_ERR_INV_HCI_CMD_PARMS; - - switch (ocf) { - case BLE_HCI_OCF_IP_RD_LOCAL_VER: - if (len == 0) { - rc = ble_ll_hci_rd_local_version(rspbuf, rsplen); - } - break; - case BLE_HCI_OCF_IP_RD_LOC_SUPP_CMD: - if (len == 0) { - rc = ble_ll_hci_rd_local_supp_cmd(rspbuf, rsplen); - } - break; - case BLE_HCI_OCF_IP_RD_LOC_SUPP_FEAT: - if (len == 0) { - rc = ble_ll_hci_rd_local_supp_feat(rspbuf, rsplen); - } - break; - case BLE_HCI_OCF_IP_RD_BD_ADDR: - if (len == 0) { - rc = ble_ll_hci_rd_bd_addr(rspbuf, rsplen); - } - break; - default: - rc = BLE_ERR_UNKNOWN_HCI_CMD; - break; - } - - return rc; -} - -static int -ble_ll_hci_status_params_cmd_proc(const uint8_t *cmdbuf, uint8_t len, - uint16_t ocf, uint8_t *rspbuf, - uint8_t *rsplen) -{ - int rc; - - switch (ocf) { - case BLE_HCI_OCF_RD_RSSI: - rc = ble_ll_conn_hci_rd_rssi(cmdbuf, len, rspbuf, rsplen); - break; - default: - rc = BLE_ERR_UNKNOWN_HCI_CMD; - break; - } - - return rc; -} - -/** - * Called to process an HCI command from the host. - * - * @param ev Pointer to os event containing a pointer to command buffer - */ -static void -ble_ll_hci_cmd_proc(struct ble_npl_event *ev) -{ - int rc; - uint8_t ogf; - uint8_t rsplen; - struct ble_hci_cmd *cmd; - uint16_t opcode; - uint16_t ocf; - ble_ll_hci_post_cmd_complete_cb post_cb = NULL; - struct ble_hci_ev *hci_ev; - struct ble_hci_ev_command_status *cmd_status; - struct ble_hci_ev_command_complete *cmd_complete; - uint8_t *rspbuf; - - BLE_LL_DEBUG_GPIO(HCI_CMD, 1); - - /* The command buffer is the event argument */ - cmd = ble_npl_event_get_arg(ev); - BLE_LL_ASSERT(cmd != NULL); - - /* Get the opcode from the command buffer */ - opcode = le16toh(cmd->opcode); - ocf = BLE_HCI_OCF(opcode); - ogf = BLE_HCI_OGF(opcode); - - /* - * The command response pointer points into the same buffer as the - * command data itself. That is fine, as each command reads all the data - * before crafting a response. - * Also reuse cmd buffer for complete event - */ - hci_ev = (struct ble_hci_ev *) cmd; - rspbuf = hci_ev->data + sizeof(*cmd_complete); - - /* Assume response length is zero */ - rsplen = 0; - - switch (ogf) { - case BLE_HCI_OGF_LINK_CTRL: - rc = ble_ll_hci_link_ctrl_cmd_proc(cmd->data, cmd->length, ocf); - break; - case BLE_HCI_OGF_CTLR_BASEBAND: - rc = ble_ll_hci_ctlr_bb_cmd_proc(cmd->data, cmd->length, ocf, rspbuf, &rsplen); - break; - case BLE_HCI_OGF_INFO_PARAMS: - rc = ble_ll_hci_info_params_cmd_proc(cmd->data, cmd->length, ocf, rspbuf, &rsplen); - break; - case BLE_HCI_OGF_STATUS_PARAMS: - rc = ble_ll_hci_status_params_cmd_proc(cmd->data, cmd->length, ocf, rspbuf, &rsplen); - break; - case BLE_HCI_OGF_LE: - rc = ble_ll_hci_le_cmd_proc(cmd->data, cmd->length, ocf, rspbuf, &rsplen, &post_cb); - break; - default: - /* XXX: Need to support other OGF. For now, return unsupported */ - rc = BLE_ERR_UNKNOWN_HCI_CMD; - break; - } - - /* If no response is generated, we free the buffers */ - BLE_LL_ASSERT(rc >= 0); - if (rc <= BLE_ERR_MAX) { - /* Create a command complete event with status from command */ - hci_ev->opcode = BLE_HCI_EVCODE_COMMAND_COMPLETE; - hci_ev->length = sizeof(*cmd_complete) + rsplen; - - cmd_complete = (void *) hci_ev->data; - cmd_complete->num_packets = ble_ll_hci_get_num_cmd_pkts(); - cmd_complete->opcode = htole16(opcode); - cmd_complete->status = (uint8_t) rc; - } else { - /* Create a command status event */ - rc -= (BLE_ERR_MAX + 1); - - hci_ev->opcode = BLE_HCI_EVCODE_COMMAND_STATUS; - hci_ev->length = sizeof(*cmd_status); - - cmd_status = (void *) hci_ev->data; - cmd_status->status = (uint8_t)rc; - cmd_status->num_packets = ble_ll_hci_get_num_cmd_pkts(); - cmd_status->opcode = htole16(opcode); - } - - /* Count commands and those in error */ - if (rc) { - STATS_INC(ble_ll_stats, hci_cmd_errs); - } else { - STATS_INC(ble_ll_stats, hci_cmds); - } - - /* Send the event (events cannot be masked) */ - ble_ll_hci_event_send(hci_ev); - - /* Call post callback if set by command handler */ - if (post_cb) { - post_cb(); - } - - BLE_LL_DEBUG_GPIO(HCI_CMD, 0); -} - -/** - * Sends an HCI command to the controller. On success, the supplied buffer is - * relinquished to the controller task. On failure, the caller must free the - * buffer. - * - * @param cmd A flat buffer containing the HCI command to - * send. - * - * @return 0 on success; - * BLE_ERR_MEM_CAPACITY on HCI buffer exhaustion. - */ -int -ble_ll_hci_cmd_rx(uint8_t *cmd, void *arg) -{ - struct ble_npl_event *ev; - - /* Get an event structure off the queue */ - ev = &g_ble_ll_hci_cmd_ev; - if (ble_npl_event_is_queued(ev)) { - return BLE_ERR_MEM_CAPACITY; - } - - /* Fill out the event and post to Link Layer */ - ble_npl_event_set_arg(ev, cmd); - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, ev); - - return 0; -} - -/* Send ACL data from host to contoller */ -int -ble_ll_hci_acl_rx(struct os_mbuf *om, void *arg) -{ - ble_ll_acl_data_in(om); - return 0; -} - -/** - * Initalize the LL HCI. - * - * NOTE: This function is called by the HCI RESET command so if any code - * is added here it must be OK to be executed when the reset command is used. - */ -void -ble_ll_hci_init(void) -{ - BLE_LL_DEBUG_GPIO_INIT(HCI_CMD); - BLE_LL_DEBUG_GPIO_INIT(HCI_EV); - - /* Set event callback for command processing */ - ble_npl_event_init(&g_ble_ll_hci_cmd_ev, ble_ll_hci_cmd_proc, NULL); - - /* Set defaults for LE events: Vol 2 Part E 7.8.1 */ - g_ble_ll_hci_le_event_mask = 0x1f; - - /* Set defaults for controller/baseband events: Vol 2 Part E 7.3.1 */ - g_ble_ll_hci_event_mask = 0x1fffffffffff; - - - /* Set page 2 to 0 */ - g_ble_ll_hci_event_mask2 = 0; - - /* reset RF path compensation values */ - rx_path_pwr_compensation = 0; - tx_path_pwr_compensation = 0; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* after reset both legacy and extended advertising commands are allowed */ - hci_adv_mode = ADV_MODE_ANY; -#endif -} - -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_hci_ev.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_hci_ev.c deleted file mode 100644 index b78b919ef..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_hci_ev.c +++ /dev/null @@ -1,526 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/hci_common.h" -#include "nimble/nimble/include/nimble/ble_hci_trans.h" -#include "../include/controller/ble_ll.h" -#include "../include/controller/ble_ll_hci.h" -#include "../include/controller/ble_ll_ctrl.h" -#include "ble_ll_conn_priv.h" - -#if (BLETEST_CONCURRENT_CONN_TEST == 1) -extern void bletest_ltk_req_reply(uint16_t handle); -#endif - -/** - * Send a data length change event for a connection to the host. - * - * @param connsm Pointer to connection state machine - */ -void -ble_ll_hci_ev_datalen_chg(struct ble_ll_conn_sm *connsm) -{ - struct ble_hci_ev_le_subev_data_len_chg *ev; - struct ble_hci_ev *hci_ev; - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_DATA_LEN_CHG)) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_DATA_LEN_CHG; - ev->conn_handle = htole16(connsm->conn_handle); - - ev->max_tx_octets = htole16(connsm->eff_max_tx_octets); - ev->max_tx_time = htole16(connsm->eff_max_tx_time); - ev->max_rx_octets = htole16(connsm->eff_max_rx_octets); - ev->max_rx_time = htole16(connsm->eff_max_rx_time); - - ble_ll_hci_event_send(hci_ev); - } - } -} - -/** - * Send a connection parameter request event for a connection to the host. - * - * @param connsm Pointer to connection state machine - */ -void -ble_ll_hci_ev_rem_conn_parm_req(struct ble_ll_conn_sm *connsm, - struct ble_ll_conn_params *cp) -{ - struct ble_hci_ev_le_subev_rem_conn_param_req *ev; - struct ble_hci_ev *hci_ev; - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_REM_CONN_PARM_REQ)) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_REM_CONN_PARM_REQ; - ev->conn_handle = htole16(connsm->conn_handle); - ev->min_interval = htole16(cp->interval_min); - ev->max_interval = htole16(cp->interval_max); - ev->latency = htole16(cp->latency); - ev->timeout = htole16(cp->timeout); - - ble_ll_hci_event_send(hci_ev); - } - } -} - -/** - * Send a connection update event. - * - * @param connsm Pointer to connection state machine - * @param status The error code. - */ -void -ble_ll_hci_ev_conn_update(struct ble_ll_conn_sm *connsm, uint8_t status) -{ - struct ble_hci_ev_le_subev_conn_upd_complete *ev; - struct ble_hci_ev *hci_ev; - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_CONN_UPD_COMPLETE)) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_CONN_UPD_COMPLETE; - ev->status = status; - ev->conn_handle = htole16(connsm->conn_handle); - ev->conn_itvl = htole16(connsm->conn_itvl); - ev->conn_latency = htole16(connsm->slave_latency); - ev->supervision_timeout = htole16(connsm->supervision_tmo); - - ble_ll_hci_event_send(hci_ev); - } - } -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) -void -ble_ll_hci_ev_encrypt_chg(struct ble_ll_conn_sm *connsm, uint8_t status) -{ - struct ble_hci_ev_enc_key_refresh *ev_key_refresh; - struct ble_hci_ev_enrypt_chg *ev_enc_chf; - struct ble_hci_ev *hci_ev; - - if (CONN_F_ENC_CHANGE_SENT(connsm) == 0) { - if (ble_ll_hci_is_event_enabled(BLE_HCI_EVCODE_ENCRYPT_CHG)) { - hci_ev = (void *)ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_ENCRYPT_CHG; - hci_ev->length = sizeof(*ev_enc_chf); - ev_enc_chf = (void *) hci_ev->data; - - ev_enc_chf->status = status; - ev_enc_chf->connection_handle = htole16(connsm->conn_handle); - ev_enc_chf->enabled = (status == BLE_ERR_SUCCESS) ? 0x01 : 0x00; - - ble_ll_hci_event_send(hci_ev); - } - } - - CONN_F_ENC_CHANGE_SENT(connsm) = 1; - return; - } - - if (ble_ll_hci_is_event_enabled(BLE_HCI_EVCODE_ENC_KEY_REFRESH)) { - hci_ev = (void *)ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_ENC_KEY_REFRESH; - hci_ev->length = sizeof(*ev_key_refresh); - ev_key_refresh = (void *) hci_ev->data; - - ev_key_refresh->status = status; - ev_key_refresh->conn_handle = htole16(connsm->conn_handle); - - ble_ll_hci_event_send(hci_ev); - } - } -} - -/** - * Send a long term key request event for a connection to the host. - * - * @param connsm Pointer to connection state machine - */ -int -ble_ll_hci_ev_ltk_req(struct ble_ll_conn_sm *connsm) -{ - struct ble_hci_ev_le_subev_lt_key_req *ev; - struct ble_hci_ev *hci_ev; - int rc; - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_LT_KEY_REQ)) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_LT_KEY_REQ; - ev->conn_handle = htole16(connsm->conn_handle); - ev->rand = htole64(connsm->enc_data.host_rand_num); - ev->div = htole16(connsm->enc_data.enc_div); - - ble_ll_hci_event_send(hci_ev); - } - rc = 0; - } else { - rc = -1; - } - -#if (BLETEST_CONCURRENT_CONN_TEST == 1) - if (rc == 0) { - bletest_ltk_req_reply(connsm->conn_handle); - } -#endif - return rc; -} -#endif - -void -ble_ll_hci_ev_rd_rem_used_feat(struct ble_ll_conn_sm *connsm, uint8_t status) -{ - struct ble_hci_ev_le_subev_rd_rem_used_feat *ev; - struct ble_hci_ev *hci_ev; - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_RD_REM_USED_FEAT)) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_RD_REM_USED_FEAT; - ev->status = status; - ev->conn_handle = htole16(connsm->conn_handle); - ev->features[0] = connsm->conn_features; - memcpy(ev->features + 1, connsm->remote_features, 7); - - ble_ll_hci_event_send(hci_ev); - } - } -} - -void -ble_ll_hci_ev_rd_rem_ver(struct ble_ll_conn_sm *connsm, uint8_t status) -{ - struct ble_hci_ev_rd_rem_ver_info_cmp *ev; - struct ble_hci_ev *hci_ev; - - if (ble_ll_hci_is_event_enabled(BLE_HCI_EVCODE_RD_REM_VER_INFO_CMP)) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_RD_REM_VER_INFO_CMP; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->status = status; - ev->conn_handle = htole16(connsm->conn_handle); - ev->version = connsm->vers_nr; - ev->manufacturer = htole16(connsm->comp_id); - ev->subversion = htole16(connsm->sub_vers_nr); - - ble_ll_hci_event_send(hci_ev); - } - } -} - -/** - * Send a HW error to the host. - * - * @param hw_err - * - * @return int 0: event masked or event sent, -1 otherwise - */ -int -ble_ll_hci_ev_hw_err(uint8_t hw_err) -{ - struct ble_hci_ev_hw_error *ev; - struct ble_hci_ev *hci_ev; - int rc; - - rc = 0; - if (ble_ll_hci_is_event_enabled(BLE_HCI_EVCODE_HW_ERROR)) { - hci_ev = (void *)ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_HW_ERROR; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->hw_code = hw_err; - - ble_ll_hci_event_send(hci_ev); - } else { - rc = -1; - } - } - return rc; -} - -void -ble_ll_hci_ev_databuf_overflow(void) -{ - struct ble_hci_ev_data_buf_overflow *ev; - struct ble_hci_ev *hci_ev; - - if (ble_ll_hci_is_event_enabled(BLE_HCI_EVCODE_DATA_BUF_OVERFLOW)) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_DATA_BUF_OVERFLOW; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->link_type = BLE_HCI_EVENT_ACL_BUF_OVERFLOW; - - ble_ll_hci_event_send(hci_ev); - } - } -} - -/** - * Send a LE Channel Selection Algorithm event. - * - * @param connsm Pointer to connection state machine - */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) -void -ble_ll_hci_ev_le_csa(struct ble_ll_conn_sm *connsm) -{ - struct ble_hci_ev_le_subev_chan_sel_alg *ev; - struct ble_hci_ev *hci_ev; - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_CHAN_SEL_ALG)) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_CHAN_SEL_ALG; - ev->conn_handle = htole16(connsm->conn_handle); - ev->csa = connsm->csmflags.cfbit.csa2_supp ? 0x01 : 0x00; - - ble_ll_hci_event_send(hci_ev); - } - } -} -#endif - -/** - * Sends the LE Scan Request Received event - * - */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -void -ble_ll_hci_ev_send_scan_req_recv(uint8_t adv_handle, const uint8_t *peer, - uint8_t peer_addr_type) -{ - struct ble_hci_ev_le_subev_scan_req_rcvd *ev; - struct ble_hci_ev *hci_ev; - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_SCAN_REQ_RCVD)) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_SCAN_REQ_RCVD; - ev->adv_handle = adv_handle; - ev->peer_addr_type = peer_addr_type; - memcpy(ev->peer_addr, peer, BLE_DEV_ADDR_LEN); - - ble_ll_hci_event_send(hci_ev); - } - } -} -#endif - -/** - * Sends the LE Scan Timeout Event - * - */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -void -ble_ll_hci_ev_send_scan_timeout(void) -{ - struct ble_hci_ev_le_subev_scan_timeout *ev; - struct ble_hci_ev *hci_ev; - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_SCAN_TIMEOUT)) { - hci_ev = (void *)ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_SCAN_TIMEOUT; - - ble_ll_hci_event_send(hci_ev); - } - } -} -#endif - -/** - * Sends the LE Advertising Set Terminated event - * - */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -void -ble_ll_hci_ev_send_adv_set_terminated(uint8_t status, uint8_t adv_handle, - uint16_t conn_handle, uint8_t events) -{ - struct ble_hci_ev_le_subev_adv_set_terminated *ev; - struct ble_hci_ev *hci_ev; - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_ADV_SET_TERMINATED)) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_ADV_SET_TERMINATED; - ev->status = status; - ev->adv_handle = adv_handle; - ev->conn_handle = htole16(conn_handle); - ev->num_events = events; - - ble_ll_hci_event_send(hci_ev); - } - } -} -#endif - -/** - * Send a PHY update complete event - * - * @param connsm Pointer to connection state machine - * @param status error status of event - */ -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) -int -ble_ll_hci_ev_phy_update(struct ble_ll_conn_sm *connsm, uint8_t status) -{ - struct ble_hci_ev_le_subev_phy_update_complete *ev; - struct ble_hci_ev *hci_ev; - int rc; - - rc = 0; - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_PHY_UPDATE_COMPLETE)) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_PHY_UPDATE_COMPLETE; - ev->status = status; - ev->conn_handle = htole16(connsm->conn_handle); - ev->tx_phy = connsm->phy_data.cur_tx_phy; - ev->rx_phy = connsm->phy_data.cur_rx_phy; - - ble_ll_hci_event_send(hci_ev); - } else { - rc = BLE_ERR_MEM_CAPACITY; - } - } - return rc; -} -#endif - -void -ble_ll_hci_ev_send_vendor_err(const char *file, uint32_t line) -{ - struct ble_hci_ev_vendor_debug *ev; - struct ble_hci_ev *hci_ev; - unsigned int str_len; - bool skip = true; - uint8_t digit; - int max_len; - int i; - - /* 6 is for line number ":00000" , we assume files have no more than 64k of - * lines - */ - max_len = BLE_HCI_MAX_DATA_LEN - sizeof(*ev) - 6; - - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_VENDOR_DEBUG; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - /* Debug id for future use */ - ev->id = 0x00; - - /* snprintf would be nicer but this is heavy on flash - * len = snprintf((char *) ev->data, max_len, "%s:%u", file, line); - * if (len < 0) { - * len = 0; - * } else if (len > max_len) { - * len = max_len; - * } - * - * hci_ev->length += len; - */ - str_len = strlen(file); - if (str_len > max_len) { - str_len = max_len; - } - - memcpy(ev->data, file, str_len); - ev->data[str_len++] = ':'; - - for (i = 100000; i >= 10; i /= 10) { - digit = (line % i) / (i/10); - - if (!digit && skip) { - continue; - } - - skip = false; - ev->data[str_len++] = '0' + digit; - } - - hci_ev->length += str_len; - - ble_ll_hci_event_send(hci_ev); - } -} - -#endif \ No newline at end of file diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_priv.h deleted file mode 100644 index 900950ef6..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_priv.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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_PRIV_ -#define H_BLE_LL_PRIV_ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef MYNEWT - -#include "syscfg/syscfg.h" -#include "hal/hal_gpio.h" - -#define BLE_LL_DEBUG_GPIO_INIT(_name) \ - if (MYNEWT_VAL(BLE_LL_DEBUG_GPIO_ ## _name) >= 0) { \ - hal_gpio_init_out(MYNEWT_VAL(BLE_LL_DEBUG_GPIO_ ## _name), 0); \ - } - -#define BLE_LL_DEBUG_GPIO(_name, _val) \ - if (MYNEWT_VAL(BLE_LL_DEBUG_GPIO_ ## _name) >= 0) { \ - hal_gpio_write(MYNEWT_VAL(BLE_LL_DEBUG_GPIO_ ## _name), !!(_val)); \ - } - -#else -#define BLE_LL_DEBUG_GPIO_INIT(_name) (void)(0) -#define BLE_LL_DEBUG_GPIO(_name, _val) (void)(0) -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* H_BLE_LL_PRIV_ */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_rand.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_rand.c deleted file mode 100644 index dd89e04b0..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_rand.c +++ /dev/null @@ -1,188 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "../include/controller/ble_hw.h" -#include "../include/controller/ble_ll.h" -#if MYNEWT_VAL(TRNG) -#include "trng/trng.h" -#endif - -#if MYNEWT_VAL(TRNG) -static struct trng_dev *g_trng; -#else -/* This is a simple circular buffer for holding N samples of random data */ -struct ble_ll_rnum_data -{ - uint8_t *rnd_in; - uint8_t *rnd_out; - volatile uint8_t rnd_size; -}; - -struct ble_ll_rnum_data g_ble_ll_rnum_data; -uint8_t g_ble_ll_rnum_buf[MYNEWT_VAL(BLE_LL_RNG_BUFSIZE)]; - -#define IS_RNUM_BUF_END(x) \ - (x == &g_ble_ll_rnum_buf[MYNEWT_VAL(BLE_LL_RNG_BUFSIZE) - 1]) - -void -ble_ll_rand_sample(uint8_t rnum) -{ - os_sr_t sr; - - OS_ENTER_CRITICAL(sr); - if (g_ble_ll_rnum_data.rnd_size < MYNEWT_VAL(BLE_LL_RNG_BUFSIZE)) { - ++g_ble_ll_rnum_data.rnd_size; - g_ble_ll_rnum_data.rnd_in[0] = rnum; - if (IS_RNUM_BUF_END(g_ble_ll_rnum_data.rnd_in)) { - g_ble_ll_rnum_data.rnd_in = g_ble_ll_rnum_buf; - } else { - ++g_ble_ll_rnum_data.rnd_in; - } - } else { - /* Stop generating random numbers as we are full */ - ble_hw_rng_stop(); - } - OS_EXIT_CRITICAL(sr); -} -#endif - -/* Get 'len' bytes of random data */ -int -ble_ll_rand_data_get(uint8_t *buf, uint8_t len) -{ -#if MYNEWT_VAL(TRNG) - size_t num; - - while (len) { - num = trng_read(g_trng, buf, len); - buf += num; - len -= num; - } -#else - uint8_t rnums; - os_sr_t sr; - - while (len != 0) { - OS_ENTER_CRITICAL(sr); - rnums = g_ble_ll_rnum_data.rnd_size; - if (rnums > len) { - rnums = len; - } - len -= rnums; - g_ble_ll_rnum_data.rnd_size -= rnums; - while (rnums) { - buf[0] = g_ble_ll_rnum_data.rnd_out[0]; - if (IS_RNUM_BUF_END(g_ble_ll_rnum_data.rnd_out)) { - g_ble_ll_rnum_data.rnd_out = g_ble_ll_rnum_buf; - } else { - ++g_ble_ll_rnum_data.rnd_out; - } - ++buf; - --rnums; - } - OS_EXIT_CRITICAL(sr); - - /* Make sure rng is started! */ - ble_hw_rng_start(); - - /* Wait till bytes are in buffer. */ - if (len) { - while ((g_ble_ll_rnum_data.rnd_size < len) && - (g_ble_ll_rnum_data.rnd_size < MYNEWT_VAL(BLE_LL_RNG_BUFSIZE))) { - /* Spin here */ - } - } - } -#endif - return BLE_ERR_SUCCESS; -} - -/** - * Called to obtain a "prand" as defined in core V4.2 Vol 6 Part B 1.3.2.2 - * - * @param prand - */ -void -ble_ll_rand_prand_get(uint8_t *prand) -{ - uint16_t sum; - - while (1) { - /* Get 24 bits of random data */ - ble_ll_rand_data_get(prand, 3); - - /* Prand cannot be all zeros or 1's. */ - sum = prand[0] + prand[1] + prand[2]; - if ((sum != 0) && (sum != (3 * 0xff))) { - break; - } - } - - /* Upper two bits must be 01 */ - prand[2] &= ~0xc0; - prand[2] |= 0x40; -} - -/** - * Start the generation of random numbers - * - * @return int - */ -int -ble_ll_rand_start(void) -{ -#if MYNEWT_VAL(TRNG) - /* Nothing to do - this is handled by driver */ -#else - /* Start the generation of numbers if we are not full */ - if (g_ble_ll_rnum_data.rnd_size < MYNEWT_VAL(BLE_LL_RNG_BUFSIZE)) { - ble_hw_rng_start(); - } -#endif - return 0; -} - -/** - * Initialize LL random number generation. Should be called only once on - * initialization. - * - * @return int - */ -int -ble_ll_rand_init(void) -{ -#if MYNEWT_VAL(TRNG) - g_trng = (struct trng_dev *) os_dev_open("trng", OS_TIMEOUT_NEVER, NULL); -#else - g_ble_ll_rnum_data.rnd_in = g_ble_ll_rnum_buf; - g_ble_ll_rnum_data.rnd_out = g_ble_ll_rnum_buf; - ble_hw_rng_init(ble_ll_rand_sample, 1); -#endif - return 0; -} - -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_resolv.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_resolv.c deleted file mode 100644 index 231ecad23..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_resolv.c +++ /dev/null @@ -1,755 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "../include/controller/ble_ll.h" -#include "../include/controller/ble_ll_resolv.h" -#include "../include/controller/ble_ll_hci.h" -#include "../include/controller/ble_ll_scan.h" -#include "../include/controller/ble_ll_adv.h" -#include "../include/controller/ble_ll_sync.h" -#include "../include/controller/ble_hw.h" -#include "ble_ll_conn_priv.h" - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) -struct ble_ll_resolv_data -{ - uint8_t addr_res_enabled; - uint8_t rl_size; - uint8_t rl_cnt_hw; - uint8_t rl_cnt; - ble_npl_time_t rpa_tmo; - struct ble_npl_callout rpa_timer; -}; -struct ble_ll_resolv_data g_ble_ll_resolv_data; - -__attribute__((aligned(4))) -struct ble_ll_resolv_entry g_ble_ll_resolv_list[MYNEWT_VAL(BLE_LL_RESOLV_LIST_SIZE)]; - -static int -ble_ll_is_controller_busy(void) -{ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - if (ble_ll_sync_enabled()) { - return 1; - } -#endif - - return ble_ll_adv_enabled() || ble_ll_scan_enabled() || - g_ble_ll_conn_create_sm; -} -/** - * Called to determine if a change is allowed to the resolving list at this - * time. We are not allowed to modify the resolving list if address translation - * is enabled and we are either scanning, advertising, or attempting to create - * a connection. - * - * @return int 0: not allowed. 1: allowed. - */ -static int -ble_ll_resolv_list_chg_allowed(void) -{ - int rc; - - if (g_ble_ll_resolv_data.addr_res_enabled && - ble_ll_is_controller_busy()) { - rc = 0; - } else { - rc = 1; - } - return rc; -} - - -/** - * Called to generate a resolvable private address in rl structure - * - * @param rl - * @param local - */ -static void -ble_ll_resolv_gen_priv_addr(struct ble_ll_resolv_entry *rl, int local) -{ - uint8_t *irk; - uint8_t *prand; - struct ble_encryption_block ecb; - uint8_t *addr; - - BLE_LL_ASSERT(rl != NULL); - - if (local) { - addr = rl->rl_local_rpa; - irk = rl->rl_local_irk; - } else { - addr = rl->rl_peer_rpa; - irk = rl->rl_peer_irk; - } - - /* Get prand */ - prand = addr + 3; - ble_ll_rand_prand_get(prand); - - /* Calculate hash, hash = ah(local IRK, prand) */ - memcpy(ecb.key, irk, 16); - memset(ecb.plain_text, 0, 13); - ecb.plain_text[13] = prand[2]; - ecb.plain_text[14] = prand[1]; - ecb.plain_text[15] = prand[0]; - - /* Calculate hash */ - ble_hw_encrypt_block(&ecb); - - addr[0] = ecb.cipher_text[15]; - addr[1] = ecb.cipher_text[14]; - addr[2] = ecb.cipher_text[13]; -} - -/** - * Called when the Resolvable private address timer expires. This timer - * is used to regenerate local and peers RPA's in the resolving list. - */ -static void -ble_ll_resolv_rpa_timer_cb(struct ble_npl_event *ev) -{ - int i; - os_sr_t sr; - struct ble_ll_resolv_entry *rl; - - rl = &g_ble_ll_resolv_list[0]; - for (i = 0; i < g_ble_ll_resolv_data.rl_cnt; ++i) { - if (rl->rl_has_local) { - OS_ENTER_CRITICAL(sr); - ble_ll_resolv_gen_priv_addr(rl, 1); - OS_EXIT_CRITICAL(sr); - } - - if (rl->rl_has_peer) { - OS_ENTER_CRITICAL(sr); - ble_ll_resolv_gen_priv_addr(rl, 0); - OS_EXIT_CRITICAL(sr); - } - ++rl; - } - - ble_npl_callout_reset(&g_ble_ll_resolv_data.rpa_timer, - g_ble_ll_resolv_data.rpa_tmo); - - ble_ll_adv_rpa_timeout(); -} - -/** - * Called to determine if the IRK is all zero. - * - * @param irk - * - * @return int 0: IRK is zero . 1: IRK has non-zero value. - */ -static int -ble_ll_resolv_irk_nonzero(const uint8_t *irk) -{ - int i; - int rc; - - rc = 0; - for (i = 0; i < 16; ++i) { - if (*irk != 0) { - rc = 1; - break; - } - ++irk; - } - - return rc; -} - -/** - * Clear the resolving list - * - * @return int 0: success, BLE error code otherwise - */ -int -ble_ll_resolv_list_clr(void) -{ - /* Check proper state */ - if (!ble_ll_resolv_list_chg_allowed()) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* Sets total on list to 0. Clears HW resolve list */ - g_ble_ll_resolv_data.rl_cnt_hw = 0; - g_ble_ll_resolv_data.rl_cnt = 0; - ble_hw_resolv_list_clear(); - - /* stop RPA timer when clearing RL */ - ble_npl_callout_stop(&g_ble_ll_resolv_data.rpa_timer); - - return BLE_ERR_SUCCESS; -} - -/** - * Read the size of the resolving list. This is the total number of resolving - * list entries allowed by the controller. - * - * @param rspbuf Pointer to response buffer - * - * @return int 0: success. - */ -int -ble_ll_resolv_list_read_size(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_le_rd_resolv_list_size_rp *rsp = (void *) rspbuf; - - rsp->size = g_ble_ll_resolv_data.rl_size; - - *rsplen = sizeof(*rsp); - return BLE_ERR_SUCCESS; -} - -/** - * Used to determine if the device is on the resolving list. - * - * @param addr - * @param addr_type Public address (0) or random address (1) - * - * @return int 0: device is not on resolving list; otherwise the return value - * is the 'position' of the device in the resolving list (the index of the - * element plus 1). - */ -static int -ble_ll_is_on_resolv_list(const uint8_t *addr, uint8_t addr_type) -{ - int i; - struct ble_ll_resolv_entry *rl; - - rl = &g_ble_ll_resolv_list[0]; - for (i = 0; i < g_ble_ll_resolv_data.rl_cnt; ++i) { - if ((rl->rl_addr_type == addr_type) && - (!memcmp(&rl->rl_identity_addr[0], addr, BLE_DEV_ADDR_LEN))) { - return i + 1; - } - ++rl; - } - - return 0; -} - -/** - * Used to determine if the device is on the resolving list. - * - * @param addr - * @param addr_type Public address (0) or random address (1) - * - * @return Pointer to resolving list entry or NULL if no entry found. - */ -struct ble_ll_resolv_entry * -ble_ll_resolv_list_find(const uint8_t *addr, uint8_t addr_type) -{ - int i; - struct ble_ll_resolv_entry *rl; - - rl = &g_ble_ll_resolv_list[0]; - for (i = 0; i < g_ble_ll_resolv_data.rl_cnt; ++i) { - if ((rl->rl_addr_type == addr_type) && - (!memcmp(&rl->rl_identity_addr[0], addr, BLE_DEV_ADDR_LEN))) { - return rl; - } - ++rl; - } - - return NULL; -} - -/** - * Add a device to the resolving list - * - * @return int - */ -int -ble_ll_resolv_list_add(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_add_resolv_list_cp *cmd = (const void *) cmdbuf; - struct ble_ll_resolv_entry *rl; - int rc = BLE_ERR_SUCCESS; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Must be in proper state */ - if (!ble_ll_resolv_list_chg_allowed()) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* Check if we have any open entries */ - if (g_ble_ll_resolv_data.rl_cnt >= g_ble_ll_resolv_data.rl_size) { - return BLE_ERR_MEM_CAPACITY; - } - - /* spec is not clear on how to handle this but make sure host is aware - * that new keys are not used in that case - */ - if (ble_ll_is_on_resolv_list(cmd->peer_id_addr, cmd->peer_addr_type)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* we keep this sorted in a way that entries with peer_irk are first */ - if (ble_ll_resolv_irk_nonzero(cmd->peer_irk)) { - memmove(&g_ble_ll_resolv_list[g_ble_ll_resolv_data.rl_cnt_hw + 1], - &g_ble_ll_resolv_list[g_ble_ll_resolv_data.rl_cnt_hw], - (g_ble_ll_resolv_data.rl_cnt - g_ble_ll_resolv_data.rl_cnt_hw) * - sizeof(g_ble_ll_resolv_list[0])); - rl = &g_ble_ll_resolv_list[g_ble_ll_resolv_data.rl_cnt_hw]; - } else { - rl = &g_ble_ll_resolv_list[g_ble_ll_resolv_data.rl_cnt]; - } - - memset (rl, 0, sizeof(*rl)); - rl->rl_addr_type = cmd->peer_addr_type; - memcpy(rl->rl_identity_addr, cmd->peer_id_addr, BLE_DEV_ADDR_LEN); - - if (ble_ll_resolv_irk_nonzero(cmd->peer_irk)) { - swap_buf(rl->rl_peer_irk, cmd->peer_irk, 16); - rl->rl_has_peer = 1; - - /* generate peer RPA now, those will be updated by timer when - * resolution is enabled - */ - ble_ll_resolv_gen_priv_addr(rl, 0); - } - - if (ble_ll_resolv_irk_nonzero(cmd->local_irk)) { - swap_buf(rl->rl_local_irk, cmd->local_irk, 16); - rl->rl_has_local = 1; - - /* generate local RPA now, those will be updated by timer when - * resolution is enabled - */ - ble_ll_resolv_gen_priv_addr(rl, 1); - } - - /* By default use privacy network mode */ - rl->rl_priv_mode = BLE_HCI_PRIVACY_NETWORK; - - /* Add peers IRKs to HW resolving list. Should always succeed since we - * already checked if there is room for it. - */ - if (rl->rl_has_peer) { - rc = ble_hw_resolv_list_add(rl->rl_peer_irk); - BLE_LL_ASSERT(rc == BLE_ERR_SUCCESS); - g_ble_ll_resolv_data.rl_cnt_hw++; - } - - g_ble_ll_resolv_data.rl_cnt++; - - /* start RPA timer if this was first element added to RL */ - if (g_ble_ll_resolv_data.rl_cnt == 1) { - ble_npl_callout_reset(&g_ble_ll_resolv_data.rpa_timer, - g_ble_ll_resolv_data.rpa_tmo); - } - - return rc; -} - -/** - * Remove a device from the resolving list - * - * @param cmdbuf - * - * @return int 0: success, BLE error code otherwise - */ -int -ble_ll_resolv_list_rmv(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_rmv_resolve_list_cp *cmd = (const void *) cmdbuf; - int position; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Must be in proper state */ - if (!ble_ll_resolv_list_chg_allowed()) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* Remove from IRK records */ - position = ble_ll_is_on_resolv_list(cmd->peer_id_addr, cmd->peer_addr_type); - if (position) { - BLE_LL_ASSERT(position <= g_ble_ll_resolv_data.rl_cnt); - - memmove(&g_ble_ll_resolv_list[position - 1], - &g_ble_ll_resolv_list[position], - (g_ble_ll_resolv_data.rl_cnt - position) * - sizeof(g_ble_ll_resolv_list[0])); - g_ble_ll_resolv_data.rl_cnt--; - - /* Remove from HW list */ - if (position <= g_ble_ll_resolv_data.rl_cnt_hw) { - ble_hw_resolv_list_rmv(position - 1); - g_ble_ll_resolv_data.rl_cnt_hw--; - } - - /* stop RPA timer if list is empty */ - if (g_ble_ll_resolv_data.rl_cnt == 0) { - ble_npl_callout_stop(&g_ble_ll_resolv_data.rpa_timer); - } - - return BLE_ERR_SUCCESS; - } - - return BLE_ERR_UNK_CONN_ID; -} - -/** - * Called to enable or disable address resolution in the controller - * - * @param cmdbuf - * - * @return int - */ -int -ble_ll_resolv_enable_cmd(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_addr_res_en_cp *cmd = (const void *) cmdbuf; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (ble_ll_is_controller_busy()) { - return BLE_ERR_CMD_DISALLOWED; - - } - - if (cmd->enable > 1) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - g_ble_ll_resolv_data.addr_res_enabled = cmd->enable; - - return BLE_ERR_SUCCESS; -} - -int -ble_ll_resolv_peer_addr_rd(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen) -{ - const struct ble_hci_le_rd_peer_recolv_addr_cp *cmd = (const void *) cmdbuf; - struct ble_hci_le_rd_peer_recolv_addr_rp *rsp = (void *) rspbuf; - struct ble_ll_resolv_entry *rl; - int rc; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - rl = ble_ll_resolv_list_find(cmd->peer_id_addr, cmd->peer_addr_type); - if (rl) { - memcpy(rsp->rpa, rl->rl_peer_rpa, BLE_DEV_ADDR_LEN); - rc = BLE_ERR_SUCCESS; - } else { - memset(rsp->rpa, 0, BLE_DEV_ADDR_LEN); - rc = BLE_ERR_UNK_CONN_ID; - } - - *rsplen = sizeof(*rsp); - return rc; -} - -int -ble_ll_resolv_local_addr_rd(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen) -{ - const struct ble_hci_le_rd_local_recolv_addr_cp *cmd = (const void *) cmdbuf; - struct ble_hci_le_rd_local_recolv_addr_rp *rsp = (void *) rspbuf; - struct ble_ll_resolv_entry *rl; - int rc; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - rl = ble_ll_resolv_list_find(cmd->peer_id_addr, cmd->peer_addr_type); - if (rl) { - memcpy(rsp->rpa, rl->rl_local_rpa, BLE_DEV_ADDR_LEN); - rc = BLE_ERR_SUCCESS; - } else { - memset(rsp->rpa, 0, BLE_DEV_ADDR_LEN); - rc = BLE_ERR_UNK_CONN_ID; - } - - *rsplen = sizeof(*rsp); - return rc; -} - -/** - * Set the resolvable private address timeout. - * - * @param cmdbuf - * - * @return int - */ -int -ble_ll_resolv_set_rpa_tmo(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_rpa_tmo_cp *cmd = (const void *)cmdbuf; - uint16_t tmo_secs; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - tmo_secs = le16toh(cmd->rpa_timeout); - if (!((tmo_secs > 0) && (tmo_secs <= 0xA1B8))) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - g_ble_ll_resolv_data.rpa_tmo = ble_npl_time_ms_to_ticks32(tmo_secs * 1000); - - /* restart timer if there is something on RL */ - if (g_ble_ll_resolv_data.rl_cnt) { - ble_npl_callout_reset(&g_ble_ll_resolv_data.rpa_timer, - g_ble_ll_resolv_data.rpa_tmo); - } - - return BLE_ERR_SUCCESS; -} - -int -ble_ll_resolve_set_priv_mode(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_privacy_mode_cp *cmd = (const void *) cmdbuf; - struct ble_ll_resolv_entry *rl; - - if (ble_ll_is_controller_busy()) { - return BLE_ERR_CMD_DISALLOWED; - } - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - rl = ble_ll_resolv_list_find(cmd->peer_id_addr, cmd->peer_id_addr_type); - if (!rl) { - return BLE_ERR_UNK_CONN_ID; - } - - if (cmd->mode > BLE_HCI_PRIVACY_DEVICE) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - rl->rl_priv_mode = cmd->mode; - - return BLE_ERR_SUCCESS; -} - -/** - * Returns the Resolvable Private address timeout, in os ticks - * - * - * @return uint32_t - */ -uint32_t -ble_ll_resolv_get_rpa_tmo(void) -{ - return g_ble_ll_resolv_data.rpa_tmo; -} - -void -ble_ll_resolv_get_priv_addr(struct ble_ll_resolv_entry *rl, int local, - uint8_t *addr) -{ - os_sr_t sr; - - BLE_LL_ASSERT(rl != NULL); - BLE_LL_ASSERT(addr != NULL); - - OS_ENTER_CRITICAL(sr); - if (local) { - BLE_LL_ASSERT(rl->rl_has_local); - memcpy(addr, rl->rl_local_rpa, BLE_DEV_ADDR_LEN); - } else { - BLE_LL_ASSERT(rl->rl_has_peer); - memcpy(addr, rl->rl_peer_rpa, BLE_DEV_ADDR_LEN); - } - - OS_EXIT_CRITICAL(sr); -} - -void -ble_ll_resolv_set_peer_rpa(int index, uint8_t *rpa) -{ - os_sr_t sr; - struct ble_ll_resolv_entry *rl; - - OS_ENTER_CRITICAL(sr); - rl = &g_ble_ll_resolv_list[index]; - memcpy(rl->rl_peer_rpa, rpa, BLE_DEV_ADDR_LEN); - OS_EXIT_CRITICAL(sr); -} - -void -ble_ll_resolv_set_local_rpa(int index, uint8_t *rpa) -{ - os_sr_t sr; - struct ble_ll_resolv_entry *rl; - - OS_ENTER_CRITICAL(sr); - rl = &g_ble_ll_resolv_list[index]; - memcpy(rl->rl_local_rpa, rpa, BLE_DEV_ADDR_LEN); - OS_EXIT_CRITICAL(sr); -} - -/** - * Generate a resolvable private address. - * - * @param addr - * @param addr_type - * @param rpa - * - * @return int - */ -int -ble_ll_resolv_gen_rpa(uint8_t *addr, uint8_t addr_type, uint8_t *rpa, int local) -{ - struct ble_ll_resolv_entry *rl; - - rl = ble_ll_resolv_list_find(addr, addr_type); - if (rl) { - if ((local && rl->rl_has_local) || (!local && rl->rl_has_peer)) { - ble_ll_resolv_get_priv_addr(rl, local, rpa); - return 1; - } - } - - return 0; -} - -/** - * Resolve a Resolvable Private Address - * - * @param rpa - * @param index - * - * @return int - */ -int -ble_ll_resolv_rpa(const uint8_t *rpa, const uint8_t *irk) -{ - int rc; - const uint32_t *irk32; - uint32_t *key32; - uint32_t *pt32; - struct ble_encryption_block ecb; - - irk32 = (const uint32_t *)irk; - key32 = (uint32_t *)&ecb.key[0]; - - key32[0] = irk32[0]; - key32[1] = irk32[1]; - key32[2] = irk32[2]; - key32[3] = irk32[3]; - - pt32 = (uint32_t *)&ecb.plain_text[0]; - pt32[0] = 0; - pt32[1] = 0; - pt32[2] = 0; - pt32[3] = 0; - - ecb.plain_text[15] = rpa[3]; - ecb.plain_text[14] = rpa[4]; - ecb.plain_text[13] = rpa[5]; - - ble_hw_encrypt_block(&ecb); - if ((ecb.cipher_text[15] == rpa[0]) && (ecb.cipher_text[14] == rpa[1]) && - (ecb.cipher_text[13] == rpa[2])) { - rc = 1; - } else { - rc = 0; - } - - return rc; -} - -int -ble_ll_resolv_peer_rpa_any(const uint8_t *rpa) -{ - int i; - - for (i = 0; i < g_ble_ll_resolv_data.rl_cnt_hw; i++) { - if (ble_ll_resolv_rpa(rpa, g_ble_ll_resolv_list[i].rl_peer_irk)) { - return i; - } - } - - return -1; -} - -/** - * Returns whether or not address resolution is enabled. - * - * @return uint8_t - */ -uint8_t -ble_ll_resolv_enabled(void) -{ - return g_ble_ll_resolv_data.addr_res_enabled; -} - -/** - * Called to reset private address resolution module. - */ -void -ble_ll_resolv_list_reset(void) -{ - g_ble_ll_resolv_data.addr_res_enabled = 0; - ble_npl_callout_stop(&g_ble_ll_resolv_data.rpa_timer); - ble_ll_resolv_list_clr(); - ble_ll_resolv_init(); -} - -void -ble_ll_resolv_init(void) -{ - uint8_t hw_size; - - /* Default is 15 minutes */ - g_ble_ll_resolv_data.rpa_tmo = ble_npl_time_ms_to_ticks32(15 * 60 * 1000); - - hw_size = ble_hw_resolv_list_size(); - if (hw_size > MYNEWT_VAL(BLE_LL_RESOLV_LIST_SIZE)) { - hw_size = MYNEWT_VAL(BLE_LL_RESOLV_LIST_SIZE); - } - g_ble_ll_resolv_data.rl_size = hw_size; - - ble_npl_callout_init(&g_ble_ll_resolv_data.rpa_timer, - &g_ble_ll_data.ll_evq, - ble_ll_resolv_rpa_timer_cb, - NULL); -} - -#endif /* if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) */ -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_rfmgmt.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_rfmgmt.c deleted file mode 100644 index 444019cc0..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_rfmgmt.c +++ /dev/null @@ -1,348 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os_cputime.h" -#include "../include/controller/ble_phy.h" -#include "../include/controller/ble_ll.h" -#include "../include/controller/ble_ll_sched.h" -#include "../include/controller/ble_ll_rfmgmt.h" - -#if MYNEWT_VAL(BLE_LL_RFMGMT_ENABLE_TIME) > 0 - -enum ble_ll_rfmgmt_state { - RFMGMT_STATE_OFF = 0, - RFMGMT_STATE_ENABLING = 1, - RFMGMT_STATE_ENABLED = 2, -}; - -struct ble_ll_rfmgmt_data { - enum ble_ll_rfmgmt_state state; - uint16_t ticks_to_enabled; - - struct hal_timer timer; - bool timer_scheduled; - uint32_t timer_scheduled_at; - - bool enable_scan; - bool enable_sched; - uint32_t enable_scan_at; - uint32_t enable_sched_at; - - uint32_t enabled_at; - - struct ble_npl_event release_ev; -}; - -static struct ble_ll_rfmgmt_data g_ble_ll_rfmgmt_data; - -static void -ble_ll_rfmgmt_enable(void) -{ - OS_ASSERT_CRITICAL(); - - if (g_ble_ll_rfmgmt_data.state == RFMGMT_STATE_OFF) { - g_ble_ll_rfmgmt_data.state = RFMGMT_STATE_ENABLING; - g_ble_ll_rfmgmt_data.enabled_at = os_cputime_get32(); - ble_phy_rfclk_enable(); - } -} - -static void -ble_ll_rfmgmt_disable(void) -{ - OS_ASSERT_CRITICAL(); - - if (g_ble_ll_rfmgmt_data.state != RFMGMT_STATE_OFF) { - ble_phy_rfclk_disable(); - g_ble_ll_rfmgmt_data.state = RFMGMT_STATE_OFF; - } -} - -static void -ble_ll_rfmgmt_timer_reschedule(void) -{ - struct ble_ll_rfmgmt_data *rfmgmt = &g_ble_ll_rfmgmt_data; - uint32_t enable_at; - - /* Figure out when we need to enable RF */ - if (rfmgmt->enable_scan && rfmgmt->enable_sched) { - if (CPUTIME_LT(rfmgmt->enable_scan_at, rfmgmt->enable_sched_at)) { - enable_at = rfmgmt->enable_scan_at; - } else { - enable_at = rfmgmt->enable_sched_at; - } - } else if (rfmgmt->enable_scan) { - enable_at = rfmgmt->enable_scan_at; - } else if (rfmgmt->enable_sched) { - enable_at = rfmgmt->enable_sched_at; - } else { - rfmgmt->timer_scheduled = false; - os_cputime_timer_stop(&rfmgmt->timer); - return; - } - - if (rfmgmt->timer_scheduled) { - /* - * If there is timer already scheduled at the same time we do not need - * to do anything. Otherwise we need to stop timer and schedule it again - * regardless if it's earlier or later to make sure it fires at the time - * something expects it. - */ - - if (rfmgmt->timer_scheduled_at == enable_at) { - return; - } - - rfmgmt->timer_scheduled = false; - os_cputime_timer_stop(&rfmgmt->timer); - } - - /* - * In case timer was requested to be enabled before current time, just make - * sure it's enabled and assume caller can deal with this. This will happen - * if something is scheduled "now" since "enable_at" is in the past, but in - * such case it's absolutely harmless since we already have clock enabled - * and this will do nothing. - */ - if (CPUTIME_LEQ(enable_at, os_cputime_get32())) { - ble_ll_rfmgmt_enable(); - return; - } - - rfmgmt->timer_scheduled = true; - rfmgmt->timer_scheduled_at = enable_at; - os_cputime_timer_start(&rfmgmt->timer, enable_at); -} - -static void -ble_ll_rfmgmt_timer_exp(void *arg) -{ - g_ble_ll_rfmgmt_data.timer_scheduled = false; - ble_ll_rfmgmt_enable(); -} - -static void -ble_ll_rfmgmt_release_ev(struct ble_npl_event *ev) -{ - struct ble_ll_rfmgmt_data *rfmgmt = &g_ble_ll_rfmgmt_data; - uint32_t now; - bool can_disable; - uint8_t lls; - os_sr_t sr; - - OS_ENTER_CRITICAL(sr); - - now = os_cputime_get32(); - - can_disable = true; - lls = ble_ll_state_get(); - - if (rfmgmt->enable_scan && CPUTIME_GEQ(now, rfmgmt->enable_scan_at)) { - /* Blocked by scan */ - can_disable = false; - } else if (rfmgmt->enable_sched && CPUTIME_GEQ(now, rfmgmt->enable_sched_at)) { - /* Blocked by scheduler item */ - can_disable = false; - } else if (lls != BLE_LL_STATE_STANDBY) { - /* Blocked by LL state */ - can_disable = false; - } - - if (can_disable) { - ble_ll_rfmgmt_disable(); - } - - OS_EXIT_CRITICAL(sr); -} - -static uint32_t -ble_ll_rfmgmt_ticks_to_enabled(void) -{ - struct ble_ll_rfmgmt_data *rfmgmt = &g_ble_ll_rfmgmt_data; - uint32_t rem_ticks; - uint32_t now; - - switch (rfmgmt->state) { - case RFMGMT_STATE_OFF: - rem_ticks = rfmgmt->ticks_to_enabled; - break; - case RFMGMT_STATE_ENABLING: - now = os_cputime_get32(); - if (CPUTIME_LT(now, rfmgmt->enabled_at + rfmgmt->ticks_to_enabled)) { - rem_ticks = rfmgmt->enabled_at + rfmgmt->ticks_to_enabled - now; - break; - } - rfmgmt->state = RFMGMT_STATE_ENABLED; - /* no break */ - case RFMGMT_STATE_ENABLED: - rem_ticks = 0; - break; - default: - BLE_LL_ASSERT(0); - rem_ticks = 0; - break; - } - - return rem_ticks; -} - -void -ble_ll_rfmgmt_init(void) -{ - struct ble_ll_rfmgmt_data *rfmgmt = &g_ble_ll_rfmgmt_data; - - rfmgmt->state = RFMGMT_STATE_OFF; - - rfmgmt->ticks_to_enabled = - ble_ll_usecs_to_ticks_round_up(MYNEWT_VAL(BLE_LL_RFMGMT_ENABLE_TIME)); - - rfmgmt->timer_scheduled = false; - os_cputime_timer_init(&rfmgmt->timer, ble_ll_rfmgmt_timer_exp, NULL); - - ble_npl_event_init(&rfmgmt->release_ev, ble_ll_rfmgmt_release_ev, NULL); -} - -void -ble_ll_rfmgmt_reset(void) -{ - struct ble_ll_rfmgmt_data *rfmgmt = &g_ble_ll_rfmgmt_data; - - rfmgmt->timer_scheduled = false; - rfmgmt->timer_scheduled_at = 0; - os_cputime_timer_stop(&rfmgmt->timer); - - ble_npl_eventq_remove(&g_ble_ll_data.ll_evq, &rfmgmt->release_ev); - - ble_ll_rfmgmt_disable(); - - rfmgmt->enable_scan = false; - rfmgmt->enable_scan_at = 0; - rfmgmt->enable_sched = false; - rfmgmt->enable_sched_at = 0; - - rfmgmt->enabled_at = 0; -} - -void -ble_ll_rfmgmt_scan_changed(bool enabled, uint32_t next_window) -{ - struct ble_ll_rfmgmt_data *rfmgmt = &g_ble_ll_rfmgmt_data; - os_sr_t sr; - - OS_ENTER_CRITICAL(sr); - - rfmgmt->enable_scan = enabled; - rfmgmt->enable_scan_at = next_window - rfmgmt->ticks_to_enabled; - - ble_ll_rfmgmt_timer_reschedule(); - - OS_EXIT_CRITICAL(sr); -} - -void -ble_ll_rfmgmt_sched_changed(struct ble_ll_sched_item *first) -{ - struct ble_ll_rfmgmt_data *rfmgmt = &g_ble_ll_rfmgmt_data; - os_sr_t sr; - - OS_ENTER_CRITICAL(sr); - - rfmgmt->enable_sched = (first != NULL); - if (first) { - rfmgmt->enable_sched_at = first->start_time - rfmgmt->ticks_to_enabled; - } - - ble_ll_rfmgmt_timer_reschedule(); - - OS_EXIT_CRITICAL(sr); -} - -void -ble_ll_rfmgmt_release(void) -{ - struct ble_ll_rfmgmt_data *rfmgmt = &g_ble_ll_rfmgmt_data; - os_sr_t sr; - - OS_ENTER_CRITICAL(sr); - - ble_npl_eventq_remove(&g_ble_ll_data.ll_evq, &rfmgmt->release_ev); - - if (g_ble_ll_rfmgmt_data.state != RFMGMT_STATE_OFF) { - ble_npl_eventq_put(&g_ble_ll_data.ll_evq, &rfmgmt->release_ev); - } - - OS_EXIT_CRITICAL(sr); -} - -uint32_t -ble_ll_rfmgmt_enable_now(void) -{ - struct ble_ll_rfmgmt_data *rfmgmt = &g_ble_ll_rfmgmt_data; - uint32_t enabled_at; - os_sr_t sr; - - OS_ENTER_CRITICAL(sr); - - ble_ll_rfmgmt_enable(); - - if (rfmgmt->state == RFMGMT_STATE_ENABLED) { - enabled_at = os_cputime_get32(); - } else { - enabled_at = rfmgmt->enabled_at + rfmgmt->ticks_to_enabled + 1; - } - - OS_EXIT_CRITICAL(sr); - - return enabled_at; -} - -bool -ble_ll_rfmgmt_is_enabled(void) -{ - bool ret; - - OS_ASSERT_CRITICAL(); - - ret = ble_ll_rfmgmt_ticks_to_enabled() == 0; - - return ret; -} - -#else - -void -ble_ll_rfmgmt_init(void) -{ - static bool enabled = false; - - if (!enabled) { - ble_phy_rfclk_enable(); - } - - enabled = true; -} - -#endif -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_scan.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_scan.c deleted file mode 100644 index 03a683a76..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_scan.c +++ /dev/null @@ -1,3981 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/porting/nimble/include/os/os_cputime.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/include/nimble/hci_common.h" -#include "nimble/nimble/include/nimble/ble_hci_trans.h" -#include "../include/controller/ble_phy.h" -#include "../include/controller/ble_hw.h" -#include "../include/controller/ble_ll.h" -#include "../include/controller/ble_ll_sched.h" -#include "../include/controller/ble_ll_adv.h" -#include "../include/controller/ble_ll_scan.h" -#include "../include/controller/ble_ll_hci.h" -#include "../include/controller/ble_ll_whitelist.h" -#include "../include/controller/ble_ll_resolv.h" -#include "../include/controller/ble_ll_rfmgmt.h" -#include "../include/controller/ble_ll_trace.h" -#include "../include/controller/ble_ll_sync.h" -#include "ble_ll_conn_priv.h" - -/* - * XXX: - * 1) I think I can guarantee that we dont process things out of order if - * I send an event when a scan request is sent. The scan_rsp_pending flag - * code might be made simpler. - * - * 2) Interleave sending scan requests to different advertisers? I guess I need - * a list of advertisers to which I sent a scan request and have yet to - * receive a scan response from? Implement this. - */ - -/* Dont allow more than 255 of these entries */ -#if MYNEWT_VAL(BLE_LL_NUM_SCAN_RSP_ADVS) > 255 - #error "Cannot have more than 255 scan response entries!" -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) -#define SCAN_VALID_PHY_MASK (BLE_HCI_LE_PHY_1M_PREF_MASK | BLE_HCI_LE_PHY_CODED_PREF_MASK) -#else -#define SCAN_VALID_PHY_MASK (BLE_HCI_LE_PHY_1M_PREF_MASK) -#endif - -/* The scanning parameters set by host */ -static struct ble_ll_scan_params g_ble_ll_scan_params[BLE_LL_SCAN_PHY_NUMBER]; - -/* The scanning state machine global object */ -static struct ble_ll_scan_sm g_ble_ll_scan_sm; - -struct ble_ll_ext_adv_hdr -{ - uint8_t mode; - uint8_t hdr_len; - uint8_t hdr[0]; -}; - -struct ble_ll_scan_addr_data { - bool adva_present; - uint8_t adva_type; - uint8_t *adva; - uint8_t targeta_type; - uint8_t *targeta; - uint8_t adv_addr_type; - uint8_t *adv_addr; - struct ble_ll_resolv_entry *rl; -}; - -/* - * Structure used to store advertisers. This is used to limit sending scan - * requests to the same advertiser and also to filter duplicate events sent - * to the host. - */ -struct ble_ll_scan_advertisers -{ - uint16_t sc_adv_flags; - uint16_t adi; - struct ble_dev_addr adv_addr; -}; - -#define BLE_LL_SC_ADV_F_RANDOM_ADDR (0x01) -#define BLE_LL_SC_ADV_F_SCAN_RSP_RXD (0x02) -#define BLE_LL_SC_ADV_F_DIRECT_RPT_SENT (0x04) -#define BLE_LL_SC_ADV_F_ADV_RPT_SENT (0x08) -#define BLE_LL_SC_ADV_F_SCAN_RSP_SENT (0x10) - -/* Contains list of advertisers that we have heard scan responses from */ -static uint8_t g_ble_ll_scan_num_rsp_advs; -struct ble_ll_scan_advertisers -g_ble_ll_scan_rsp_advs[MYNEWT_VAL(BLE_LL_NUM_SCAN_RSP_ADVS)]; - -/* Duplicates filtering data */ -#define BLE_LL_SCAN_ENTRY_TYPE_LEGACY(addr_type) \ - ((addr_type) & 1) -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -#define BLE_LL_SCAN_ENTRY_TYPE_EXT(addr_type, has_aux, is_anon, adi) \ - (((adi >> 8) & 0xF0) | (1 << 3) | (is_anon << 2) | (has_aux << 1) | ((addr_type) & 1)) -#endif - -#define BLE_LL_SCAN_DUP_F_ADV_REPORT_SENT (0x01) -#define BLE_LL_SCAN_DUP_F_DIR_ADV_REPORT_SENT (0x02) -#define BLE_LL_SCAN_DUP_F_SCAN_RSP_SENT (0x04) - -struct ble_ll_scan_dup_entry { - uint8_t type; /* entry type, see BLE_LL_SCAN_ENTRY_TYPE_* */ - uint8_t addr[6]; - uint8_t flags; /* use BLE_LL_SCAN_DUP_F_xxx */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - uint16_t adi; -#endif - TAILQ_ENTRY(ble_ll_scan_dup_entry) link; -}; - -static os_membuf_t g_scan_dup_mem[ OS_MEMPOOL_SIZE( - MYNEWT_VAL(BLE_LL_NUM_SCAN_DUP_ADVS), - sizeof(struct ble_ll_scan_dup_entry)) ]; -static struct os_mempool g_scan_dup_pool; -static TAILQ_HEAD(ble_ll_scan_dup_list, ble_ll_scan_dup_entry) g_scan_dup_list; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -#if MYNEWT_VAL(BLE_LL_EXT_ADV_AUX_PTR_CNT) != 0 -static os_membuf_t ext_scan_aux_mem[ OS_MEMPOOL_SIZE( - MYNEWT_VAL(BLE_LL_EXT_ADV_AUX_PTR_CNT), - sizeof (struct ble_ll_aux_data)) -]; -#else -#define ext_scan_aux_mem NULL -#endif - -static struct os_mempool ext_scan_aux_pool; - -static int ble_ll_scan_start(struct ble_ll_scan_sm *scansm, - struct ble_ll_sched_item *sch); - -static void -ble_ll_aux_scan_drop_event_cb(struct ble_npl_event *ev) -{ - struct ble_ll_aux_data *aux_data = ble_npl_event_get_arg(ev); - - ble_ll_scan_end_adv_evt(aux_data); - ble_ll_scan_aux_data_unref(aux_data); -} - -static void -ble_ll_aux_scan_drop(struct ble_ll_aux_data *aux_data) -{ - BLE_LL_ASSERT(aux_data); - - STATS_INC(ble_ll_stats, aux_scan_drop); - - ble_npl_event_init(&aux_data->ev, ble_ll_aux_scan_drop_event_cb, aux_data); - ble_ll_event_send(&aux_data->ev); -} - -static int -ble_ll_aux_scan_cb(struct ble_ll_sched_item *sch) -{ - struct ble_ll_scan_sm *scansm = &g_ble_ll_scan_sm; - uint8_t lls = ble_ll_state_get(); - uint32_t wfr_usec; - - STATS_INC(ble_ll_stats, aux_sched_cb); - - /* Drop the scheduled item if scan was disable or there is aux or scan - * response pending - */ - if (!scansm->scan_enabled || scansm->cur_aux_data || - scansm->scan_rsp_pending) { - ble_ll_aux_scan_drop(sch->cb_arg); - sch->cb_arg = NULL; - goto done; - } - - /* Check if there is no aux connect sent. If so drop the sched item */ - if (lls == BLE_LL_STATE_INITIATING && ble_ll_conn_init_pending_aux_conn_rsp()) { - ble_ll_aux_scan_drop(sch->cb_arg); - sch->cb_arg = NULL; - goto done; - } - - /* This function is called only when scanner is running. This can happen - * in 3 states: - * BLE_LL_STATE_SCANNING - * BLE_LL_STATE_INITIATING - * BLE_LL_STATE_STANDBY - */ - if (lls != BLE_LL_STATE_STANDBY) { - ble_phy_disable(); - ble_ll_state_set(BLE_LL_STATE_STANDBY); - } - - /* When doing RX for AUX pkt, cur_aux_data keeps valid aux data */ - scansm->cur_aux_data = sch->cb_arg; - sch->cb_arg = NULL; - BLE_LL_ASSERT(scansm->cur_aux_data != NULL); - scansm->cur_aux_data->scanning = 1; - - if (ble_ll_scan_start(scansm, sch)) { - ble_ll_scan_interrupted(scansm); - goto done; - } - - STATS_INC(ble_ll_stats, aux_fired_for_read); - - wfr_usec = scansm->cur_aux_data->offset_units ? 300 : 30; - ble_phy_wfr_enable(BLE_PHY_WFR_ENABLE_RX, 0, wfr_usec); - -done: - - return BLE_LL_SCHED_STATE_DONE; -} - -static int -ble_ll_scan_ext_adv_init(struct ble_ll_aux_data **aux_data) -{ - struct ble_ll_aux_data *e; - - e = os_memblock_get(&ext_scan_aux_pool); - if (!e) { - return -1; - } - - memset(e, 0, sizeof(*e)); - e->sch.sched_cb = ble_ll_aux_scan_cb; - e->sch.sched_type = BLE_LL_SCHED_TYPE_AUX_SCAN; - e->ref_cnt = 1; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - e->rpa_index = -1; -#endif - ble_ll_trace_u32x2(BLE_LL_TRACE_ID_AUX_REF, (uint32_t)e, e->ref_cnt); - - *aux_data = e; - STATS_INC(ble_ll_stats, aux_allocated); - - return 0; -} -#endif - -static inline uint32_t -ble_ll_scan_time_hci_to_ticks(uint16_t value) -{ - return os_cputime_usecs_to_ticks(value * BLE_HCI_SCAN_ITVL); -} - -/* See Vol 6 Part B Section 4.4.3.2. Active scanning backoff */ -static void -ble_ll_scan_req_backoff(struct ble_ll_scan_sm *scansm, int success) -{ - BLE_LL_ASSERT(scansm->backoff_count == 0); - BLE_LL_ASSERT(scansm->scan_rsp_pending == 0); - - if (success) { - scansm->scan_rsp_cons_fails = 0; - ++scansm->scan_rsp_cons_ok; - if (scansm->scan_rsp_cons_ok == 2) { - scansm->scan_rsp_cons_ok = 0; - if (scansm->upper_limit > 1) { - scansm->upper_limit >>= 1; - } - } - STATS_INC(ble_ll_stats, scan_req_txg); - } else { - scansm->scan_rsp_cons_ok = 0; - ++scansm->scan_rsp_cons_fails; - if (scansm->scan_rsp_cons_fails == 2) { - scansm->scan_rsp_cons_fails = 0; - if (scansm->upper_limit < 256) { - scansm->upper_limit <<= 1; - } - } - STATS_INC(ble_ll_stats, scan_req_txf); - } - - scansm->backoff_count = rand() & (scansm->upper_limit - 1); - ++scansm->backoff_count; - BLE_LL_ASSERT(scansm->backoff_count <= 256); -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) -static void -ble_ll_scan_refresh_nrpa(struct ble_ll_scan_sm *scansm) -{ - ble_npl_time_t now; - - now = ble_npl_time_get(); - if ((ble_npl_stime_t)(now - scansm->scan_nrpa_timer) >= 0) { - /* Generate new NRPA */ - ble_ll_rand_data_get(scansm->scan_nrpa, BLE_DEV_ADDR_LEN); - scansm->scan_nrpa[5] &= ~0xc0; - - /* We'll use the same timeout as for RPA rotation */ - scansm->scan_nrpa_timer = now + ble_ll_resolv_get_rpa_tmo(); - } -} -#endif - -static void -ble_ll_scan_req_pdu_prepare(struct ble_ll_scan_sm *scansm, - const uint8_t *adv_addr, uint8_t adv_addr_type, - struct ble_ll_resolv_entry *rl) -{ - uint8_t hdr_byte; - struct ble_ll_scan_pdu_data *pdu_data; - uint8_t *scana; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - uint8_t rpa[BLE_DEV_ADDR_LEN]; -#endif - - pdu_data = &scansm->pdu_data; - - /* Construct first PDU header byte */ - hdr_byte = BLE_ADV_PDU_TYPE_SCAN_REQ; - if (adv_addr_type) { - hdr_byte |= BLE_ADV_PDU_HDR_RXADD_RAND; - } - - /* Determine ScanA */ - if (scansm->own_addr_type & 0x01) { - hdr_byte |= BLE_ADV_PDU_HDR_TXADD_RAND; - scana = g_random_addr; - } else { - scana = g_dev_addr; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - if (scansm->own_addr_type & 0x02) { - /* - * If device is on RL and we have local IRK, we use RPA generated using - * that IRK as ScanA. Otherwise we use NRPA as ScanA to prevent our - * device from being tracked when doing an active scan (Core 5.1, Vol 6, - * Part B, section 6.3) - */ - if (rl && rl->rl_has_local) { - ble_ll_resolv_get_priv_addr(rl, 1, rpa); - scana = rpa; - } else { - ble_ll_scan_refresh_nrpa(scansm); - scana = scansm->scan_nrpa; - } - - hdr_byte |= BLE_ADV_PDU_HDR_TXADD_RAND; - } -#endif - - /* Save scan request data */ - pdu_data->hdr_byte = hdr_byte; - memcpy(pdu_data->scana, scana, BLE_DEV_ADDR_LEN); - memcpy(pdu_data->adva, adv_addr, BLE_DEV_ADDR_LEN); -} - -static uint8_t -ble_ll_scan_req_tx_pdu_cb(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte) -{ - struct ble_ll_scan_sm *scansm = pducb_arg; - struct ble_ll_scan_pdu_data *pdu_data = &scansm->pdu_data; - - memcpy(dptr, pdu_data->scana, BLE_DEV_ADDR_LEN); - memcpy(dptr + BLE_DEV_ADDR_LEN, pdu_data->adva, BLE_DEV_ADDR_LEN); - - *hdr_byte = pdu_data->hdr_byte; - - return BLE_DEV_ADDR_LEN * 2; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -/* if copy_from is provided new report is initialized with that instead of - * defaults - */ -static struct ble_hci_ev * -ble_ll_scan_get_ext_adv_report(struct ext_adv_report *copy_from) -{ - struct ble_hci_ev_le_subev_ext_adv_rpt *ev; - struct ext_adv_report *report; - struct ble_hci_ev *hci_ev; - - hci_ev = ( void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_LO); - if (!hci_ev) { - return NULL; - } - - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev) + sizeof(*report); - ev = (void *) hci_ev->data; - - memset(ev, 0, sizeof(*ev)); - ev->subev_code = BLE_HCI_LE_SUBEV_EXT_ADV_RPT; - /* We support only one report per event now */ - ev->num_reports = 1; - - report = ev->reports; - - if (copy_from) { - memcpy(report, copy_from, sizeof(*report)); - report->data_len = 0; - } else { - memset(report, 0, sizeof(*report)); - - report->pri_phy = BLE_PHY_1M; - /* Init SID with "Not available" which is 0xFF */ - report->sid = 0xFF; - /* Init TX Power with "Not available" which is 127 */ - report->tx_power = 127; - /* Init RSSI with "Not available" which is 127 */ - report->rssi = 127; - /* Init address type with "anonymous" which is 0xFF */ - report->addr_type = 0xFF; - } - - return hci_ev; -} - -static void -ble_ll_scan_send_truncated(struct ble_ll_aux_data *aux_data) -{ - struct ble_hci_ev_le_subev_ext_adv_rpt *ev; - struct ext_adv_report *report; - struct ble_hci_ev *hci_ev; - - if (!ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_EXT_ADV_RPT)) { - return; - } - - BLE_LL_ASSERT(aux_data); - - /* No need to send if we did not send any report or sent truncated already */ - if (!(aux_data->flags_ll & BLE_LL_AUX_FLAG_HCI_SENT_ANY) || - (aux_data->flags_ll & BLE_LL_AUX_FLAG_HCI_SENT_TRUNCATED)) { - return; - } - - BLE_LL_ASSERT(aux_data->evt); - hci_ev = aux_data->evt; - aux_data->evt = NULL; - - hci_ev->length = sizeof(*ev) + sizeof(*report); - - ev = (void *) hci_ev->data; - report = ev->reports; - - report->data_len = 0; - - report->evt_type = aux_data->evt_type; - report->evt_type |= BLE_HCI_ADV_DATA_STATUS_TRUNCATED; - - if (aux_data->flags & BLE_LL_AUX_HAS_ADVA) { - memcpy(report->addr, aux_data->adva, 6); - report->addr_type = aux_data->adva_type; - } - - if (aux_data->flags & BLE_LL_AUX_HAS_TARGETA) { - memcpy(report->dir_addr, aux_data->targeta, 6); - report->dir_addr_type = aux_data->targeta_type; - } - - report->sid = aux_data->adi >> 12; - ble_ll_hci_event_send(hci_ev); - - aux_data->flags_ll |= BLE_LL_AUX_FLAG_SCAN_ERROR; - aux_data->flags_ll |= BLE_LL_AUX_FLAG_HCI_SENT_ANY; - aux_data->flags_ll |= BLE_LL_AUX_FLAG_HCI_SENT_TRUNCATED; -} - -static int -ble_ll_scan_get_adi(struct ble_ll_aux_data *aux_data, uint16_t *adi) -{ - if (!aux_data || !(aux_data->flags & BLE_LL_AUX_HAS_ADI)) { - return -1; - } - - *adi = aux_data->adi; - - return 0; -} - -void -ble_ll_scan_end_adv_evt(struct ble_ll_aux_data *aux_data) -{ - /* Make sure we send report with 'truncated' data state if needed */ - ble_ll_scan_send_truncated(aux_data); -} -#endif - -static void -ble_ll_scan_clean_cur_aux_data(void) -{ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - struct ble_ll_scan_sm *scansm = &g_ble_ll_scan_sm; - - /* If scanner was reading aux ptr, we need to clean it up */ - if (scansm->cur_aux_data) { - ble_ll_scan_end_adv_evt(scansm->cur_aux_data); - ble_ll_scan_aux_data_unref(scansm->cur_aux_data); - scansm->cur_aux_data = NULL; - } -#endif -} - -void -ble_ll_scan_halt(void) -{ - struct ble_ll_scan_sm *scansm = &g_ble_ll_scan_sm; - - ble_ll_scan_clean_cur_aux_data(); - - /* Update backoff if we failed to receive scan response */ - if (scansm->scan_rsp_pending) { - scansm->scan_rsp_pending = 0; - ble_ll_scan_req_backoff(scansm, 0); - } -} - -/** - * Checks to see if we have received a scan response from this advertiser. - * - * @param adv_addr Address of advertiser - * @param txadd TxAdd bit (0: public; random otherwise) - * - * @return int 0: have not received a scan response; 1 otherwise. - */ -static int -ble_ll_scan_have_rxd_scan_rsp(uint8_t *addr, uint8_t txadd, - uint8_t ext_adv, uint16_t adi) -{ - uint8_t num_advs; - struct ble_ll_scan_advertisers *adv; - - /* Do we have an address match? Must match address type */ - adv = &g_ble_ll_scan_rsp_advs[0]; - num_advs = g_ble_ll_scan_num_rsp_advs; - while (num_advs) { - if (!memcmp(&adv->adv_addr, addr, BLE_DEV_ADDR_LEN)) { - /* Address type must match */ - if (txadd) { - if (adv->sc_adv_flags & BLE_LL_SC_ADV_F_RANDOM_ADDR) { - if (ext_adv) { - if (adi == adv->adi) { - return 1; - } - goto next; - } - return 1; - } - } else { - if ((adv->sc_adv_flags & BLE_LL_SC_ADV_F_RANDOM_ADDR) == 0) { - if (ext_adv) { - if (adi == adv->adi) { - return 1; - } - goto next; - } - return 1; - } - } - } -next: - ++adv; - --num_advs; - } - - return 0; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static void -ble_ll_scan_add_scan_rsp_adv(uint8_t *addr, uint8_t txadd, - uint8_t ext_adv, uint16_t adi) -{ - uint8_t num_advs; - struct ble_ll_scan_advertisers *adv; - - /* XXX: for now, if we dont have room, just leave */ - num_advs = g_ble_ll_scan_num_rsp_advs; - if (num_advs == MYNEWT_VAL(BLE_LL_NUM_SCAN_RSP_ADVS)) { - return; - } - - /* Check if address is already on the list */ - if (ble_ll_scan_have_rxd_scan_rsp(addr, txadd, ext_adv, adi)) { - return; - } - - /* Add the advertiser to the array */ - adv = &g_ble_ll_scan_rsp_advs[num_advs]; - memcpy(&adv->adv_addr, addr, BLE_DEV_ADDR_LEN); - adv->sc_adv_flags = BLE_LL_SC_ADV_F_SCAN_RSP_RXD; - if (txadd) { - adv->sc_adv_flags |= BLE_LL_SC_ADV_F_RANDOM_ADDR; - } - adv->adi = adi; - ++g_ble_ll_scan_num_rsp_advs; - - return; -} - -static int -ble_ll_hci_send_legacy_ext_adv_report(uint8_t evtype, - const uint8_t *addr, uint8_t addr_type, - uint8_t rssi, - uint8_t adv_data_len, - struct os_mbuf *adv_data, - const uint8_t *inita, uint8_t inita_type) -{ - struct ble_hci_ev_le_subev_ext_adv_rpt *ev; - struct ext_adv_report *report; - struct ble_hci_ev *hci_ev; - - if (!ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_EXT_ADV_RPT)) { - return -1; - } - - /* Drop packet if adv data doesn't fit */ - if ((sizeof(*ev) + sizeof(ev->reports[0]) + adv_data_len) > BLE_HCI_MAX_DATA_LEN) { - STATS_INC(ble_ll_stats, adv_evt_dropped); - return -1; - } - - hci_ev = ble_ll_scan_get_ext_adv_report(NULL); - if (!hci_ev) { - return -1; - } - - ev = (void *) hci_ev->data; - report = ev->reports; - - switch (evtype) { - case BLE_HCI_ADV_RPT_EVTYPE_ADV_IND: - report->evt_type = BLE_HCI_LEGACY_ADV_EVTYPE_ADV_IND; - break; - case BLE_HCI_ADV_RPT_EVTYPE_DIR_IND: - report->evt_type = BLE_HCI_LEGACY_ADV_EVTYPE_ADV_DIRECT_IND; - break; - case BLE_HCI_ADV_RPT_EVTYPE_NONCONN_IND: - report->evt_type = BLE_HCI_LEGACY_ADV_EVTYPE_ADV_NONCON_IND; - break; - case BLE_HCI_ADV_RPT_EVTYPE_SCAN_RSP: - report->evt_type = BLE_HCI_LEGACY_ADV_EVTYPE_SCAN_RSP_ADV_IND; - break; - case BLE_HCI_ADV_RPT_EVTYPE_SCAN_IND: - report->evt_type = BLE_HCI_LEGACY_ADV_EVTYPE_ADV_SCAN_IND; - break; - default: - BLE_LL_ASSERT(0); - ble_hci_trans_buf_free((uint8_t *) hci_ev); - return -1; - } - - report->addr_type = addr_type; - memcpy(report->addr, addr, BLE_DEV_ADDR_LEN); - report->pri_phy = BLE_PHY_1M; - report->sid = 0xFF; - report->tx_power = 127; - report->rssi = rssi; - - if (inita) { - report->dir_addr_type = inita_type; - memcpy(report->dir_addr, inita, BLE_DEV_ADDR_LEN); - } - - if (adv_data_len) { - hci_ev->length += adv_data_len; - report->data_len = adv_data_len; - os_mbuf_copydata(adv_data, 0, adv_data_len, report->data); - } - - return ble_ll_hci_event_send(hci_ev); -} -#endif - -static int -ble_ll_hci_send_adv_report(uint8_t evtype, - const uint8_t *addr, uint8_t addr_type, int8_t rssi, - uint8_t adv_data_len, struct os_mbuf *adv_data) -{ - struct ble_hci_ev_le_subev_adv_rpt *ev; - struct ble_hci_ev *hci_ev; - int8_t *ev_rssi; - - if (!ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_ADV_RPT)) { - return -1; - } - - /* Drop packet if adv data doesn't fit, note extra 1 is for RSSI */ - if ((sizeof(*ev) + sizeof(ev->reports[0]) + adv_data_len + 1) > BLE_HCI_MAX_DATA_LEN) { - STATS_INC(ble_ll_stats, adv_evt_dropped); - return -1; - } - - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_LO); - if (!hci_ev) { - return -1; - } - - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev) + sizeof(ev->reports[0]) + adv_data_len + 1; - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_ADV_RPT; - ev->num_reports = 1; - - ev->reports[0].type = evtype; - ev->reports[0].addr_type = addr_type; - memcpy(ev->reports[0].addr, addr, BLE_DEV_ADDR_LEN); - ev->reports[0].data_len = adv_data_len; - os_mbuf_copydata(adv_data, 0, adv_data_len, ev->reports[0].data); - - /* RSSI is after adv data... */ - ev_rssi = (int8_t *) (hci_ev->data + sizeof(*ev) + sizeof(ev->reports[0]) + adv_data_len); - *ev_rssi = rssi; - - return ble_ll_hci_event_send(hci_ev); -} - -static int -ble_ll_hci_send_dir_adv_report(const uint8_t *addr, uint8_t addr_type, - const uint8_t *inita, uint8_t inita_type, - int8_t rssi) -{ - struct ble_hci_ev_le_subev_direct_adv_rpt *ev; - struct ble_hci_ev *hci_ev; - - if (!ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_DIRECT_ADV_RPT)) { - return -1; - } - - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_LO); - if (!hci_ev) { - return -1; - } - - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev) + sizeof(*(ev->reports)); - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_DIRECT_ADV_RPT; - ev->num_reports = 1; - - ev->reports[0].type = BLE_HCI_ADV_RPT_EVTYPE_DIR_IND; - ev->reports[0].addr_type = addr_type; - memcpy(ev->reports[0].addr, addr, BLE_DEV_ADDR_LEN); - ev->reports[0].dir_addr_type = inita_type; - memcpy(ev->reports[0].dir_addr, inita, BLE_DEV_ADDR_LEN); - ev->reports[0].rssi = rssi; - - return ble_ll_hci_event_send(hci_ev); -} - -static int -ble_ll_scan_dup_update_legacy(uint8_t addr_type, const uint8_t *addr, - uint8_t subev, uint8_t evtype) -{ - struct ble_ll_scan_dup_entry *e; - uint8_t type; - - type = BLE_LL_SCAN_ENTRY_TYPE_LEGACY(addr_type); - - /* - * We assume ble_ll_scan_dup_check() was called before which either matched - * some entry or allocated new one and placed in on the top of queue. - */ - - e = TAILQ_FIRST(&g_scan_dup_list); - BLE_LL_ASSERT(e && e->type == type && !memcmp(e->addr, addr, 6)); - - if (subev == BLE_HCI_LE_SUBEV_DIRECT_ADV_RPT) { - e->flags |= BLE_LL_SCAN_DUP_F_DIR_ADV_REPORT_SENT; - } else { - if (evtype == BLE_HCI_ADV_RPT_EVTYPE_SCAN_RSP) { - e->flags |= BLE_LL_SCAN_DUP_F_SCAN_RSP_SENT; - } else { - e->flags |= BLE_LL_SCAN_DUP_F_ADV_REPORT_SENT; - } - } - - return 0; -} - -/** - * Send an advertising report to the host. - * - * NOTE: while we are allowed to send multiple devices in one report, we - * will just send for one for now. - * - * @param pdu_type - * @param txadd - * @param rxbuf - * @param hdr - * @param scansm - */ -static void -ble_ll_scan_send_adv_report(uint8_t pdu_type, - const uint8_t *adva, uint8_t adva_type, - const uint8_t *inita, uint8_t inita_type, - struct os_mbuf *om, - struct ble_mbuf_hdr *hdr, - struct ble_ll_scan_sm *scansm) -{ - uint8_t subev = BLE_HCI_LE_SUBEV_ADV_RPT; - uint8_t adv_data_len; - uint8_t evtype; - int rc; - - if (pdu_type == BLE_ADV_PDU_TYPE_ADV_DIRECT_IND) { - if (ble_ll_is_rpa(inita, inita_type)) { - /* For resolvable we send separate subevent */ - subev = BLE_HCI_LE_SUBEV_DIRECT_ADV_RPT; - } - - evtype = BLE_HCI_ADV_RPT_EVTYPE_DIR_IND; - adv_data_len = 0; - } else { - if (pdu_type == BLE_ADV_PDU_TYPE_ADV_IND) { - evtype = BLE_HCI_ADV_RPT_EVTYPE_ADV_IND; - } else if (pdu_type == BLE_ADV_PDU_TYPE_ADV_SCAN_IND) { - evtype = BLE_HCI_ADV_RPT_EVTYPE_SCAN_IND; - } else if (pdu_type == BLE_ADV_PDU_TYPE_ADV_NONCONN_IND) { - evtype = BLE_HCI_ADV_RPT_EVTYPE_NONCONN_IND; - } else { - evtype = BLE_HCI_ADV_RPT_EVTYPE_SCAN_RSP; - } - adv_data_len = om->om_data[1] - BLE_DEV_ADDR_LEN; - os_mbuf_adj(om, BLE_LL_PDU_HDR_LEN + BLE_DEV_ADDR_LEN); - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - /* If RPA has been used, make sure we use correct address types - * in the advertising report. - */ - if (BLE_MBUF_HDR_RESOLVED(hdr)) { - adva_type += 2; - } - if (BLE_MBUF_HDR_TARGETA_RESOLVED(hdr)) { - inita_type += 2; - } -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (scansm->ext_scanning) { - rc = ble_ll_hci_send_legacy_ext_adv_report(evtype, - adva, adva_type, - hdr->rxinfo.rssi, - adv_data_len, om, - inita, inita_type); - goto done; - } -#endif - - if (subev == BLE_HCI_LE_SUBEV_DIRECT_ADV_RPT) { - rc = ble_ll_hci_send_dir_adv_report(adva, adva_type, inita, inita_type, - hdr->rxinfo.rssi); - goto done; - } - - rc = ble_ll_hci_send_adv_report(evtype, adva, adva_type, hdr->rxinfo.rssi, - adv_data_len, om); -done: - if (!rc && scansm->scan_filt_dups) { - ble_ll_scan_dup_update_legacy(adva_type, adva, subev, evtype); - } -} - -static void -ble_ll_get_chan_to_scan(struct ble_ll_scan_sm *scansm, uint8_t *chan, - int *phy) -{ - struct ble_ll_scan_params *scanp = scansm->scanp; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - struct ble_ll_aux_data *aux_data = scansm->cur_aux_data; - - if (!scansm->ext_scanning || !aux_data || !aux_data->scanning) { - *chan = scanp->scan_chan; - *phy = scanp->phy; - return; - } - - *chan = aux_data->chan; - *phy = aux_data->aux_phy; -#else - *chan = scanp->scan_chan; - *phy = scanp->phy; -#endif -} -/** - * Called to enable the receiver for scanning. - * - * Context: Link Layer task - * - * @param sch - * - * @return int - */ -static int -ble_ll_scan_start(struct ble_ll_scan_sm *scansm, struct ble_ll_sched_item *sch) -{ - int rc; - struct ble_ll_scan_params *scanp = scansm->scanp; - uint8_t scan_chan; -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - uint8_t phy_mode; -#endif - int phy; - - BLE_LL_ASSERT(scansm->scan_rsp_pending == 0); - - ble_ll_get_chan_to_scan(scansm, &scan_chan, &phy); - - /* XXX: right now scheduled item is only present if we schedule for aux - * scan just make sanity check that we have proper combination of - * sch and resulting scan_chan - */ - BLE_LL_ASSERT(!sch || scan_chan < BLE_PHY_ADV_CHAN_START); - BLE_LL_ASSERT(sch || scan_chan >= BLE_PHY_ADV_CHAN_START); - - /* Set channel */ - rc = ble_phy_setchan(scan_chan, BLE_ACCESS_ADDR_ADV, BLE_LL_CRCINIT_ADV); - BLE_LL_ASSERT(rc == 0); - - /* - * Set transmit end callback to NULL in case we transmit a scan request. - * There is a callback for the connect request. - */ - ble_phy_set_txend_cb(NULL, NULL); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - ble_phy_encrypt_disable(); -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - if (ble_ll_resolv_enabled()) { - ble_phy_resolv_list_enable(); - } else { - ble_phy_resolv_list_disable(); - } -#endif - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - phy_mode = ble_ll_phy_to_phy_mode(phy, BLE_HCI_LE_PHY_CODED_ANY); - ble_phy_mode_set(phy_mode, phy_mode); -#endif - - /* XXX: probably need to make sure hfxo is running too */ - /* XXX: can make this better; want to just start asap. */ - if (sch) { - rc = ble_phy_rx_set_start_time(sch->start_time + - g_ble_ll_sched_offset_ticks, - sch->remainder); - } else { - rc = ble_phy_rx_set_start_time(os_cputime_get32() + - g_ble_ll_sched_offset_ticks, 0); - } - if (!rc || rc == BLE_PHY_ERR_RX_LATE) { - /* If we are late here, it is still OK because we keep scanning. - * Clear error - */ - rc = 0; - - /* Enable/disable whitelisting */ - if (scanp->scan_filt_policy & 1) { - ble_ll_whitelist_enable(); - } else { - ble_ll_whitelist_disable(); - } - - /* Set link layer state to scanning */ - if (scanp->scan_type == BLE_SCAN_TYPE_INITIATE) { - ble_ll_state_set(BLE_LL_STATE_INITIATING); - } else { - ble_ll_state_set(BLE_LL_STATE_SCANNING); - } - } - - return rc; -} - -static uint8_t -ble_ll_scan_get_next_adv_prim_chan(uint8_t chan) -{ - ++chan; - if (chan == BLE_PHY_NUM_CHANS) { - chan = BLE_PHY_ADV_CHAN_START; - } - - return chan; -} - -static uint32_t -ble_ll_scan_move_window_to(struct ble_ll_scan_params *scanp, uint32_t time) -{ - uint32_t end_time; - - /* - * Move window until given tick is before or inside window and move to next - * channel for each skipped interval. - */ - - end_time = scanp->timing.start_time + scanp->timing.window; - while (CPUTIME_GEQ(time, end_time)) { - scanp->timing.start_time += scanp->timing.interval; - scanp->scan_chan = ble_ll_scan_get_next_adv_prim_chan(scanp->scan_chan); - end_time = scanp->timing.start_time + scanp->timing.window; - } - - return scanp->timing.start_time; -} - -static bool -ble_ll_scan_is_inside_window(struct ble_ll_scan_params *scanp, uint32_t time) -{ - uint32_t start_time; - - /* Make sure we are checking against closest window */ - start_time = ble_ll_scan_move_window_to(scanp, time); - - if (scanp->timing.window == scanp->timing.interval) { - /* always inside window in continuous scan */ - return true; - } - - return CPUTIME_GEQ(time, start_time) && - CPUTIME_LT(time, start_time + scanp->timing.window); -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static void -ble_ll_scan_aux_data_free(struct ble_ll_aux_data *aux_data) -{ - if (aux_data) { - if (aux_data->evt) { - ble_hci_trans_buf_free((uint8_t *)aux_data->evt); - aux_data->evt = NULL; - } - os_memblock_put(&ext_scan_aux_pool, aux_data); - STATS_INC(ble_ll_stats, aux_freed); - } -} - -struct ble_ll_aux_data * -ble_ll_scan_aux_data_ref(struct ble_ll_aux_data *aux_data) -{ - os_sr_t sr; - - BLE_LL_ASSERT(aux_data); - - OS_ENTER_CRITICAL(sr); - aux_data->ref_cnt++; - ble_ll_trace_u32x2(BLE_LL_TRACE_ID_AUX_REF, (uint32_t) aux_data, aux_data->ref_cnt); - - OS_EXIT_CRITICAL(sr); - - return aux_data; -} - -void -ble_ll_scan_aux_data_unref(struct ble_ll_aux_data *aux_data) -{ - os_sr_t sr; - - BLE_LL_ASSERT(aux_data); - - OS_ENTER_CRITICAL(sr); - aux_data->ref_cnt--; - ble_ll_trace_u32x2(BLE_LL_TRACE_ID_AUX_UNREF, (uint32_t) aux_data, aux_data->ref_cnt); - - if (aux_data->ref_cnt == 0) { - /* - * Some validation to make sure that we completed scan properly: - * - we either did not send any report or sent completed/truncated - * - we only sent one of completed/truncated - * - in case of error, we wither did not send anything or sent truncated - */ - BLE_LL_ASSERT(!(aux_data->flags_ll & BLE_LL_AUX_FLAG_HCI_SENT_ANY) || - ((aux_data->flags_ll & BLE_LL_AUX_FLAG_HCI_SENT_ANY) && - (aux_data->flags_ll & (BLE_LL_AUX_FLAG_HCI_SENT_COMPLETED | BLE_LL_AUX_FLAG_HCI_SENT_TRUNCATED)))); - BLE_LL_ASSERT(!(aux_data->flags_ll & BLE_LL_AUX_FLAG_HCI_SENT_COMPLETED) || !(aux_data->flags_ll & BLE_LL_AUX_FLAG_HCI_SENT_TRUNCATED)); - BLE_LL_ASSERT(!(aux_data->flags_ll & BLE_LL_AUX_FLAG_SCAN_ERROR) || - !(aux_data->flags_ll & BLE_LL_AUX_FLAG_HCI_SENT_ANY) || - (aux_data->flags_ll & BLE_LL_AUX_FLAG_HCI_SENT_TRUNCATED)); - - ble_ll_scan_aux_data_free(aux_data); - } - - OS_EXIT_CRITICAL(sr); -} - -static void -ble_ll_scan_sched_remove(struct ble_ll_sched_item *sch) -{ - ble_ll_scan_end_adv_evt(sch->cb_arg); - ble_ll_scan_aux_data_unref(sch->cb_arg); - sch->cb_arg = NULL; -} -#endif -/** - * Stop the scanning state machine - */ -void -ble_ll_scan_sm_stop(int chk_disable) -{ - os_sr_t sr; - uint8_t lls; - struct ble_ll_scan_sm *scansm; - - /* Stop the scanning timer */ - scansm = &g_ble_ll_scan_sm; - os_cputime_timer_stop(&scansm->scan_timer); - - OS_ENTER_CRITICAL(sr); - - /* Disable scanning state machine */ - scansm->scan_enabled = 0; - scansm->restart_timer_needed = 0; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (scansm->ext_scanning) { - ble_ll_scan_clean_cur_aux_data(); - ble_ll_sched_rmv_elem_type(BLE_LL_SCHED_TYPE_AUX_SCAN, ble_ll_scan_sched_remove); - scansm->ext_scanning = 0; - } -#endif - - /* Update backoff if we failed to receive scan response */ - if (scansm->scan_rsp_pending) { - scansm->scan_rsp_pending = 0; - ble_ll_scan_req_backoff(scansm, 0); - } - OS_EXIT_CRITICAL(sr); - - /* Count # of times stopped */ - STATS_INC(ble_ll_stats, scan_stops); - - /* Only set state if we are currently in a scan window */ - if (chk_disable) { - OS_ENTER_CRITICAL(sr); - lls = ble_ll_state_get(); - - if ((lls == BLE_LL_STATE_SCANNING) || - (lls == BLE_LL_STATE_INITIATING && chk_disable == 1)) { - /* Disable phy */ - ble_phy_disable(); - - /* Set LL state to standby */ - ble_ll_state_set(BLE_LL_STATE_STANDBY); - } - OS_EXIT_CRITICAL(sr); - } - - /* No need for RF anymore */ - OS_ENTER_CRITICAL(sr); - ble_ll_rfmgmt_scan_changed(false, 0); - ble_ll_rfmgmt_release(); - OS_EXIT_CRITICAL(sr); -} - -static int -ble_ll_scan_sm_start(struct ble_ll_scan_sm *scansm) -{ - struct ble_ll_scan_params *scanp; - struct ble_ll_scan_params *scanp_next; - - if (!ble_ll_is_valid_own_addr_type(scansm->own_addr_type, g_random_addr)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - BLE_LL_ASSERT(scansm->scanp); - scanp = scansm->scanp; - scanp_next = scansm->scanp_next; - - /* Count # of times started */ - STATS_INC(ble_ll_stats, scan_starts); - - /* Set flag telling us that scanning is enabled */ - scansm->scan_enabled = 1; - - /* Set first advertising channel */ - scanp->scan_chan = BLE_PHY_ADV_CHAN_START; - if (scanp_next) { - scanp_next->scan_chan = BLE_PHY_ADV_CHAN_START; - } - - /* Reset scan request backoff parameters to default */ - scansm->upper_limit = 1; - scansm->backoff_count = 1; - scansm->scan_rsp_pending = 0; - - /* Forget filtered advertisers from previous scan. */ - g_ble_ll_scan_num_rsp_advs = 0; - - os_mempool_clear(&g_scan_dup_pool); - TAILQ_INIT(&g_scan_dup_list); - - /* - * First scan window can start when RF is enabled. Add 1 tick since we are - * most likely not aligned with ticks so RF may be effectively enabled 1 - * tick later. - */ - scanp->timing.start_time = ble_ll_rfmgmt_enable_now(); - ble_ll_rfmgmt_scan_changed(true, scanp->timing.start_time); - - if (scanp_next) { - /* Schedule start time right after first phy */ - scanp_next->timing.start_time = scanp->timing.start_time + - scanp->timing.window; - } - - /* Start scan at 1st window */ - os_cputime_timer_start(&scansm->scan_timer, scanp->timing.start_time); - - return BLE_ERR_SUCCESS; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static void -ble_ll_aux_scan_rsp_failed(struct ble_ll_scan_sm *scansm) -{ - if (!scansm->cur_aux_data) { - return; - } - - STATS_INC(ble_ll_stats, aux_scan_rsp_err); - ble_ll_scan_interrupted(scansm); -} -#endif - -static void -ble_ll_scan_interrupted_event_cb(struct ble_npl_event *ev) -{ - struct ble_ll_scan_sm *scansm = &g_ble_ll_scan_sm; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - struct ble_ll_aux_data *aux_data; -#endif - - if (!scansm->scan_enabled) { - return; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - aux_data = ble_npl_event_get_arg(ev); - - if (aux_data) { - if (scansm->scan_rsp_pending) { - STATS_INC(ble_ll_stats, aux_scan_rsp_err); - } - ble_ll_scan_end_adv_evt(aux_data); - ble_ll_scan_aux_data_unref(aux_data); - ble_npl_event_set_arg(ev, NULL); - STATS_INC(ble_ll_stats, aux_missed_adv); - } -#endif - - /* - * If we timed out waiting for a response, the scan response pending - * flag should be set. Deal with scan backoff. Put device back into rx. - */ - - if (scansm->scan_rsp_pending) { - scansm->scan_rsp_pending = 0; - ble_ll_scan_req_backoff(scansm, 0); - } - - ble_ll_scan_chk_resume(); -} - -/** - * Called to process the scanning OS event which was posted to the LL task - * - * Context: Link Layer task. - * - * @param arg - */ -static void -ble_ll_scan_event_proc(struct ble_npl_event *ev) -{ - struct ble_ll_scan_sm *scansm; - os_sr_t sr; - bool start_scan; - bool inside_window; - struct ble_ll_scan_params *scanp; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - bool inside_window_next; - struct ble_ll_scan_params *scanp_next; -#endif - uint32_t next_proc_time; - uint32_t now; - /* - * Get the scanning state machine. If not enabled (this is possible), just - * leave and do nothing (just make sure timer is stopped). - */ - scansm = (struct ble_ll_scan_sm *)ble_npl_event_get_arg(ev); - scanp = scansm->scanp; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - scanp_next = scansm->scanp_next; -#endif - - OS_ENTER_CRITICAL(sr); - if (!scansm->scan_enabled) { - os_cputime_timer_stop(&scansm->scan_timer); - ble_ll_rfmgmt_scan_changed(false, 0); - ble_ll_rfmgmt_release(); - OS_EXIT_CRITICAL(sr); - return; - } - - if (scansm->cur_aux_data || scansm->scan_rsp_pending) { - /* Aux scan in progress. Wait */ - STATS_INC(ble_ll_stats, scan_timer_stopped); - scansm->restart_timer_needed = 1; - OS_EXIT_CRITICAL(sr); - return; - } - - now = os_cputime_get32(); - - inside_window = ble_ll_scan_is_inside_window(scanp, now); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* Update also next PHY if configured */ - if (scanp_next) { - inside_window_next = ble_ll_scan_is_inside_window(scanp_next, now); - - /* - * Switch PHY if current PHY is outside window and next PHY is either - * inside window or has next window earlier than current PHY. - */ - if (!inside_window && - ((inside_window_next || CPUTIME_LEQ(scanp_next->timing.start_time, - scanp->timing.start_time)))) { - scansm->scanp = scanp_next; - scansm->scanp_next = scanp; - scanp = scansm->scanp; - scanp_next = scansm->scanp_next; - inside_window = inside_window_next; - } - } -#endif - - /* - * At this point scanp and scanp_next point to current or closest scan - * window on both PHYs (scanp is the closer one). Make sure RF is enabled - * on time. - */ - ble_ll_rfmgmt_scan_changed(true, scanp->timing.start_time); - - /* - * If we are inside window, next scan proc should happen at the end of - * current window to either disable scan or switch to next PHY. - * If we are outside window, next scan proc should happen at the time of - * closest scan window. - */ - if (inside_window) { - next_proc_time = scanp->timing.start_time + scanp->timing.window; - } else { - next_proc_time = scanp->timing.start_time; - } - - /* - * If we are not in the standby state it means that the scheduled - * scanning event was overlapped in the schedule. In this case all we do - * is post the scan schedule end event. - */ - start_scan = inside_window; - switch (ble_ll_state_get()) { - case BLE_LL_STATE_ADV: - case BLE_LL_STATE_CONNECTION: - case BLE_LL_STATE_SYNC: - start_scan = false; - break; - case BLE_LL_STATE_INITIATING: - /* Must disable PHY since we will move to a new channel */ - ble_phy_disable(); - if (!inside_window) { - ble_ll_state_set(BLE_LL_STATE_STANDBY); - } - /* PHY is disabled - make sure we do not wait for AUX_CONNECT_RSP */ - ble_ll_conn_reset_pending_aux_conn_rsp(); - break; - case BLE_LL_STATE_SCANNING: - /* Must disable PHY since we will move to a new channel */ - ble_phy_disable(); - if (!inside_window) { - ble_ll_state_set(BLE_LL_STATE_STANDBY); - } - break; - case BLE_LL_STATE_STANDBY: - break; - default: - BLE_LL_ASSERT(0); - break; - } - - if (start_scan) { - ble_ll_scan_start(scansm, NULL); - } else { - ble_ll_rfmgmt_release(); - } - - OS_EXIT_CRITICAL(sr); - os_cputime_timer_start(&scansm->scan_timer, next_proc_time); -} - -/** - * ble ll scan rx pdu start - * - * Called when a PDU reception has started and the Link Layer is in the - * scanning state. - * - * Context: Interrupt - * - * @param pdu_type - * @param rxflags - * - * @return int - * 0: we will not attempt to reply to this frame - * 1: we may send a response to this frame. - */ -int -ble_ll_scan_rx_isr_start(uint8_t pdu_type, uint16_t *rxflags) -{ - int rc; - struct ble_ll_scan_sm *scansm; - struct ble_ll_scan_params *scanp; - - rc = 0; - scansm = &g_ble_ll_scan_sm; - scanp = scansm->scanp; - - switch (scanp->scan_type) { - case BLE_SCAN_TYPE_ACTIVE: - /* If adv ind or scan ind, we may send scan request */ - if ((pdu_type == BLE_ADV_PDU_TYPE_ADV_IND) || - (pdu_type == BLE_ADV_PDU_TYPE_ADV_SCAN_IND)) { - rc = 1; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if ((pdu_type == BLE_ADV_PDU_TYPE_ADV_EXT_IND && scansm->ext_scanning)) { - *rxflags |= BLE_MBUF_HDR_F_EXT_ADV; - rc = 1; - } -#endif - - if (scansm->cur_aux_data && !scansm->scan_rsp_pending ) { - STATS_INC(ble_ll_stats, aux_received); - } - - /* - * If this is the first PDU after we sent the scan response (as - * denoted by the scan rsp pending flag), we set a bit in the ble - * header so the link layer can check to see if the scan request - * was successful. We do it this way to let the Link Layer do the - * work for successful scan requests. If failed, we do the work here. - */ - if (scansm->scan_rsp_pending) { - scansm->scan_rsp_pending = 0; - - if (pdu_type == BLE_ADV_PDU_TYPE_SCAN_RSP) { - *rxflags |= BLE_MBUF_HDR_F_SCAN_RSP_RXD; - } else if (pdu_type == BLE_ADV_PDU_TYPE_AUX_SCAN_RSP) { - *rxflags |= BLE_MBUF_HDR_F_SCAN_RSP_RXD; - } else { - ble_ll_scan_req_backoff(scansm, 0); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - ble_ll_aux_scan_rsp_failed(scansm); -#endif - } - } - break; - case BLE_SCAN_TYPE_PASSIVE: -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if ((pdu_type == BLE_ADV_PDU_TYPE_ADV_EXT_IND && scansm->ext_scanning)) { - *rxflags |= BLE_MBUF_HDR_F_EXT_ADV; - } - break; -#endif - default: - break; - } - - return rc; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static uint8_t -ble_ll_ext_adv_phy_mode_to_local_phy(uint8_t adv_phy_mode) -{ - switch (adv_phy_mode) { - case 0x00: - return BLE_PHY_1M; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) - case 0x01: - return BLE_PHY_2M; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - case 0x02: - return BLE_PHY_CODED; -#endif - } - - return 0; -} - -static int -ble_ll_ext_scan_parse_aux_ptr(struct ble_ll_aux_data *aux_data, uint8_t *buf) -{ - uint32_t aux_ptr_field = get_le32(buf) & 0x00FFFFFF; - - aux_data->chan = (aux_ptr_field) & 0x3F; - if (aux_data->chan >= BLE_PHY_NUM_DATA_CHANS) { - return -1; - } - - /* TODO use CA aux_ptr_field >> 6 */ - - aux_data->offset = 30 * ((aux_ptr_field >> 8) & 0x1FFF); - - if ((aux_ptr_field >> 7) & 0x01) { - aux_data->offset *= 10; - aux_data->offset_units = 1; - } - - if (aux_data->offset < BLE_LL_MAFS) { - return -1; - } - - aux_data->aux_phy = - ble_ll_ext_adv_phy_mode_to_local_phy((aux_ptr_field >> 21) & 0x07); - if (aux_data->aux_phy == 0) { - return -1; - } - - return 0; -} - -static void -ble_ll_ext_scan_parse_adv_info(struct ext_adv_report *report, const uint8_t *buf) -{ - uint16_t adv_info = get_le16(buf); - - /* TODO Use DID */ - - report->sid = (adv_info >> 12); -} - -/** - * ble_ll_scan_update_aux_data - * - * Update aux_data stored in ble_hdr.rxinfo.user_data. If no aux_data is present - * (i.e. processing ADV_EXT_IND) this will try to allocate new aux_data. - * - * Context: Interrupt - * - * @param ble_hdr - * @param rxbuf - * - * @return int - * 1: do not scan for next AUX (no AuxPtr or malformed data) - * 0: scan for next AUX (valid AuxPtr found) - * -1: error - */ -int -ble_ll_scan_update_aux_data(struct ble_mbuf_hdr *ble_hdr, uint8_t *rxbuf, - bool *adva_present) -{ - uint8_t pdu_hdr; - uint8_t pdu_len; - uint8_t adv_mode; - uint8_t eh_len; - uint8_t eh_flags; - uint8_t *eh; - struct ble_ll_aux_data *aux_data; - bool is_aux; - - aux_data = ble_hdr->rxinfo.user_data; - /* aux_data is initially not set only for ADV_EXT_IND */ - is_aux = aux_data; - - pdu_hdr = rxbuf[0]; - pdu_len = rxbuf[1]; - - /* PDU without at least Extended Header Length is invalid */ - if (pdu_len == 0) { - return -1; - } - - adv_mode = rxbuf[2] >> 6; - eh_len = rxbuf[2] & 0x3f; - eh_flags = rxbuf[3]; - eh = &rxbuf[4]; - - /* - * PDU without Extended Header is valid in case of last AUX_CHAIN_IND in - * chain so aux_data has to be set and advertising mode has to be 00b, - * otherwise it's an invalid PDU. - */ - if (eh_len == 0) { - if (!aux_data || adv_mode) { - return -1; - } - aux_data->flags_isr |= BLE_LL_AUX_FLAG_SCAN_COMPLETE; - return 1; - } - - /* - * If aux_data is not set, this is ADV_EXT_IND which starts new extended - * advertising event. - */ - if (!aux_data) { - if (ble_ll_scan_ext_adv_init(&aux_data)) { - return -1; - } - - aux_data->aux_primary_phy = ble_hdr->rxinfo.phy; - } else { - if (aux_data->flags_isr & BLE_LL_AUX_FLAG_AUX_ADV_RECEIVED) { - aux_data->flags_isr |= BLE_LL_AUX_FLAG_AUX_CHAIN_RECEIVED; - } else { - aux_data->flags_isr |= BLE_LL_AUX_FLAG_AUX_ADV_RECEIVED; - } - } - - /* Now parse extended header... */ - - if (eh_flags & (1 << BLE_LL_EXT_ADV_ADVA_BIT)) { - aux_data->flags |= BLE_LL_AUX_HAS_ADVA; - memcpy(aux_data->adva, eh, 6); - aux_data->adva_type = !!(pdu_hdr & BLE_ADV_PDU_HDR_TXADD_MASK); - eh += BLE_LL_EXT_ADV_ADVA_SIZE; - - if (adva_present) { - *adva_present = true; - } - } else if (adva_present) { - *adva_present = false; - } - - if (eh_flags & (1 << BLE_LL_EXT_ADV_TARGETA_BIT)) { - aux_data->flags |= BLE_LL_AUX_HAS_TARGETA; - memcpy(aux_data->targeta, eh, 6); - aux_data->targeta_type = !!(pdu_hdr & BLE_ADV_PDU_HDR_RXADD_MASK); - eh += BLE_LL_EXT_ADV_TARGETA_SIZE; - } - - - if (eh_flags & (1 << BLE_LL_EXT_ADV_CTE_INFO_BIT)) { - eh += 1; - } - - if (eh_flags & (1 << BLE_LL_EXT_ADV_DATA_INFO_BIT)) { - aux_data->flags |= BLE_LL_AUX_HAS_ADI; - if (is_aux) { - if (get_le16(eh) != aux_data->adi) { - aux_data->flags_isr |= BLE_LL_AUX_FLAG_SCAN_ERROR; - STATS_INC(ble_ll_stats, aux_chain_err); - } - } else { - aux_data->adi = get_le16(eh); - } - eh += BLE_LL_EXT_ADV_DATA_INFO_SIZE; - } - - if (eh_flags & (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT)) { - if (ble_ll_ext_scan_parse_aux_ptr(aux_data, eh)) { - aux_data->flags_isr |= BLE_LL_AUX_FLAG_SCAN_ERROR; - } - } else if (!(adv_mode & BLE_LL_EXT_ADV_MODE_SCAN)) { - /* No AuxPtr for scannable PDU is ignored since we can still scan it */ - aux_data->flags_isr |= BLE_LL_AUX_FLAG_SCAN_COMPLETE; - } - - ble_hdr->rxinfo.user_data = aux_data; - - /* Do not scan for next AUX if either no AuxPtr or malformed data found */ - return !(eh_flags & (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT)) || - (aux_data->flags_isr & BLE_LL_AUX_FLAG_SCAN_ERROR); -} - -/** - * Called when a receive ADV_EXT PDU has ended. - * - * Context: Interrupt - * - * @return int - * < 0 Error - * >= 0: Success (number of bytes left in PDU) - * - */ -static int -ble_ll_scan_parse_ext_hdr(struct os_mbuf *om, - const uint8_t *adva, uint8_t adva_type, - const uint8_t *inita, uint8_t inita_type, - struct ble_mbuf_hdr *ble_hdr, - struct ext_adv_report *report) -{ - uint8_t pdu_len; - uint8_t ext_hdr_len; - uint8_t ext_hdr_flags; - uint8_t *ext_hdr; - uint8_t *rxbuf = om->om_data; - int i = 1; - struct ble_ll_scan_sm *scansm; - struct ble_ll_aux_data *aux_data = ble_hdr->rxinfo.user_data; - - BLE_LL_ASSERT(report); - - scansm = &g_ble_ll_scan_sm; - - if (!scansm->ext_scanning) { - /* Ignore ext adv if host does not want it*/ - return -1; - } - - pdu_len = rxbuf[1]; - if (pdu_len == 0) { - return -1; - } - - report->evt_type = rxbuf[2] >> 6; - if ( report->evt_type > BLE_LL_EXT_ADV_MODE_SCAN) { - return -1; - } - - if (BLE_MBUF_HDR_SCAN_RSP_RXD(ble_hdr)) { - report->evt_type |= BLE_HCI_ADV_SCAN_RSP_MASK; - } - - ext_hdr_len = rxbuf[2] & 0x3F; - os_mbuf_adj(om, 3); - - ext_hdr_flags = rxbuf[3]; - ext_hdr = &rxbuf[4]; - - if (ext_hdr_len) { - i = 0; - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_ADVA_BIT)) { - i += BLE_LL_EXT_ADV_ADVA_SIZE; - } - - if (adva) { - memcpy(report->addr, adva, 6); - report->addr_type = adva_type; - } - - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_TARGETA_BIT)) { - i += BLE_LL_EXT_ADV_TARGETA_SIZE; - } - - if (inita) { - memcpy(report->dir_addr, inita, 6); - report->dir_addr_type = inita_type; - report->evt_type |= BLE_HCI_ADV_DIRECT_MASK; - } - - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_CTE_INFO_BIT)) { - /* Just skip it for now*/ - i += 1; - } - - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_DATA_INFO_BIT)) { - ble_ll_ext_scan_parse_adv_info(report, (ext_hdr + i)); - i += BLE_LL_EXT_ADV_DATA_INFO_SIZE; - } else if (report->evt_type & BLE_HCI_ADV_SCAN_RSP_MASK) { - report->sid = (aux_data->adi >> 12); - } - - /* In this point of time we don't want to care about aux ptr */ - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT)) { - i += BLE_LL_EXT_ADV_AUX_PTR_SIZE; - } - - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_SYNC_INFO_BIT)) { - report->periodic_itvl = get_le16(ext_hdr + i + 2); - i += BLE_LL_EXT_ADV_SYNC_INFO_SIZE; - } - - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_TX_POWER_BIT)) { - report->tx_power = *(ext_hdr + i); - i += BLE_LL_EXT_ADV_TX_POWER_SIZE; - } - - /* TODO Handle ACAD if needed */ - } - - /* In the event we need information on primary and secondary PHY used during - * advertising. - */ - if (!aux_data) { - report->pri_phy = ble_hdr->rxinfo.phy; - goto done; - } - - report->sec_phy = aux_data->aux_phy; - report->pri_phy = aux_data->aux_primary_phy; - - if (ext_hdr_len) { - /* Adjust mbuf to contain advertising data only */ - os_mbuf_adj(om, ext_hdr_len); - } - - /* Let us first keep update event type in aux data. - * Note that in aux chain and aux scan response packets - * we do miss original event type, which we need for advertising report. - */ - aux_data->evt_type |= report->evt_type; - report->evt_type = aux_data->evt_type; - -done: - return pdu_len - ext_hdr_len - 1; -} - -static int -ble_ll_scan_get_addr_from_ext_adv(uint8_t *rxbuf, struct ble_mbuf_hdr *ble_hdr, - uint8_t **addr, uint8_t *addr_type, - uint8_t **inita, uint8_t *inita_type, - int *ext_mode) -{ - uint8_t pdu_len; - uint8_t ext_hdr_len; - uint8_t ext_hdr_flags; - uint8_t *ext_hdr; - bool has_adva = false; - bool has_inita = false; - int i; - struct ble_ll_aux_data *aux_data = ble_hdr->rxinfo.user_data; - - *addr = NULL; - *inita = NULL; - - pdu_len = rxbuf[1]; - if (pdu_len == 0) { - return -1; - } - - *ext_mode = rxbuf[2] >> 6; - if (*ext_mode > BLE_LL_EXT_ADV_MODE_SCAN) { - return -1; - } - - ext_hdr_len = rxbuf[2] & 0x3F; - if (ext_hdr_len == 0) { - goto done; - } - - ext_hdr_flags = rxbuf[3]; - ext_hdr = &rxbuf[4]; - - i = 0; - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_ADVA_BIT)) { - if (ext_hdr_len < BLE_LL_EXT_ADV_ADVA_SIZE) { - return -1; - } - - *addr = ext_hdr + i; - *addr_type = - ble_ll_get_addr_type(rxbuf[0] & BLE_ADV_PDU_HDR_TXADD_MASK); - i += BLE_LL_EXT_ADV_ADVA_SIZE; - - has_adva = true; - } - - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_TARGETA_BIT)) { - *inita = ext_hdr + i; - *inita_type = - ble_ll_get_addr_type(rxbuf[0] & BLE_ADV_PDU_HDR_RXADD_MASK); - i += BLE_LL_EXT_ADV_TARGETA_SIZE; - - has_inita = true; - } - -done: - /* Check if we had address already. If yes, replace it with new one */ - - if (aux_data) { - /* If address has been provided, we do have it already in aux_data.*/ - if (aux_data->flags & BLE_LL_AUX_HAS_ADVA) { - if (!has_adva) { - *addr = aux_data->adva; - *addr_type = aux_data->adva_type; - } else { - memcpy(aux_data->adva, *addr, 6); - aux_data->adva_type = *addr_type; - } - } - - if (aux_data->flags & BLE_LL_AUX_HAS_TARGETA) { - if (!has_inita) { - *inita = aux_data->targeta; - *inita_type = aux_data->targeta_type; - } else { - memcpy(aux_data->targeta, *inita, 6); - aux_data->targeta_type = *inita_type; - } - } - } - - return 0; -} -#endif - -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 *inita_type, - int *ext_mode) -{ - /* - * XXX this should be only used for legacy advertising, but need to refactor - * code in ble_ll_init first so it does not call this for ext - */ - - if (pdu_type != BLE_ADV_PDU_TYPE_ADV_EXT_IND && - pdu_type != BLE_ADV_PDU_TYPE_AUX_CONNECT_RSP) { - /* Legacy advertising */ - *addr_type = ble_ll_get_addr_type(rxbuf[0] & BLE_ADV_PDU_HDR_TXADD_MASK); - *addr = rxbuf + BLE_LL_PDU_HDR_LEN; - - if (pdu_type != BLE_ADV_PDU_TYPE_ADV_DIRECT_IND) { - *inita = NULL; - *inita_type = 0; - return 0; - } - - *inita = rxbuf + BLE_LL_PDU_HDR_LEN + BLE_DEV_ADDR_LEN; - *inita_type = ble_ll_get_addr_type(rxbuf[0] & BLE_ADV_PDU_HDR_RXADD_MASK); - - return 0; - } - - /* Extended advertising */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - return ble_ll_scan_get_addr_from_ext_adv(rxbuf, ble_hdr, addr, addr_type, - inita, inita_type, ext_mode); -#else - return -1; -#endif - - return 0; -} - -static void -ble_ll_scan_get_addr_data_from_legacy(uint8_t pdu_type, uint8_t *rxbuf, - struct ble_ll_scan_addr_data *addrd) -{ - BLE_LL_ASSERT(pdu_type < BLE_ADV_PDU_TYPE_ADV_EXT_IND); - - addrd->adva_present = true; - - addrd->adva = rxbuf + BLE_LL_PDU_HDR_LEN; - addrd->adva_type = ble_ll_get_addr_type(rxbuf[0] & BLE_ADV_PDU_HDR_TXADD_MASK); - - if (pdu_type == BLE_ADV_PDU_TYPE_ADV_DIRECT_IND) { - addrd->targeta = rxbuf + BLE_LL_PDU_HDR_LEN + BLE_DEV_ADDR_LEN; - addrd->targeta_type = ble_ll_get_addr_type(rxbuf[0] & BLE_ADV_PDU_HDR_RXADD_MASK); - } else { - addrd->targeta = NULL; - addrd->targeta_type = 0; - } -} - -/* - * Matches incoming PDU using scan filter policy and whitelist, if applicable. - * This will also resolve addresses and update flags/fields in header and - * addr_data as needed. - * - * @return 0 = no match - * 1 = match - * 2 = match, but do not scan - */ -static int -ble_ll_scan_rx_filter(struct ble_mbuf_hdr *hdr, struct ble_ll_scan_addr_data *addrd) -{ - struct ble_ll_scan_sm *scansm = &g_ble_ll_scan_sm; - struct ble_ll_scan_params *scanp = scansm->scanp; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - struct ble_ll_aux_data *aux_data = hdr->rxinfo.user_data; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - struct ble_mbuf_hdr_rxinfo *rxinfo = &hdr->rxinfo; - struct ble_ll_resolv_entry *rl = NULL; -#endif - bool scan_req_allowed = true; - int resolved = 0; - - /* Use AdvA as initial advertiser address, we may try to resolve it later */ - addrd->adv_addr = addrd->adva; - addrd->adv_addr_type = addrd->adva_type; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - /* By default, assume AdvA is not resolved */ - rxinfo->rpa_index = -1; - - switch (ble_ll_addr_subtype(addrd->adva, addrd->adva_type)) { - case BLE_LL_ADDR_SUBTYPE_RPA: - /* - * Only resolve if packet actually contained AdvA. - * In extended advertising PDUs we may use RL index from a PDU that - * already had AdvA (e.g. ADV_EXT_IND in case of AUX_ADV_IND without - * AdvA). In legacy advertising PDUs we always need to resolve AdvA. - */ - if (addrd->adva_present) { - rxinfo->rpa_index = ble_hw_resolv_list_match(); - } else { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - BLE_LL_ASSERT(aux_data); - rxinfo->rpa_index = aux_data->rpa_index; -#else - BLE_LL_ASSERT(false); - rxinfo->rpa_index = -1; -#endif - } - - if (rxinfo->rpa_index < 0) { - break; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (aux_data) { - aux_data->rpa_index = rxinfo->rpa_index; - } -#endif - - /* Use resolved identity address as advertiser address */ - rl = &g_ble_ll_resolv_list[rxinfo->rpa_index]; - addrd->adv_addr = rl->rl_identity_addr; - addrd->adv_addr_type = rl->rl_addr_type; - addrd->rl = rl; - - rxinfo->flags |= BLE_MBUF_HDR_F_RESOLVED; - resolved = 1; - break; - case BLE_LL_ADDR_SUBTYPE_IDENTITY: - /* - * If AdvA is an identity address, we need to check if that device was - * added to RL in order to use proper privacy mode. - */ - rl = ble_ll_resolv_list_find(addrd->adva, addrd->adva_type); - if (!rl) { - break; - } - - addrd->rl = rl; - - /* Ignore device if using network privacy mode and it has IRK */ - if ((rl->rl_priv_mode == BLE_HCI_PRIVACY_NETWORK) && rl->rl_has_peer) { - return 0; - } - break; - default: - /* NRPA goes through filtering policy directly */ - break; - } - - if (addrd->targeta) { - switch (ble_ll_addr_subtype(addrd->targeta, addrd->targeta_type)) { - case BLE_LL_ADDR_SUBTYPE_RPA: - /* Check if TargetA can be resolved using the same RL entry as AdvA */ - if (rl && ble_ll_resolv_rpa(addrd->targeta, rl->rl_local_irk)) { - rxinfo->flags |= BLE_MBUF_HDR_F_TARGETA_RESOLVED; - break; - } - - /* Check if scan filter policy allows unresolved RPAs to be processed */ - if (!(scanp->scan_filt_policy & 0x02)) { - return 0; - } - - /* - * We will notify host as requited by scan policy, but make sure we - * do not send scan request since we do not know if this is directed - * to us. - */ - scan_req_allowed = false; - break; - case BLE_LL_ADDR_SUBTYPE_IDENTITY: - /* We shall ignore identity in TargetA if we are using RPA */ - if ((scanp->own_addr_type & 0x02) && rl && rl->rl_has_local) { - return 0; - } - /* Ignore if not directed to us */ - if (!ble_ll_is_our_devaddr(addrd->targeta, addrd->targeta_type)) { - return 0; - } - break; - default: - /* NRPA goes through filtering policy directly */ - break; - } - } -#else - /* Ignore if not directed to us */ - if (addrd->targeta && - !ble_ll_is_our_devaddr(addrd->targeta, addrd->targeta_type)) { - return 0; - } -#endif - - /* Check on WL if required by scan filter policy */ - if (scanp->scan_filt_policy & 0x01) { - if (!ble_ll_whitelist_match(addrd->adv_addr, addrd->adv_addr_type, resolved)) { - return 0; - } - } - - return scan_req_allowed ? 1 : 2; -} - -static int -ble_ll_scan_rx_isr_on_legacy(uint8_t pdu_type, uint8_t *rxbuf, - struct ble_mbuf_hdr *hdr, - struct ble_ll_scan_addr_data *addrd) -{ - struct ble_ll_scan_sm *scansm = &g_ble_ll_scan_sm; - struct ble_ll_scan_params *scanp = scansm->scanp; - struct ble_mbuf_hdr_rxinfo *rxinfo = &hdr->rxinfo; - uint8_t sreq_adva_type; - uint8_t *sreq_adva; - int rc; - - ble_ll_scan_get_addr_data_from_legacy(pdu_type, rxbuf, addrd); - - if (pdu_type == BLE_ADV_PDU_TYPE_SCAN_RSP) { - if (!BLE_MBUF_HDR_SCAN_RSP_RXD(hdr)) { - /* - * We were not expecting scan response so just ignore and do not - * update backoff. - */ - return -1; - } - - sreq_adva_type = !!(scansm->pdu_data.hdr_byte & BLE_ADV_PDU_HDR_RXADD_MASK); - sreq_adva = scansm->pdu_data.adva; - - /* - * Ignore scan response if AdvA does not match AdvA in request and also - * update backoff as if there was no scan response. - */ - if ((addrd->adva_type != sreq_adva_type) || - memcmp(addrd->adva, sreq_adva, BLE_DEV_ADDR_LEN)) { - ble_ll_scan_req_backoff(scansm, 0); - return -1; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - /* - * We are not pushing this one through filters so need to update - * rpa_index here as otherwise pkt_in won't be able to determine - * advertiser address properly. - */ - rxinfo->rpa_index = ble_hw_resolv_list_match(); - if (rxinfo->rpa_index >= 0) { - rxinfo->flags |= BLE_MBUF_HDR_F_RESOLVED; - } -#endif - - rxinfo->flags |= BLE_MBUF_HDR_F_DEVMATCH; - - return 0; - } - - rc = ble_ll_scan_rx_filter(hdr, addrd); - if (!rc) { - return 0; - } - - rxinfo->flags |= BLE_MBUF_HDR_F_DEVMATCH; - - if (rc == 2) { - /* Scan request forbidden by filter policy */ - return 0; - } - - return (scanp->scan_type == BLE_SCAN_TYPE_ACTIVE) && - ((pdu_type == BLE_ADV_PDU_TYPE_ADV_IND) || - (pdu_type == BLE_ADV_PDU_TYPE_ADV_SCAN_IND)); -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static int -ble_ll_scan_rx_isr_on_aux(uint8_t pdu_type, uint8_t *rxbuf, - struct ble_mbuf_hdr *hdr, - struct ble_ll_scan_addr_data *addrd) -{ - struct ble_ll_scan_sm *scansm = &g_ble_ll_scan_sm; - struct ble_ll_scan_params *scanp = scansm->scanp; - struct ble_mbuf_hdr_rxinfo *rxinfo = &hdr->rxinfo; - struct ble_ll_aux_data *aux_data; - int rc; - - if (!scansm->ext_scanning) { - return -1; - } - - rc = ble_ll_scan_update_aux_data(hdr, rxbuf, &addrd->adva_present); - if (rc < 0) { - rxinfo->flags |= BLE_MBUF_HDR_F_AUX_INVALID; - return -1; - } else if (rc == 0) { - rxinfo->flags |= BLE_MBUF_HDR_F_AUX_PTR_WAIT; - } - - /* Now we can update aux_data from header since it may have just been created */ - aux_data = rxinfo->user_data; - - /* - * Restore proper header flags if filtering was already done successfully on - * some previous PDU in an event. - */ - if (aux_data->flags & BLE_LL_AUX_IS_MATCHED) { - rxinfo->flags |= BLE_MBUF_HDR_F_DEVMATCH; - rxinfo->rpa_index = aux_data->rpa_index; - if (rxinfo->rpa_index >= 0) { - rxinfo->flags |= BLE_MBUF_HDR_F_RESOLVED; - } - if (aux_data->flags & BLE_LL_AUX_IS_TARGETA_RESOLVED) { - rxinfo->flags |= BLE_MBUF_HDR_F_TARGETA_RESOLVED; - } - goto done; - } - - if (aux_data->flags & BLE_LL_AUX_HAS_ADVA) { - addrd->adva = aux_data->adva; - addrd->adva_type = aux_data->adva_type; - } else { - /* Accept this PDU and wait for AdvA in aux */ - rxinfo->flags |= BLE_MBUF_HDR_F_DEVMATCH; - return 0; - } - if (aux_data->flags & BLE_LL_AUX_HAS_TARGETA) { - addrd->targeta = aux_data->targeta; - addrd->targeta_type = aux_data->targeta_type; - } else { - addrd->targeta = NULL; - } - - rc = ble_ll_scan_rx_filter(hdr, addrd); - if (!rc) { - return 0; - } - - rxinfo->flags |= BLE_MBUF_HDR_F_DEVMATCH; - - /* - * Once we matched device, there's no need to go through filtering on every - * other PDU in an event so just store info required to restore state for - * subsequent PDUs in aux_data. - */ - aux_data->flags |= BLE_LL_AUX_IS_MATCHED; - if (rxinfo->flags & BLE_MBUF_HDR_F_TARGETA_RESOLVED) { - aux_data->flags |= BLE_LL_AUX_IS_TARGETA_RESOLVED; - /* AdvA state is already stored in rpa_index */ - } - - if (rc == 2) { - /* Scan request forbidden by filter policy */ - return 0; - } - -done: - return (scanp->scan_type == BLE_SCAN_TYPE_ACTIVE) && - ((rxbuf[2] >> 6) == BLE_LL_EXT_ADV_MODE_SCAN); -} -#endif - -static bool -ble_ll_scan_send_scan_req(uint8_t pdu_type, uint8_t *rxbuf, - struct ble_mbuf_hdr *hdr, - struct ble_ll_scan_addr_data *addrd) -{ - struct ble_ll_scan_sm *scansm = &g_ble_ll_scan_sm; - struct ble_mbuf_hdr_rxinfo *rxinfo = &hdr->rxinfo; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - struct ble_ll_aux_data *aux_data = rxinfo->user_data; - uint8_t phy_mode; -#endif - bool is_ext_adv = false; - uint16_t adi = 0; - int rc; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (pdu_type == BLE_ADV_PDU_TYPE_ADV_EXT_IND) { - if (ble_ll_scan_get_adi(aux_data, &adi) < 0) { - return false; - } - is_ext_adv = true; - } -#endif - - /* Check if we already scanned this device successfully */ - if (ble_ll_scan_have_rxd_scan_rsp(addrd->adv_addr, addrd->adv_addr_type, - is_ext_adv, adi)) { - return false; - } - - /* Better not be a scan response pending */ - BLE_LL_ASSERT(scansm->scan_rsp_pending == 0); - - /* We want to send a request. See if backoff allows us */ - if (scansm->backoff_count > 0) { - if (--scansm->backoff_count != 0) { - return false; - } - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - phy_mode = ble_ll_phy_to_phy_mode(rxinfo->phy, BLE_HCI_LE_PHY_CODED_ANY); - if (ble_ll_sched_scan_req_over_aux_ptr(rxinfo->channel, phy_mode)) { - return false; - } -#endif - - /* Use original AdvA in scan request (Core 5.1, Vol 6, Part B, section 6.3) */ - ble_ll_scan_req_pdu_prepare(scansm, addrd->adva, addrd->adva_type, addrd->rl); - - rc = ble_phy_tx(ble_ll_scan_req_tx_pdu_cb, scansm, BLE_PHY_TRANSITION_TX_RX); - if (rc) { - return false; - } - - scansm->scan_rsp_pending = 1; - rxinfo->flags |= BLE_MBUF_HDR_F_SCAN_REQ_TXD; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (rxinfo->channel < BLE_PHY_NUM_DATA_CHANS) { - /* Keep aux_data for expected scan response */ - scansm->cur_aux_data = ble_ll_scan_aux_data_ref(aux_data); - STATS_INC(ble_ll_stats, aux_scan_req_tx); - } -#endif - - return true; -} - -/** - * Called when a receive PDU has ended. - * - * Context: Interrupt - * - * @param rxpdu - * - * @return int - * < 0: Disable the phy after reception. - * == 0: Success. Do not disable the PHY. - * > 0: Do not disable PHY as that has already been done. - */ -int -ble_ll_scan_rx_isr_end(struct os_mbuf *rxpdu, uint8_t crcok) -{ - struct ble_ll_scan_sm *scansm = &g_ble_ll_scan_sm; - struct ble_mbuf_hdr *hdr = BLE_MBUF_HDR_PTR(rxpdu); - struct ble_mbuf_hdr_rxinfo *rxinfo = &hdr->rxinfo; - uint8_t *rxbuf; - uint8_t pdu_type; - struct ble_ll_scan_addr_data addrd; - int rc; - - /* - * If buffer for incoming PDU was not allocated we need to force scan to be - * restarted since LL will not be notified. Keep PHY enabled. - */ - if (rxpdu == NULL) { - ble_ll_scan_interrupted(scansm); - return 0; - } - - rxbuf = rxpdu->om_data; - pdu_type = rxbuf[0] & BLE_ADV_PDU_HDR_TYPE_MASK; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* - * In case aux was expected, copy aux_data for LL to use. Make sure this was - * indeed an aux as otherwise there's no need to process it and just pass to - * LL immediately. - */ - if (scansm->cur_aux_data) { - rxinfo->user_data = scansm->cur_aux_data; - scansm->cur_aux_data = NULL; - if (pdu_type != BLE_ADV_PDU_TYPE_ADV_EXT_IND) { - ble_ll_state_set(BLE_LL_STATE_STANDBY); - return -1; - } - } -#endif - - if (!crcok) { - goto scan_rx_isr_ignore; - } - - /* - * Addresses will be always set in handlers, no need to initialize them. We - * only need to initialize rl which may not be always set, depending on how - * filtering goes. - */ - addrd.rl = NULL; - - switch (pdu_type) { - case BLE_ADV_PDU_TYPE_ADV_IND: - case BLE_ADV_PDU_TYPE_ADV_DIRECT_IND: - case BLE_ADV_PDU_TYPE_ADV_NONCONN_IND: - case BLE_ADV_PDU_TYPE_SCAN_RSP: - case BLE_ADV_PDU_TYPE_ADV_SCAN_IND: - rc = ble_ll_scan_rx_isr_on_legacy(pdu_type, rxbuf, hdr, &addrd); - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - case BLE_ADV_PDU_TYPE_ADV_EXT_IND: - rc = ble_ll_scan_rx_isr_on_aux(pdu_type, rxbuf, hdr, &addrd); - break; -#endif - default: - /* This is not something we would like to process here */ - rc = -1; - break; - } - - if (rc == -1) { - goto scan_rx_isr_ignore; - } else if (rc == 1) { - if (ble_ll_scan_send_scan_req(pdu_type, rxbuf, hdr, &addrd)) { - /* Keep PHY active and LL in scanning state */ - return 0; - } - } - - /* We are done with this PDU so go to standby and let LL resume if needed */ - ble_ll_state_set(BLE_LL_STATE_STANDBY); - return -1; - -scan_rx_isr_ignore: - rxinfo->flags |= BLE_MBUF_HDR_F_IGNORED; - ble_ll_state_set(BLE_LL_STATE_STANDBY); - return -1; -} - -/** - * Called to resume scanning. This is called after an advertising event or - * connection event has ended. It is also called if we receive a packet while - * in the initiating or scanning state. - * - * If periodic advertising is enabled this is also called on sync event end - * or sync packet received if chaining - * - * Context: Link Layer task - */ -void -ble_ll_scan_chk_resume(void) -{ - os_sr_t sr; - struct ble_ll_scan_sm *scansm; - uint32_t now; - - scansm = &g_ble_ll_scan_sm; - if (scansm->scan_enabled) { - OS_ENTER_CRITICAL(sr); - if (scansm->restart_timer_needed) { - scansm->restart_timer_needed = 0; - ble_ll_event_send(&scansm->scan_sched_ev); - STATS_INC(ble_ll_stats, scan_timer_restarted); - OS_EXIT_CRITICAL(sr); - return; - } - - now = os_cputime_get32(); - if (ble_ll_state_get() == BLE_LL_STATE_STANDBY && - ble_ll_scan_is_inside_window(scansm->scanp, now)) { - /* Turn on the receiver and set state */ - ble_ll_scan_start(scansm, NULL); - } - OS_EXIT_CRITICAL(sr); - } -} - -/** - * Scan timer callback; means that the scan window timeout has been reached - * and we should perform the appropriate actions. - * - * Context: Interrupt (cputimer) - * - * @param arg Pointer to scan state machine. - */ -void -ble_ll_scan_timer_cb(void *arg) -{ - struct ble_ll_scan_sm *scansm; - - scansm = (struct ble_ll_scan_sm *)arg; - ble_ll_event_send(&scansm->scan_sched_ev); -} - -void -ble_ll_scan_interrupted(struct ble_ll_scan_sm *scansm) -{ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - ble_npl_event_set_arg(&scansm->scan_interrupted_ev, scansm->cur_aux_data); - scansm->cur_aux_data = NULL; -#endif - - ble_ll_event_send(&scansm->scan_interrupted_ev); -} - -/** - * Called when the wait for response timer expires while in the scanning - * state. - * - * Context: Interrupt. - */ -void -ble_ll_scan_wfr_timer_exp(void) -{ - struct ble_ll_scan_sm *scansm; - uint8_t chan; - int phy; - int rc; -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - uint8_t phy_mode; -#endif - uint32_t now; - - scansm = &g_ble_ll_scan_sm; - - /* Update backoff if we failed to receive scan response */ - if (scansm->scan_rsp_pending) { - scansm->scan_rsp_pending = 0; - ble_ll_scan_req_backoff(scansm, 0); - } - - if (scansm->cur_aux_data) { - /* We actually care about interrupted scan only for EXT ADV because only - * then we might consider to send truncated event to the host. - */ - ble_ll_scan_interrupted(scansm); - - /* Need to disable phy since we are going to move to BLE_LL_STATE_STANDBY - * or we will need to change channel to primary one - */ - ble_phy_disable(); - - now = os_cputime_get32(); - if (!ble_ll_scan_is_inside_window(scansm->scanp, now)) { - /* Outside the window scan */ - ble_ll_state_set(BLE_LL_STATE_STANDBY); - return; - } - - ble_ll_get_chan_to_scan(scansm, &chan, &phy); -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - phy_mode = ble_ll_phy_to_phy_mode(phy, BLE_HCI_LE_PHY_CODED_ANY); - ble_phy_mode_set(phy_mode, phy_mode); -#endif - rc = ble_phy_setchan(chan, BLE_ACCESS_ADDR_ADV, BLE_LL_CRCINIT_ADV); - BLE_LL_ASSERT(rc == 0); - } - - - ble_phy_restart_rx(); -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -/* - * Send extended advertising report - * - * @return -1 on error (data truncated or other error) - * 0 on success (data status is "completed") - * 1 on success (data status is not "completed") - */ -static int -ble_ll_hci_send_ext_adv_report(uint8_t ptype, uint8_t *adva, uint8_t adva_type, - uint8_t *inita, uint8_t inita_type, - struct os_mbuf *om, - struct ble_mbuf_hdr *hdr) -{ - struct ble_ll_aux_data *aux_data = hdr->rxinfo.user_data; - struct ble_hci_ev_le_subev_ext_adv_rpt *ev; - struct ext_adv_report *report; - struct ble_hci_ev *hci_ev; - struct ble_hci_ev *hci_ev_next; - int offset; - int datalen; - int rc; - bool need_event; - bool is_scannable_aux; - uint8_t max_data_len; - - if (!ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_EXT_ADV_RPT)) { - rc = -1; - goto done; - } - - /* - * We keep one allocated event in aux_data to be able to truncate chain - * properly in case of error. If there is no event in aux_data it means this - * is the first event for this chain. - */ - if (aux_data && aux_data->evt) { - hci_ev = aux_data->evt; - aux_data->evt = NULL; - - hci_ev->length = sizeof(*ev) + sizeof(*report); - } else { - hci_ev = ble_ll_scan_get_ext_adv_report(NULL); - if (!hci_ev) { - rc = -1; - goto done; - } - } - - ev = (void *) hci_ev->data; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - /* If RPA has been used, make sure we use correct address types - * in the advertising report. - */ - if (BLE_MBUF_HDR_RESOLVED(hdr)) { - adva_type += 2; - } - if (BLE_MBUF_HDR_TARGETA_RESOLVED(hdr)) { - inita_type += 2; - } -#endif - - datalen = ble_ll_scan_parse_ext_hdr(om, adva, adva_type, inita, inita_type, - hdr, ev->reports); - if (datalen < 0) { - rc = -1; - - /* Need to send truncated event if we already sent some reports */ - if (aux_data && (aux_data->flags_ll & BLE_LL_AUX_FLAG_HCI_SENT_ANY)) { - BLE_LL_ASSERT(!(aux_data->flags_ll & BLE_LL_AUX_FLAG_HCI_SENT_COMPLETED)); - BLE_LL_ASSERT(!(aux_data->flags_ll & BLE_LL_AUX_FLAG_HCI_SENT_TRUNCATED)); - - aux_data->flags_ll |= BLE_LL_AUX_FLAG_SCAN_ERROR; - aux_data->flags_ll |= BLE_LL_AUX_FLAG_HCI_SENT_TRUNCATED; - - report = ev->reports; - report->data_len = 0; - report->evt_type |= BLE_HCI_ADV_DATA_STATUS_TRUNCATED; - - ble_ll_hci_event_send(hci_ev); - goto done; - } - - ble_hci_trans_buf_free((uint8_t *)hci_ev); - goto done; - } - - is_scannable_aux = aux_data && - (aux_data->evt_type & BLE_HCI_ADV_SCAN_MASK) && - !(aux_data->evt_type & BLE_HCI_ADV_SCAN_RSP_MASK); - - max_data_len = BLE_LL_MAX_EVT_LEN - sizeof(*hci_ev) - sizeof(*ev) - sizeof(*report); - offset = 0; - - do { - hci_ev_next = NULL; - - ev = (void *) hci_ev->data; - report = ev->reports; - - report->data_len = min(max_data_len, datalen - offset); - - /* adjust event length */ - hci_ev->length += report->data_len; - report->rssi = hdr->rxinfo.rssi; - - os_mbuf_copydata(om, offset, report->data_len, report->data); - offset += report->data_len; - - /* - * We need another event if either there are still some data left to - * send in current PDU or scan is not completed. The only exception is - * when this is a scannable event which is not a scan response. - */ - need_event = ((offset < datalen) || (aux_data && !(aux_data->flags_ll & BLE_LL_AUX_FLAG_SCAN_COMPLETE))) && !is_scannable_aux; - - if (need_event) { - /* - * We will need another event so let's try to allocate one now. If - * we cannot do this, need to mark event as truncated. - */ - hci_ev_next = ble_ll_scan_get_ext_adv_report(report); - - if (hci_ev_next) { - report->evt_type |= BLE_HCI_ADV_DATA_STATUS_INCOMPLETE; - rc = 1; - } else { - report->evt_type |= BLE_HCI_ADV_DATA_STATUS_TRUNCATED; - rc = -1; - } - } else if (aux_data && (aux_data->flags_ll & BLE_LL_AUX_FLAG_SCAN_ERROR)) { - report->evt_type |= BLE_HCI_ADV_DATA_STATUS_TRUNCATED; - rc = -1; - } else { - rc = 0; - } - - if ((rc == -1) && aux_data) { - aux_data->flags_ll |= BLE_LL_AUX_FLAG_SCAN_ERROR; - - if (!(aux_data->flags_ll & BLE_LL_AUX_FLAG_HCI_SENT_ANY)) { - ble_hci_trans_buf_free((uint8_t *)hci_ev); - goto done; - } - - aux_data->flags_ll |= BLE_LL_AUX_FLAG_HCI_SENT_TRUNCATED; - } else if (!is_scannable_aux) { - /* - * We do not set 'sent' flags for scannable AUX since we only care - * about scan response that will come next. - */ - aux_data->flags_ll |= BLE_LL_AUX_FLAG_HCI_SENT_ANY; - if (rc == 0) { - aux_data->flags_ll |= BLE_LL_AUX_FLAG_HCI_SENT_COMPLETED; - } - } - - ble_ll_hci_event_send(hci_ev); - - hci_ev = hci_ev_next; - } while ((offset < datalen) && hci_ev); - - BLE_LL_ASSERT(offset <= datalen); - - if (aux_data) { - /* Store any event left for later use */ - aux_data->evt = hci_ev; - } else { - /* If it is empty beacon, evt shall be NULL */ - BLE_LL_ASSERT(!hci_ev); - } - -done: - if (!aux_data) { - return rc; - } - - if (rc == 0) { - if (aux_data->evt_type & BLE_HCI_ADV_SCAN_RSP_MASK) { - /* Complete scan response can be added to duplicates list */ - ble_ll_scan_add_scan_rsp_adv(aux_data->adva, aux_data->adva_type, - 1, aux_data->adi); - } else if (is_scannable_aux) { - /* - * Scannable AUX is marked as incomplete because we do not want to - * add this to duplicates list now, this should happen only after - * we receive complete scan response. The drawback here is that we - * will keep receiving reports for scannable PDUs until complete - * scan response is received. - * - * XXX ^^ extend duplicates list to fix - */ - rc = 1; - } - } else if (rc < 0) { - aux_data->flags_ll |= BLE_LL_AUX_FLAG_SCAN_ERROR; - } - - return rc; -} -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) -static void -ble_ll_scan_check_periodic_sync(const struct os_mbuf *om, struct ble_mbuf_hdr *rxhdr, - uint8_t *adva, uint8_t adva_type, int rpa_index) -{ - uint8_t pdu_len; - uint8_t ext_hdr_len; - uint8_t ext_hdr_flags; - uint8_t *ext_hdr; - uint8_t *rxbuf = om->om_data; - uint8_t sid; - int i; - - pdu_len = rxbuf[1]; - if (pdu_len == 0) { - return; - } - - ext_hdr_len = rxbuf[2] & 0x3F; - - if (ext_hdr_len) { - ext_hdr_flags = rxbuf[3]; - ext_hdr = &rxbuf[4]; - i = 0; - - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_ADVA_BIT)) { - i += BLE_LL_EXT_ADV_ADVA_SIZE; - } - - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_TARGETA_BIT)) { - i += BLE_LL_EXT_ADV_TARGETA_SIZE; - } - - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_CTE_INFO_BIT)) { - i += 1; - } - - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_DATA_INFO_BIT)) { - sid = (get_le16(ext_hdr + i) >> 12); - i += BLE_LL_EXT_ADV_DATA_INFO_SIZE; - } else { - /* ADI is mandatory */ - return; - } - - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT)) { - i += BLE_LL_EXT_ADV_AUX_PTR_SIZE; - } - - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_SYNC_INFO_BIT)) { - ble_ll_sync_info_event(adva, adva_type, rpa_index, sid, rxhdr, - ext_hdr + i); - } - } -} -#endif - -static inline void -ble_ll_scan_dup_move_to_head(struct ble_ll_scan_dup_entry *e) -{ - if (e != TAILQ_FIRST(&g_scan_dup_list)) { - TAILQ_REMOVE(&g_scan_dup_list, e, link); - TAILQ_INSERT_HEAD(&g_scan_dup_list, e, link); - } -} - -static inline struct ble_ll_scan_dup_entry * -ble_ll_scan_dup_new(void) -{ - struct ble_ll_scan_dup_entry *e; - - e = os_memblock_get(&g_scan_dup_pool); - if (!e) { - e = TAILQ_LAST(&g_scan_dup_list, ble_ll_scan_dup_list); - TAILQ_REMOVE(&g_scan_dup_list, e, link); - } - - memset(e, 0, sizeof(*e)); - - return e; -} - -static int -ble_ll_scan_dup_check_legacy(uint8_t addr_type, uint8_t *addr, uint8_t pdu_type) -{ - struct ble_ll_scan_dup_entry *e; - uint8_t type; - int rc; - - type = BLE_LL_SCAN_ENTRY_TYPE_LEGACY(addr_type); - - TAILQ_FOREACH(e, &g_scan_dup_list, link) { - if ((e->type == type) && !memcmp(e->addr, addr, 6)) { - break; - } - } - - if (e) { - if (pdu_type == BLE_ADV_PDU_TYPE_ADV_DIRECT_IND) { - rc = e->flags & BLE_LL_SCAN_DUP_F_DIR_ADV_REPORT_SENT; - } else if (pdu_type == BLE_ADV_PDU_TYPE_SCAN_RSP) { - rc = e->flags & BLE_LL_SCAN_DUP_F_SCAN_RSP_SENT; - } else { - rc = e->flags & BLE_LL_SCAN_DUP_F_ADV_REPORT_SENT; - } - - ble_ll_scan_dup_move_to_head(e); - } else { - rc = 0; - - e = ble_ll_scan_dup_new(); - e->flags = 0; - e->type = type; - memcpy(e->addr, addr, 6); - - TAILQ_INSERT_HEAD(&g_scan_dup_list, e, link); - } - - return rc; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static int -ble_ll_scan_dup_check_ext(uint8_t addr_type, uint8_t *addr, - struct ble_ll_aux_data *aux_data) -{ - struct ble_ll_scan_dup_entry *e; - bool has_aux; - bool is_anon; - uint16_t adi; - uint8_t type; - int rc; - - has_aux = aux_data != NULL; - is_anon = addr == NULL; - adi = has_aux ? aux_data->adi : 0; - - type = BLE_LL_SCAN_ENTRY_TYPE_EXT(addr_type, has_aux, is_anon, adi); - - TAILQ_FOREACH(e, &g_scan_dup_list, link) { - if ((e->type == type) && - (is_anon || !memcmp(e->addr, addr, BLE_DEV_ADDR_LEN))) { - break; - } - } - - if (e) { - if (e->adi != adi) { - rc = 0; - - e->flags = 0; - e->adi = adi; - } else { - rc = e->flags & BLE_LL_SCAN_DUP_F_ADV_REPORT_SENT; - } - - ble_ll_scan_dup_move_to_head(e); - } else { - rc = 0; - - e = ble_ll_scan_dup_new(); - e->flags = 0; - e->type = type; - e->adi = adi; - if (!is_anon) { - memcpy(e->addr, addr, 6); - } - - TAILQ_INSERT_HEAD(&g_scan_dup_list, e, link); - } - - return rc; -} - -static int -ble_ll_scan_dup_update_ext(uint8_t addr_type, uint8_t *addr, - struct ble_ll_aux_data *aux_data) -{ - struct ble_ll_scan_dup_entry *e; - bool has_aux; - bool is_anon; - uint16_t adi; - uint8_t type; - - has_aux = aux_data != NULL; - is_anon = addr == NULL; - adi = has_aux ? aux_data->adi : 0; - - type = BLE_LL_SCAN_ENTRY_TYPE_EXT(addr_type, has_aux, is_anon, adi); - - /* - * We assume ble_ll_scan_dup_check() was called before which either matched - * some entry or allocated new one and placed in on the top of queue. - */ - - e = TAILQ_FIRST(&g_scan_dup_list); - BLE_LL_ASSERT(e && e->type == type && (is_anon || !memcmp(e->addr, addr, 6))); - - e->flags |= BLE_LL_SCAN_DUP_F_ADV_REPORT_SENT; - - return 0; -} -#endif - -static void -ble_ll_scan_rx_pkt_in_restore_addr_data(struct ble_mbuf_hdr *hdr, - struct ble_ll_scan_addr_data *addrd) -{ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - struct ble_ll_scan_sm *scansm = &g_ble_ll_scan_sm; - struct ble_mbuf_hdr_rxinfo *rxinfo = &hdr->rxinfo; - struct ble_ll_resolv_entry *rl; -#endif - - addrd->adv_addr = addrd->adva; - addrd->adv_addr_type = addrd->adva_type; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - if (rxinfo->rpa_index >= 0) { - rl = &g_ble_ll_resolv_list[rxinfo->rpa_index]; - addrd->adv_addr = rl->rl_identity_addr; - addrd->adv_addr_type = rl->rl_addr_type; - addrd->rl = rl; - } - if (hdr->rxinfo.flags & BLE_MBUF_HDR_F_TARGETA_RESOLVED) { - addrd->targeta = ble_ll_get_our_devaddr(scansm->own_addr_type & 1); - addrd->targeta_type = scansm->own_addr_type & 1; - } -#endif -} - -static void -ble_ll_scan_rx_pkt_in_on_legacy(uint8_t pdu_type, struct os_mbuf *om, - struct ble_mbuf_hdr *hdr, - struct ble_ll_scan_addr_data *addrd) -{ - struct ble_ll_scan_sm *scansm = &g_ble_ll_scan_sm; - uint8_t *rxbuf = om->om_data; - bool send_hci_report; - - - if (!BLE_MBUF_HDR_DEVMATCH(hdr) || - !BLE_MBUF_HDR_CRC_OK(hdr) || - BLE_MBUF_HDR_IGNORED(hdr)) { - return; - } - - ble_ll_scan_get_addr_data_from_legacy(pdu_type, rxbuf, addrd); - ble_ll_scan_rx_pkt_in_restore_addr_data(hdr, addrd); - - send_hci_report = !scansm->scan_filt_dups || - !ble_ll_scan_dup_check_legacy(addrd->adv_addr_type, - addrd->adv_addr, - pdu_type); - if (send_hci_report) { - /* Sending advertising report will also update scan_dup list */ - ble_ll_scan_send_adv_report(pdu_type, - addrd->adv_addr, addrd->adv_addr_type, - addrd->targeta, addrd->targeta_type, - om, hdr, scansm); - } - - if (BLE_MBUF_HDR_SCAN_RSP_RXD(hdr)) { - ble_ll_scan_req_backoff(scansm, 1); - } -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static void -ble_ll_scan_rx_pkt_in_on_aux(uint8_t pdu_type, struct os_mbuf *om, - struct ble_mbuf_hdr *hdr, - struct ble_ll_scan_addr_data *addrd) -{ - struct ble_ll_scan_sm *scansm = &g_ble_ll_scan_sm; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - uint8_t *rxbuf = om->om_data; -#endif - struct ble_mbuf_hdr_rxinfo *rxinfo = &hdr->rxinfo; - struct ble_ll_aux_data *aux_data = rxinfo->user_data; - bool send_hci_report; - int rc; - - if (!scansm->ext_scanning) { - goto scan_continue; - } - - if (aux_data) { - aux_data->flags_ll |= aux_data->flags_isr; - } - - /* - * For every new extended advertising event scanned, rx_isr_end will either - * allocate new aux_data or set 'invalid' flag. This means if no 'invalid' - * flag is set, aux_data is always valid. - */ - - /* Drop on scan error or if we received not what we expected to receive */ - if (!BLE_MBUF_HDR_CRC_OK(hdr) || - BLE_MBUF_HDR_IGNORED(hdr) || - BLE_MBUF_HDR_AUX_INVALID(hdr) || - (aux_data->flags_ll & BLE_LL_AUX_FLAG_SCAN_ERROR) || - (pdu_type != BLE_ADV_PDU_TYPE_ADV_EXT_IND)) { - if (aux_data) { - ble_ll_scan_end_adv_evt(aux_data); - ble_ll_scan_aux_data_unref(aux_data); - rxinfo->user_data = NULL; - } - return; - } - - BLE_LL_ASSERT(aux_data); - - if (aux_data->flags & BLE_LL_AUX_HAS_ADVA) { - addrd->adva = aux_data->adva; - addrd->adva_type = aux_data->adva_type; - } else { - addrd->adva = NULL; - addrd->adva_type = 0; - } - if (aux_data->flags & BLE_LL_AUX_HAS_TARGETA) { - addrd->targeta = aux_data->targeta; - addrd->targeta_type = aux_data->targeta_type; - } else { - addrd->targeta = NULL; - addrd->targeta_type = 0; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - /* - * Periodic scan uses own filter list so we need to let it do own filtering - * regardless of scanner filtering. Just make sure we already have AdvA. - */ - if (ble_ll_sync_enabled() && - ((rxbuf[2] >> 6) == BLE_LL_EXT_ADV_MODE_NON_CONN) && addrd->adva && - !(aux_data->flags_ll & BLE_LL_AUX_FLAG_AUX_CHAIN_RECEIVED)) { - ble_ll_scan_check_periodic_sync(om, hdr, addrd->adva, addrd->adva_type, - rxinfo->rpa_index); - } -#endif - - /* Ignore if device was not matched by either whitelist or scan policy */ - if (!BLE_MBUF_HDR_DEVMATCH(hdr)) { - goto scan_continue; - } - - ble_ll_scan_rx_pkt_in_restore_addr_data(hdr, addrd); - - /* - * If there is AuxPtr in this PDU, we should first try to schedule scan for - * subsequent aux. - */ - if (BLE_MBUF_HDR_WAIT_AUX(hdr)) { - if (ble_ll_sched_aux_scan(hdr, scansm, aux_data)) { - rxinfo->flags &= ~BLE_MBUF_HDR_F_AUX_PTR_WAIT; - aux_data->flags_ll |= BLE_LL_AUX_FLAG_SCAN_ERROR; - - /* Silently ignore if no HCI event was sent to host */ - if (!(aux_data->flags_ll & BLE_LL_AUX_FLAG_HCI_SENT_ANY)) { - goto scan_continue; - } - } - - /* Ignore if this was just ADV_EXT_IND with AuxPtr, will process aux */ - if (!(aux_data->flags_ll & BLE_LL_AUX_FLAG_AUX_ADV_RECEIVED)) { - goto scan_continue; - } - - STATS_INC(ble_ll_stats, aux_chain_cnt); - } - - send_hci_report = !scansm->scan_filt_dups || - !ble_ll_scan_dup_check_ext(addrd->adv_addr_type, - addrd->adv_addr, aux_data); - if (send_hci_report) { - rc = ble_ll_hci_send_ext_adv_report(pdu_type, - addrd->adv_addr, addrd->adv_addr_type, - addrd->targeta, addrd->targeta_type, - om, hdr); - if ((rc < 0) && BLE_MBUF_HDR_WAIT_AUX(hdr)) { - /* Data were truncated so stop scanning for subsequent auxes */ - aux_data->flags_ll |= BLE_LL_AUX_FLAG_SCAN_ERROR; - - if (ble_ll_sched_rmv_elem(&aux_data->sch) == 0) { - ble_ll_scan_aux_data_unref(aux_data->sch.cb_arg); - aux_data->sch.cb_arg = NULL; - } - } else if ((rc == 0) && scansm->scan_filt_dups) { - /* Complete data were send so we can update scan_dup list */ - ble_ll_scan_dup_update_ext(addrd->adv_addr_type, addrd->adv_addr, - aux_data); - } - } - - if (BLE_MBUF_HDR_SCAN_RSP_RXD(hdr)) { - /* - * For now assume success if we just received direct scan response, - * don't care about complete aux chain. - */ - ble_ll_scan_req_backoff(scansm, 1); - } - -scan_continue: - ble_ll_scan_aux_data_unref(rxinfo->user_data); - rxinfo->user_data = NULL; -} -#endif - -/** - * Process a received PDU while in the scanning state. - * - * Context: Link Layer task. - * - * @param pdu_type - * @param rxbuf - */ -void -ble_ll_scan_rx_pkt_in(uint8_t ptype, struct os_mbuf *om, struct ble_mbuf_hdr *hdr) -{ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - struct ble_mbuf_hdr_rxinfo *rxinfo = &hdr->rxinfo; - struct ble_ll_aux_data *aux_data = rxinfo->user_data; -#endif - struct ble_ll_scan_addr_data addrd; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (aux_data || (ptype == BLE_ADV_PDU_TYPE_ADV_EXT_IND)) { - ble_ll_scan_rx_pkt_in_on_aux(ptype, om, hdr, &addrd); - ble_ll_scan_chk_resume(); - return; - } -#endif - - ble_ll_scan_rx_pkt_in_on_legacy(ptype, om, hdr, &addrd); - ble_ll_scan_chk_resume(); -} - -int -ble_ll_scan_set_scan_params(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_scan_params_cp *cmd = (const void *)cmdbuf; - uint16_t scan_itvl; - uint16_t scan_window; - struct ble_ll_scan_sm *scansm; - struct ble_ll_scan_params *scanp; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* If already enabled, we return an error */ - scansm = &g_ble_ll_scan_sm; - if (scansm->scan_enabled) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* Get the scan interval and window */ - scan_itvl = le16toh(cmd->scan_itvl); - scan_window = le16toh(cmd->scan_window); - - /* Check scan type */ - if ((cmd->scan_type != BLE_HCI_SCAN_TYPE_PASSIVE) && - (cmd->scan_type != BLE_HCI_SCAN_TYPE_ACTIVE)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Check interval and window */ - if ((scan_itvl < BLE_HCI_SCAN_ITVL_MIN) || - (scan_itvl > BLE_HCI_SCAN_ITVL_MAX) || - (scan_window < BLE_HCI_SCAN_WINDOW_MIN) || - (scan_window > BLE_HCI_SCAN_WINDOW_MAX) || - (scan_itvl < scan_window)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Check own addr type */ - if (cmd->own_addr_type > BLE_HCI_ADV_OWN_ADDR_MAX) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Check scanner filter policy */ - if (cmd->filter_policy > BLE_HCI_SCAN_FILT_MAX) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Store scan parameters */ - scanp = &g_ble_ll_scan_params[PHY_UNCODED]; - scanp->configured = 1; - scanp->scan_type = cmd->scan_type; - scanp->timing.interval = ble_ll_scan_time_hci_to_ticks(scan_itvl); - scanp->timing.window = ble_ll_scan_time_hci_to_ticks(scan_window); - scanp->scan_filt_policy = cmd->filter_policy; - scanp->own_addr_type = cmd->own_addr_type; - -#if (BLE_LL_SCAN_PHY_NUMBER == 2) - g_ble_ll_scan_params[PHY_CODED].configured = 0; -#endif - - return 0; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static int -ble_ll_check_scan_params(uint8_t type, uint16_t itvl, uint16_t window) -{ - /* Check scan type */ - if ((type != BLE_HCI_SCAN_TYPE_PASSIVE) && - (type != BLE_HCI_SCAN_TYPE_ACTIVE)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Check interval and window */ - if ((itvl < BLE_HCI_SCAN_ITVL_MIN) || - (itvl > BLE_HCI_SCAN_ITVL_MAX) || - (window < BLE_HCI_SCAN_WINDOW_MIN) || - (window > BLE_HCI_SCAN_WINDOW_MAX) || - (itvl < window)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - return 0; -} - -int -ble_ll_set_ext_scan_params(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_ext_scan_params_cp *cmd = (const void *) cmdbuf; - const struct scan_params *params = cmd->scans; - - struct ble_ll_scan_params new_params[BLE_LL_SCAN_PHY_NUMBER] = { }; - struct ble_ll_scan_params *uncoded = &new_params[PHY_UNCODED]; - struct ble_ll_scan_params *coded = &new_params[PHY_CODED]; - uint16_t interval; - uint16_t window; - int rc; - - if (len <= sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - len -= sizeof(*cmd); - - /* If already enabled, we return an error */ - if (g_ble_ll_scan_sm.scan_enabled) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* Check own addr type */ - if (cmd->own_addr_type > BLE_HCI_ADV_OWN_ADDR_MAX) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - coded->own_addr_type = cmd->own_addr_type; - uncoded->own_addr_type = cmd->own_addr_type; - - /* Check scanner filter policy */ - if (cmd->filter_policy > BLE_HCI_SCAN_FILT_MAX) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - coded->scan_filt_policy = cmd->filter_policy; - uncoded->scan_filt_policy = cmd->filter_policy; - - /* Check if no reserved bits in PHYS are set and that at least one valid PHY - * is set. - */ - if (!(cmd->phys & SCAN_VALID_PHY_MASK) || - (cmd->phys & ~SCAN_VALID_PHY_MASK)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (cmd->phys & BLE_HCI_LE_PHY_1M_PREF_MASK) { - if (len < sizeof(*params)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - interval = le16toh(params->itvl); - window = le16toh(params->window); - - rc = ble_ll_check_scan_params(params->type, interval, window); - if (rc) { - return rc; - } - - uncoded->scan_type = params->type; - uncoded->timing.interval = ble_ll_scan_time_hci_to_ticks(interval); - uncoded->timing.window = ble_ll_scan_time_hci_to_ticks(window); - - /* That means user wants to use this PHY for scanning */ - uncoded->configured = 1; - params++; - len -= sizeof(*params); - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - if (cmd->phys & BLE_HCI_LE_PHY_CODED_PREF_MASK) { - if (len < sizeof(*params)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - interval = le16toh(params->itvl); - window = le16toh(params->window); - - rc = ble_ll_check_scan_params(params->type, interval, window); - if (rc) { - return rc; - } - - coded->scan_type = params->type; - coded->timing.interval = ble_ll_scan_time_hci_to_ticks(interval); - coded->timing.window = ble_ll_scan_time_hci_to_ticks(window); - - /* That means user wants to use this PHY for scanning */ - coded->configured = 1; - } -#endif - - /* if any of PHYs is configured for continuous scan we alter interval to - * fit other PHY - */ - if (coded->configured && uncoded->configured) { - if (coded->timing.interval == coded->timing.window) { - coded->timing.interval += uncoded->timing.window; - } - - if (uncoded->timing.interval == uncoded->timing.window) { - uncoded->timing.window += coded->timing.window; - } - } - - memcpy(g_ble_ll_scan_params, new_params, sizeof(new_params)); - - return 0; -} - -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -static void -ble_ll_scan_duration_period_timers_restart(struct ble_ll_scan_sm *scansm) -{ - uint32_t now; - - now = os_cputime_get32(); - - os_cputime_timer_stop(&scansm->duration_timer); - os_cputime_timer_stop(&scansm->period_timer); - - if (scansm->duration_ticks) { - os_cputime_timer_start(&scansm->duration_timer, - now + scansm->duration_ticks); - - if (scansm->period_ticks) { - os_cputime_timer_start(&scansm->period_timer, - now + scansm->period_ticks); - } - } -} - -static void -ble_ll_scan_duration_timer_cb(void *arg) -{ - struct ble_ll_scan_sm *scansm; - - scansm = (struct ble_ll_scan_sm *)arg; - - ble_ll_scan_sm_stop(2); - - /* if period is set both timers get started from period cb */ - if (!scansm->period_ticks) { - ble_ll_hci_ev_send_scan_timeout(); - } -} - -static void -ble_ll_scan_period_timer_cb(void *arg) -{ - struct ble_ll_scan_sm *scansm = arg; - - ble_ll_scan_sm_start(scansm); - - /* always start timer regardless of ble_ll_scan_sm_start result - * if it failed will restart in next period - */ - ble_ll_scan_duration_period_timers_restart(scansm); -} -#endif - -/** - * ble ll scan set enable - * - * HCI scan set enable command processing function - * - * Context: Link Layer task (HCI Command parser). - * - * @return int BLE error code. - */ -static int -ble_ll_scan_set_enable(uint8_t enable, uint8_t filter_dups, uint16_t period, - uint16_t dur, bool ext) -{ - int rc; - struct ble_ll_scan_sm *scansm; - struct ble_ll_scan_params *scanp; - struct ble_ll_scan_params *scanp_phy; - int i; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - uint32_t period_ticks = 0; - uint32_t dur_ticks = 0; -#endif - - /* Check for valid parameters */ - if ((filter_dups > 1) || (enable > 1)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - scansm = &g_ble_ll_scan_sm; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* we can do that here since value will never change until reset */ - scansm->ext_scanning = ext; - - if (ext) { - /* Period parameter is ignored when the Duration parameter is zero */ - if (!dur) { - period = 0; - } - - /* period is in 1.28 sec units - * TODO support full range, would require os_cputime milliseconds API - */ - if (period > 3355) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - period_ticks = os_cputime_usecs_to_ticks(period * 1280000); - - /* duration is in 10ms units */ - dur_ticks = os_cputime_usecs_to_ticks(dur * 10000); - - if (dur_ticks && period_ticks && (dur_ticks >= period_ticks)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - } -#endif - - /* disable*/ - if (!enable) { - if (scansm->scan_enabled) { - ble_ll_scan_sm_stop(1); - } -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - os_cputime_timer_stop(&scansm->duration_timer); - os_cputime_timer_stop(&scansm->period_timer); -#endif - - return BLE_ERR_SUCCESS; - } - - /* if already enable we just need to update parameters */ - if (scansm->scan_enabled) { - /* Controller does not allow initiating and scanning.*/ - for (i = 0; i < BLE_LL_SCAN_PHY_NUMBER; i++) { - scanp_phy = &scansm->scanp_phys[i]; - if (scanp_phy->configured && - scanp_phy->scan_type == BLE_SCAN_TYPE_INITIATE) { - return BLE_ERR_CMD_DISALLOWED; - } - } - -#if MYNEWT_VAL(BLE_LL_NUM_SCAN_DUP_ADVS) - /* update filter policy */ - scansm->scan_filt_dups = filter_dups; -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* restart timers according to new settings */ - scansm->duration_ticks = dur_ticks; - scansm->period_ticks = period_ticks; - ble_ll_scan_duration_period_timers_restart(scansm); -#endif - - return BLE_ERR_SUCCESS; - } - - /* we can store those upfront regardless of start scan result since scan is - * disabled now - */ - -#if MYNEWT_VAL(BLE_LL_NUM_SCAN_DUP_ADVS) - scansm->scan_filt_dups = filter_dups; -#endif - scansm->scanp = NULL; - scansm->scanp_next = NULL; - - for (i = 0; i < BLE_LL_SCAN_PHY_NUMBER; i++) { - scanp_phy = &scansm->scanp_phys[i]; - scanp = &g_ble_ll_scan_params[i]; - - if (!scanp->configured) { - continue; - } - - scanp_phy->configured = scanp->configured; - scanp_phy->scan_type = scanp->scan_type; - scanp_phy->timing = scanp->timing; - scanp_phy->scan_filt_policy = scanp->scan_filt_policy; - scanp_phy->own_addr_type = scanp->own_addr_type; - - if (!scansm->scanp) { - scansm->scanp = scanp_phy; - /* Take own_addr_type from the first configured PHY. - * Note: All configured PHYs shall have the same own_addr_type - */ - scansm->own_addr_type = scanp_phy->own_addr_type; - } else { - scansm->scanp_next = scanp_phy; - } - } - - /* spec is not really clear if we should use defaults in this case - * or just disallow starting scan without explicit configuration - * For now be nice to host and just use values based on LE Set Scan - * Parameters defaults. - */ - if (!scansm->scanp) { - scansm->scanp = &scansm->scanp_phys[PHY_UNCODED]; - scansm->own_addr_type = BLE_ADDR_PUBLIC; - - scanp_phy = scansm->scanp; - scanp_phy->configured = 1; - scanp_phy->scan_type = BLE_SCAN_TYPE_PASSIVE; - scanp_phy->timing.interval = - ble_ll_scan_time_hci_to_ticks(BLE_HCI_SCAN_ITVL_DEF); - scanp_phy->timing.window = - ble_ll_scan_time_hci_to_ticks(BLE_HCI_SCAN_WINDOW_DEF); - scanp_phy->scan_filt_policy = BLE_HCI_SCAN_FILT_NO_WL; - scanp_phy->own_addr_type = BLE_ADDR_PUBLIC; - } - - rc = ble_ll_scan_sm_start(scansm); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - if (rc == BLE_ERR_SUCCESS) { - scansm->duration_ticks = dur_ticks; - scansm->period_ticks = period_ticks; - ble_ll_scan_duration_period_timers_restart(scansm); - } -#endif - - return rc; -} - -int ble_ll_hci_scan_set_enable(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_scan_enable_cp *cmd = (const void *) cmdbuf; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - return ble_ll_scan_set_enable(cmd->enable, cmd->filter_duplicates, 0, 0, - false); -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -int ble_ll_hci_ext_scan_set_enable(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_set_ext_scan_enable_cp *cmd = (const void *) cmdbuf; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - return ble_ll_scan_set_enable(cmd->enable, cmd->filter_dup, - le16toh(cmd->period), le16toh(cmd->duration), - true); -} -#endif - -/** - * Checks if controller can change the whitelist. If scanning is enabled and - * using the whitelist the controller is not allowed to change the whitelist. - * - * @return int 0: not allowed to change whitelist; 1: change allowed. - */ -int -ble_ll_scan_can_chg_whitelist(void) -{ - int rc; - struct ble_ll_scan_sm *scansm; - struct ble_ll_scan_params *scanp; - - scansm = &g_ble_ll_scan_sm; - scanp = scansm->scanp; - if (scansm->scan_enabled && (scanp->scan_filt_policy & 1)) { - rc = 0; - } else { - rc = 1; - } - - return rc; -} - -int -ble_ll_scan_initiator_start(struct hci_create_conn *hcc, - struct ble_ll_scan_sm **sm) -{ - struct ble_ll_scan_sm *scansm; - struct ble_ll_scan_params *scanp; - int rc; - - scansm = &g_ble_ll_scan_sm; - scansm->own_addr_type = hcc->own_addr_type; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - scansm->ext_scanning = 0; -#endif - scansm->scanp = &scansm->scanp_phys[PHY_UNCODED]; - scansm->scanp_next = NULL; - - scanp = scansm->scanp; - scanp->scan_filt_policy = hcc->filter_policy; - scanp->timing.interval = ble_ll_scan_time_hci_to_ticks(hcc->scan_itvl); - scanp->timing.window = ble_ll_scan_time_hci_to_ticks(hcc->scan_window); - scanp->scan_type = BLE_SCAN_TYPE_INITIATE; - - rc = ble_ll_scan_sm_start(scansm); - if (sm == NULL) { - return rc; - } - - if (rc == BLE_ERR_SUCCESS) { - *sm = scansm; - } else { - *sm = NULL; - } - - return rc; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -int -ble_ll_scan_ext_initiator_start(struct hci_ext_create_conn *hcc, - struct ble_ll_scan_sm **sm) -{ - struct ble_ll_scan_sm *scansm; - struct ble_ll_scan_params *scanp_uncoded; - struct ble_ll_scan_params *scanp_coded; - struct hci_ext_conn_params *params; - int rc; - - scansm = &g_ble_ll_scan_sm; - scansm->own_addr_type = hcc->own_addr_type; - scansm->scanp = NULL; - scansm->scanp_next = NULL; - scansm->ext_scanning = 1; - - if (hcc->init_phy_mask & BLE_PHY_MASK_1M) { - params = &hcc->params[0]; - scanp_uncoded = &scansm->scanp_phys[PHY_UNCODED]; - - scanp_uncoded->timing.interval = ble_ll_scan_time_hci_to_ticks(params->scan_itvl); - scanp_uncoded->timing.window = ble_ll_scan_time_hci_to_ticks(params->scan_window); - scanp_uncoded->scan_type = BLE_SCAN_TYPE_INITIATE; - scanp_uncoded->scan_filt_policy = hcc->filter_policy; - scansm->scanp = scanp_uncoded; - } - - if (hcc->init_phy_mask & BLE_PHY_MASK_CODED) { - params = &hcc->params[2]; - scanp_coded = &scansm->scanp_phys[PHY_CODED]; - - scanp_coded->timing.interval = ble_ll_scan_time_hci_to_ticks(params->scan_itvl); - scanp_coded->timing.window = ble_ll_scan_time_hci_to_ticks(params->scan_window); - scanp_coded->scan_type = BLE_SCAN_TYPE_INITIATE; - scanp_coded->scan_filt_policy = hcc->filter_policy; - if (scansm->scanp) { - scansm->scanp_next = scanp_coded; - } else { - scansm->scanp = scanp_coded; - } - } - - /* if any of PHYs is configured for continuous scan we alter interval to - * fit other PHY - */ - if (scansm->scanp && scansm->scanp_next && scanp_coded->configured && - scanp_uncoded->configured) { - if (scanp_coded->timing.interval == scanp_coded->timing.window) { - scanp_coded->timing.interval += scanp_uncoded->timing.window; - } - - if (scanp_uncoded->timing.interval == scanp_uncoded->timing.window) { - scanp_uncoded->timing.interval += scanp_coded->timing.window; - } - } - - rc = ble_ll_scan_sm_start(scansm); - if (sm == NULL) { - return rc; - } - - if (rc == BLE_ERR_SUCCESS) { - *sm = scansm; - } else { - *sm = NULL; - } - - return rc; -} -#endif - -/** - * Checks to see if the scanner is enabled. - * - * @return int 0: not enabled; enabled otherwise - */ -int -ble_ll_scan_enabled(void) -{ - return (int)g_ble_ll_scan_sm.scan_enabled; -} - -/** - * Returns the peer resolvable private address of last device connecting to us - * - * @return uint8_t* - */ -uint8_t * -ble_ll_scan_get_peer_rpa(void) -{ - struct ble_ll_scan_sm *scansm; - - /* XXX: should this go into IRK list or connection? */ - scansm = &g_ble_ll_scan_sm; - return scansm->scan_peer_rpa; -} - -/** - * Returns the local resolvable private address currently being using by - * the scanner/initiator - * - * @return uint8_t* - */ -uint8_t * -ble_ll_scan_get_local_rpa(void) -{ - return g_ble_ll_scan_sm.pdu_data.scana; -} - -/** - * Set the Resolvable Private Address in the scanning (or initiating) state - * machine. - * - * XXX: should this go into IRK list or connection? - * - * @param rpa - */ -void -ble_ll_scan_set_peer_rpa(uint8_t *rpa) -{ - struct ble_ll_scan_sm *scansm; - - scansm = &g_ble_ll_scan_sm; - memcpy(scansm->scan_peer_rpa, rpa, BLE_DEV_ADDR_LEN); -} - -struct ble_ll_scan_pdu_data * -ble_ll_scan_get_pdu_data(void) -{ - return &g_ble_ll_scan_sm.pdu_data; -} - -/* Returns true if whitelist is enabled for scanning */ -int -ble_ll_scan_whitelist_enabled(void) -{ - return g_ble_ll_scan_sm.scanp->scan_filt_policy & 1; -} - -static void -ble_ll_scan_common_init(void) -{ - struct ble_ll_scan_sm *scansm; - struct ble_ll_scan_params *scanp; - int i; - - /* Clear state machine in case re-initialized */ - scansm = &g_ble_ll_scan_sm; - memset(scansm, 0, sizeof(struct ble_ll_scan_sm)); - - /* Clear scan parameters in case re-initialized */ - memset(g_ble_ll_scan_params, 0, sizeof(g_ble_ll_scan_params)); - - /* Initialize scanning window end event */ - ble_npl_event_init(&scansm->scan_sched_ev, ble_ll_scan_event_proc, scansm); - - for (i = 0; i < BLE_LL_SCAN_PHY_NUMBER; i++) { - /* Set all non-zero default parameters */ - scanp = &g_ble_ll_scan_params[i]; - scanp->timing.interval = - ble_ll_scan_time_hci_to_ticks(BLE_HCI_SCAN_ITVL_DEF); - scanp->timing.window = - ble_ll_scan_time_hci_to_ticks(BLE_HCI_SCAN_WINDOW_DEF); - } - - scansm->scanp_phys[PHY_UNCODED].phy = BLE_PHY_1M; -#if (BLE_LL_SCAN_PHY_NUMBER == 2) - scansm->scanp_phys[PHY_CODED].phy = BLE_PHY_CODED; -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - /* Make sure we'll generate new NRPA if necessary */ - scansm->scan_nrpa_timer = ble_npl_time_get(); -#endif - - /* Initialize scanning timer */ - os_cputime_timer_init(&scansm->scan_timer, ble_ll_scan_timer_cb, scansm); - - /* Initialize extended scan timers */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - os_cputime_timer_init(&scansm->duration_timer, - ble_ll_scan_duration_timer_cb, scansm); - os_cputime_timer_init(&scansm->period_timer, ble_ll_scan_period_timer_cb, - scansm); -#endif - - ble_npl_event_init(&scansm->scan_interrupted_ev, ble_ll_scan_interrupted_event_cb, NULL); -} - -/** - * Called when the controller receives the reset command. Resets the - * scanning state machine to its initial state. - * - * @return int - */ -void -ble_ll_scan_reset(void) -{ - struct ble_ll_scan_sm *scansm; - - scansm = &g_ble_ll_scan_sm; - - /* If enabled, stop it. */ - if (scansm->scan_enabled) { - ble_ll_scan_sm_stop(0); - } - - /* stop extended scan timers */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - os_cputime_timer_stop(&scansm->duration_timer); - os_cputime_timer_stop(&scansm->period_timer); -#endif - - /* Reset duplicate advertisers and those from which we rxd a response */ - g_ble_ll_scan_num_rsp_advs = 0; - memset(&g_ble_ll_scan_rsp_advs[0], 0, sizeof(g_ble_ll_scan_rsp_advs)); - - os_mempool_clear(&g_scan_dup_pool); - TAILQ_INIT(&g_scan_dup_list); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - /* clear memory pool for AUX scan results */ - os_mempool_clear(&ext_scan_aux_pool); -#endif - - /* Call the common init function again */ - ble_ll_scan_common_init(); -} - -/** - * ble ll scan init - * - * Initialize a scanner. Must be called before scanning can be started. - * Expected to be called with a un-initialized scanning state machine. - */ -void -ble_ll_scan_init(void) -{ - os_error_t err; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - err = os_mempool_init(&ext_scan_aux_pool, - MYNEWT_VAL(BLE_LL_EXT_ADV_AUX_PTR_CNT), - sizeof (struct ble_ll_aux_data), - ext_scan_aux_mem, - "ble_ll_aux_scan_pool"); - BLE_LL_ASSERT(err == 0); -#endif - - err = os_mempool_init(&g_scan_dup_pool, - MYNEWT_VAL(BLE_LL_NUM_SCAN_DUP_ADVS), - sizeof(struct ble_ll_scan_dup_entry), - g_scan_dup_mem, - "ble_ll_scan_dup_pool"); - BLE_LL_ASSERT(err == 0); - - TAILQ_INIT(&g_scan_dup_list); - - ble_ll_scan_common_init(); -} - -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_sched.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_sched.c deleted file mode 100644 index 77c107f82..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_sched.c +++ /dev/null @@ -1,1838 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include -#include -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/porting/nimble/include/os/os_cputime.h" - -#if defined(ARDUINO_ARCH_NRF5) && defined(NRF51) -#include "nimble/nimble/drivers/nrf51/include/ble/xcvr.h" -#elif defined(ARDUINO_ARCH_NRF5) && defined(NRF52_SERIES) -#include "nimble/nimble/drivers/nrf52/include/ble/xcvr.h" -#endif - -#include "../include/controller/ble_phy.h" -#include "../include/controller/ble_ll.h" -#include "../include/controller/ble_ll_sched.h" -#include "../include/controller/ble_ll_adv.h" -#include "../include/controller/ble_ll_scan.h" -#include "../include/controller/ble_ll_rfmgmt.h" -#include "../include/controller/ble_ll_trace.h" -#include "../include/controller/ble_ll_sync.h" -#include "ble_ll_priv.h" -#include "ble_ll_conn_priv.h" - -/* XXX: this is temporary. Not sure what I want to do here */ -struct hal_timer g_ble_ll_sched_timer; - -uint8_t g_ble_ll_sched_offset_ticks; - -#define BLE_LL_SCHED_ADV_WORST_CASE_USECS \ - (BLE_LL_SCHED_MAX_ADV_PDU_USECS + BLE_LL_IFS + BLE_LL_SCHED_ADV_MAX_USECS \ - + XCVR_TX_SCHED_DELAY_USECS) - -#if (BLE_LL_SCHED_DEBUG == 1) -int32_t g_ble_ll_sched_max_late; -int32_t g_ble_ll_sched_max_early; -#endif - -/* XXX: TODO: - * 1) Add some accounting to the schedule code to see how late we are - * (min/max?) - * - * 2) Need to determine how we really want to handle the case when we execute - * a schedule item but there is a current event. We could: - * -> Reschedule the schedule item and let current event finish - * -> Kill the current event and run the scheduled item. - * -> Disable schedule timer while in an event; could cause us to be late. - * -> Wait for current event to finish hoping it does before schedule item. - */ - -/* Queue for timers */ -TAILQ_HEAD(ll_sched_qhead, ble_ll_sched_item) g_ble_ll_sched_q; - -#if MYNEWT_VAL(BLE_LL_STRICT_CONN_SCHEDULING) -struct ble_ll_sched_obj g_ble_ll_sched_data; -#endif - -/** - * Checks if two events in the schedule will overlap in time. NOTE: consecutive - * schedule items can end and start at the same time. - * - * @param s1 - * @param s2 - * - * @return int 0: dont overlap 1:overlap - */ -static int -ble_ll_sched_is_overlap(struct ble_ll_sched_item *s1, - struct ble_ll_sched_item *s2) -{ - int rc; - - rc = 1; - if ((int32_t)(s1->start_time - s2->start_time) < 0) { - /* Make sure this event does not overlap current event */ - if ((int32_t)(s1->end_time - s2->start_time) <= 0) { - rc = 0; - } - } else { - /* Check for overlap */ - if ((int32_t)(s1->start_time - s2->end_time) >= 0) { - rc = 0; - } - } - - return rc; -} - -/* - * Determines if the schedule item overlaps the currently running schedule - * item. We only care about connection schedule items - */ -static int -ble_ll_sched_overlaps_current(struct ble_ll_sched_item *sch) -{ - int rc; - uint32_t ce_end_time; - - rc = 0; - if (ble_ll_state_get() == BLE_LL_STATE_CONNECTION) { - ce_end_time = ble_ll_conn_get_ce_end_time(); - if ((int32_t)(ce_end_time - sch->start_time) > 0) { - rc = 1; - } - } - return rc; -} - -static int -ble_ll_sched_conn_overlap(struct ble_ll_sched_item *entry) -{ - int rc; - struct ble_ll_conn_sm *connsm; - - /* Should only be advertising or a connection here */ - if (entry->sched_type == BLE_LL_SCHED_TYPE_CONN) { - connsm = (struct ble_ll_conn_sm *)entry->cb_arg; - entry->enqueued = 0; - TAILQ_REMOVE(&g_ble_ll_sched_q, entry, link); - ble_ll_event_send(&connsm->conn_ev_end); - rc = 0; - } else { - rc = -1; - } - - return rc; -} - -static struct ble_ll_sched_item * -ble_ll_sched_insert_if_empty(struct ble_ll_sched_item *sch) -{ - struct ble_ll_sched_item *entry; - - entry = TAILQ_FIRST(&g_ble_ll_sched_q); - if (!entry) { - TAILQ_INSERT_HEAD(&g_ble_ll_sched_q, sch, link); - sch->enqueued = 1; - } - return entry; -} - -int -ble_ll_sched_conn_reschedule(struct ble_ll_conn_sm *connsm) -{ - int rc; - os_sr_t sr; - uint32_t usecs; - struct ble_ll_sched_item *sch; - struct ble_ll_sched_item *start_overlap; - struct ble_ll_sched_item *end_overlap; - struct ble_ll_sched_item *entry; - struct ble_ll_conn_sm *tmp; - - /* Get schedule element from connection */ - sch = &connsm->conn_sch; - - /* Set schedule start and end times */ - sch->start_time = connsm->anchor_point - g_ble_ll_sched_offset_ticks; - if (connsm->conn_role == BLE_LL_CONN_ROLE_SLAVE) { - usecs = connsm->slave_cur_window_widening; - sch->start_time -= (os_cputime_usecs_to_ticks(usecs) + 1); - sch->remainder = 0; - } else { - sch->remainder = connsm->anchor_point_usecs; - } - sch->end_time = connsm->ce_end_time; - - /* Better be past current time or we just leave */ - if ((int32_t)(sch->start_time - os_cputime_get32()) < 0) { - return -1; - } - - /* We have to find a place for this schedule */ - OS_ENTER_CRITICAL(sr); - - if (ble_ll_sched_overlaps_current(sch)) { - OS_EXIT_CRITICAL(sr); - return -1; - } - - /* Stop timer since we will add an element */ - os_cputime_timer_stop(&g_ble_ll_sched_timer); - - start_overlap = NULL; - end_overlap = NULL; - rc = 0; - TAILQ_FOREACH(entry, &g_ble_ll_sched_q, link) { - if (ble_ll_sched_is_overlap(sch, entry)) { - if (entry->sched_type == BLE_LL_SCHED_TYPE_CONN && - !ble_ll_conn_is_lru((struct ble_ll_conn_sm *)sch->cb_arg, - (struct ble_ll_conn_sm *)entry->cb_arg)) { - /* Only insert if this element is older than all that we - * overlap - */ - start_overlap = NULL; - rc = -1; - break; - } - - if (start_overlap == NULL) { - start_overlap = entry; - end_overlap = entry; - } else { - end_overlap = entry; - } - } else { - if ((int32_t)(sch->end_time - entry->start_time) <= 0) { - rc = 0; - TAILQ_INSERT_BEFORE(entry, sch, link); - break; - } - } - } - - if (!rc) { - if (!entry) { - TAILQ_INSERT_TAIL(&g_ble_ll_sched_q, sch, link); - } - sch->enqueued = 1; - } - - /* Remove first to last scheduled elements */ - entry = start_overlap; - while (entry) { - start_overlap = TAILQ_NEXT(entry,link); - switch (entry->sched_type) { - case BLE_LL_SCHED_TYPE_CONN: - tmp = (struct ble_ll_conn_sm *)entry->cb_arg; - ble_ll_event_send(&tmp->conn_ev_end); - break; - case BLE_LL_SCHED_TYPE_ADV: - ble_ll_adv_event_rmvd_from_sched((struct ble_ll_adv_sm *)entry->cb_arg); - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - case BLE_LL_SCHED_TYPE_AUX_SCAN: - ble_ll_scan_end_adv_evt((struct ble_ll_aux_data *)entry->cb_arg); - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - case BLE_LL_SCHED_TYPE_PERIODIC: - ble_ll_adv_periodic_rmvd_from_sched((struct ble_ll_adv_sm *)entry->cb_arg); - break; - case BLE_LL_SCHED_TYPE_SYNC: - ble_ll_sync_rmvd_from_sched((struct ble_ll_sync_sm *)entry->cb_arg); - break; -#endif -#endif - default: - BLE_LL_ASSERT(0); - break; - } - - TAILQ_REMOVE(&g_ble_ll_sched_q, entry, link); - entry->enqueued = 0; - - if (entry == end_overlap) { - break; - } - entry = start_overlap; - } - - entry = TAILQ_FIRST(&g_ble_ll_sched_q); - if (entry == sch) { - ble_ll_rfmgmt_sched_changed(sch); - } else { - sch = entry; - } - - OS_EXIT_CRITICAL(sr); - - /* Restart timer */ - BLE_LL_ASSERT(sch != NULL); - os_cputime_timer_start(&g_ble_ll_sched_timer, sch->start_time); - - return rc; -} - -/** - * Called to schedule a connection when the current role is master. - * - * Context: Interrupt - * - * @param connsm - * @param ble_hdr - * @param pyld_len - * - * @return int - */ -#if MYNEWT_VAL(BLE_LL_STRICT_CONN_SCHEDULING) -int -ble_ll_sched_master_new(struct ble_ll_conn_sm *connsm, - struct ble_mbuf_hdr *ble_hdr, uint8_t pyld_len) -{ - int rc; - os_sr_t sr; - uint32_t initial_start; - uint32_t earliest_start; - uint32_t earliest_end; - uint32_t dur; - uint32_t itvl_t; - uint32_t adv_rxend; - int i; - uint32_t tpp; - uint32_t tse; - uint32_t np; - uint32_t cp; - uint32_t tick_in_period; - - struct ble_ll_sched_item *entry; - struct ble_ll_sched_item *sch; - - /* Better have a connsm */ - BLE_LL_ASSERT(connsm != NULL); - - /* Get schedule element from connection */ - rc = -1; - sch = &connsm->conn_sch; - - /* XXX: - * The calculations for the 32kHz crystal bear alot of explanation. The - * earliest possible time that the master can start the connection with a - * slave is 1.25 msecs from the end of the connection request. The - * connection request is sent an IFS time from the end of the advertising - * packet that was received plus the time it takes to send the connection - * request. At 1 Mbps, this is 1752 usecs, or 57.41 ticks. Using 57 ticks - * makes us off ~13 usecs. Since we dont want to actually calculate the - * receive end time tick (this would take too long), we assume the end of - * the advertising PDU is 'now' (we call os_cputime_get32). We dont know - * how much time it will take to service the ISR but if we are more than the - * rx to tx time of the chip we will not be successful transmitting the - * connect request. All this means is that we presume that the slave will - * receive the connect request later than we expect but no earlier than - * 13 usecs before (this is important). - * - * The code then attempts to schedule the connection at the - * earliest time although this may not be possible. When the actual - * schedule start time is determined, the master has to determine if this - * time is more than a transmit window offset interval (1.25 msecs). The - * master has to tell the slave how many transmit window offsets there are - * from the earliest possible time to when the actual transmit start will - * occur. Later in this function you will see the calculation. The actual - * transmission start has to occur within the transmit window. The transmit - * window interval is in units of 1.25 msecs and has to be at least 1. To - * make things a bit easier (but less power efficient for the slave), we - * use a transmit window of 2. We do this because we dont quite know the - * exact start of the transmission and if we are too early or too late we - * could miss the transmit window. A final note: the actual transmission - * start (the anchor point) is sched offset ticks from the schedule start - * time. We dont add this to the calculation when calculating the window - * offset. The reason we dont do this is we want to insure we transmit - * after the window offset we tell the slave. For example, say we think - * we are transmitting 1253 usecs from the earliest start. This would cause - * us to send a transmit window offset of 1. Since we are actually - * transmitting earlier than the slave thinks we could end up transmitting - * before the window offset. Transmitting later is fine since we have the - * transmit window to do so. Transmitting before is bad, since the slave - * wont be listening. We could do better calculation if we wanted to use - * a transmit window of 1 as opposed to 2, but for now we dont care. - */ - dur = os_cputime_usecs_to_ticks(g_ble_ll_sched_data.sch_ticks_per_period); - adv_rxend = os_cputime_get32(); - if (ble_hdr->rxinfo.channel >= BLE_PHY_NUM_DATA_CHANS) { - /* - * We received packet on advertising channel which means this is a legacy - * PDU on 1 Mbps - we do as described above. - */ - earliest_start = adv_rxend + 57; - } else { - /* - * The calculations are similar as above. - * - * We received packet on data channel which means this is AUX_ADV_IND - * received on secondary adv channel. We can schedule first packet at - * the earliest after "T_IFS + AUX_CONNECT_REQ + transmitWindowDelay". - * AUX_CONNECT_REQ and transmitWindowDelay times vary depending on which - * PHY we received on. - * - */ - if (ble_hdr->rxinfo.phy == BLE_PHY_1M) { - // 150 + 352 + 2500 = 3002us = 98.37 ticks - earliest_start = adv_rxend + 98; - } else if (ble_hdr->rxinfo.phy == BLE_PHY_2M) { - // 150 + 180 + 2500 = 2830us = 92.73 ticks - earliest_start = adv_rxend + 93; - } else if (ble_hdr->rxinfo.phy == BLE_PHY_CODED) { - // 150 + 2896 + 3750 = 6796us = 222.69 ticks - earliest_start = adv_rxend + 223; - } else { - BLE_LL_ASSERT(0); - } - } - earliest_start += MYNEWT_VAL(BLE_LL_CONN_INIT_MIN_WIN_OFFSET) * - BLE_LL_SCHED_32KHZ_TICKS_PER_SLOT; - itvl_t = connsm->conn_itvl_ticks; - - /* We have to find a place for this schedule */ - OS_ENTER_CRITICAL(sr); - - /* - * Are there any allocated periods? If not, set epoch start to earliest - * time - */ - if (g_ble_ll_sched_data.sch_num_occ_periods == 0) { - g_ble_ll_sched_data.sch_epoch_start = earliest_start; - cp = 0; - } else { - /* - * Earliest start must occur on period boundary. - * (tse = ticks since epoch) - */ - tpp = g_ble_ll_sched_data.sch_ticks_per_period; - tse = earliest_start - g_ble_ll_sched_data.sch_epoch_start; - np = tse / tpp; - cp = np % BLE_LL_SCHED_PERIODS; - tick_in_period = tse - (np * tpp); - if (tick_in_period != 0) { - ++cp; - if (cp == BLE_LL_SCHED_PERIODS) { - cp = 0; - } - earliest_start += (tpp - tick_in_period); - } - - /* Now find first un-occupied period starting from cp */ - for (i = 0; i < BLE_LL_SCHED_PERIODS; ++i) { - if (g_ble_ll_sched_data.sch_occ_period_mask & (1 << cp)) { - ++cp; - if (cp == BLE_LL_SCHED_PERIODS) { - cp = 0; - } - earliest_start += tpp; - } else { - /* not occupied */ - break; - } - } - /* Should never happen but if it does... */ - if (i == BLE_LL_SCHED_PERIODS) { - OS_EXIT_CRITICAL(sr); - return rc; - } - } - - sch->start_time = earliest_start; - initial_start = earliest_start; - earliest_end = earliest_start + dur; - - if (!ble_ll_sched_insert_if_empty(sch)) { - /* Nothing in schedule. Schedule as soon as possible */ - rc = 0; - connsm->tx_win_off = MYNEWT_VAL(BLE_LL_CONN_INIT_MIN_WIN_OFFSET); - } else { - os_cputime_timer_stop(&g_ble_ll_sched_timer); - TAILQ_FOREACH(entry, &g_ble_ll_sched_q, link) { - /* Set these because overlap function needs them to be set */ - sch->start_time = earliest_start; - sch->end_time = earliest_end; - - /* We can insert if before entry in list */ - if ((int32_t)(sch->end_time - entry->start_time) <= 0) { - if ((earliest_start - initial_start) <= itvl_t) { - rc = 0; - TAILQ_INSERT_BEFORE(entry, sch, link); - } - break; - } - - /* Check for overlapping events */ - if (ble_ll_sched_is_overlap(sch, entry)) { - /* Earliest start is end of this event since we overlap */ - earliest_start = entry->end_time; - earliest_end = earliest_start + dur; - } - } - - /* Must be able to schedule within one connection interval */ - if (!entry) { - if ((earliest_start - initial_start) <= itvl_t) { - rc = 0; - TAILQ_INSERT_TAIL(&g_ble_ll_sched_q, sch, link); - } - } - - if (!rc) { - /* calculate number of window offsets. Each offset is 1.25 ms */ - sch->enqueued = 1; - /* - * NOTE: we dont add sched offset ticks as we want to under-estimate - * the transmit window slightly since the window size is currently - * 2 when using a 32768 crystal. - */ - dur = os_cputime_ticks_to_usecs(earliest_start - initial_start); - connsm->tx_win_off = dur / BLE_LL_CONN_TX_OFF_USECS; - } - } - - if (!rc) { - sch->start_time = earliest_start; - sch->end_time = earliest_end; - /* - * Since we have the transmit window to transmit in, we dont need - * to set the anchor point usecs; just transmit to the nearest tick. - */ - connsm->anchor_point = earliest_start + g_ble_ll_sched_offset_ticks; - connsm->anchor_point_usecs = 0; - connsm->ce_end_time = earliest_end; - connsm->period_occ_mask = (1 << cp); - g_ble_ll_sched_data.sch_occ_period_mask |= connsm->period_occ_mask; - ++g_ble_ll_sched_data.sch_num_occ_periods; - } - - - /* Get head of list to restart timer */ - sch = TAILQ_FIRST(&g_ble_ll_sched_q); - ble_ll_rfmgmt_sched_changed(sch); - - OS_EXIT_CRITICAL(sr); - - os_cputime_timer_start(&g_ble_ll_sched_timer, sch->start_time); - - return rc; -} -#else -int -ble_ll_sched_master_new(struct ble_ll_conn_sm *connsm, - struct ble_mbuf_hdr *ble_hdr, uint8_t pyld_len) -{ - int rc; - os_sr_t sr; - uint8_t req_slots; - uint32_t initial_start; - uint32_t earliest_start; - uint32_t earliest_end; - uint32_t dur; - uint32_t itvl_t; - uint32_t adv_rxend; - struct ble_ll_sched_item *entry; - struct ble_ll_sched_item *sch; - - /* - * XXX: TODO this code assumes the advertisement and connect request were - * sent at 1Mbps. - */ - - /* Get schedule element from connection */ - rc = -1; - sch = &connsm->conn_sch; - req_slots = MYNEWT_VAL(BLE_LL_CONN_INIT_SLOTS); - - /* XXX: - * The calculations for the 32kHz crystal bear alot of explanation. The - * earliest possible time that the master can start the connection with a - * slave is 1.25 msecs from the end of the connection request. The - * connection request is sent an IFS time from the end of the advertising - * packet that was received plus the time it takes to send the connection - * request. At 1 Mbps, this is 1752 usecs, or 57.41 ticks. Using 57 ticks - * makes us off ~13 usecs. Since we dont want to actually calculate the - * receive end time tick (this would take too long), we assume the end of - * the advertising PDU is 'now' (we call os_cputime_get32). We dont know - * how much time it will take to service the ISR but if we are more than the - * rx to tx time of the chip we will not be successful transmitting the - * connect request. All this means is that we presume that the slave will - * receive the connect request later than we expect but no earlier than - * 13 usecs before (this is important). - * - * The code then attempts to schedule the connection at the - * earliest time although this may not be possible. When the actual - * schedule start time is determined, the master has to determine if this - * time is more than a transmit window offset interval (1.25 msecs). The - * master has to tell the slave how many transmit window offsets there are - * from the earliest possible time to when the actual transmit start will - * occur. Later in this function you will see the calculation. The actual - * transmission start has to occur within the transmit window. The transmit - * window interval is in units of 1.25 msecs and has to be at least 1. To - * make things a bit easier (but less power efficient for the slave), we - * use a transmit window of 2. We do this because we dont quite know the - * exact start of the transmission and if we are too early or too late we - * could miss the transmit window. A final note: the actual transmission - * start (the anchor point) is sched offset ticks from the schedule start - * time. We dont add this to the calculation when calculating the window - * offset. The reason we dont do this is we want to insure we transmit - * after the window offset we tell the slave. For example, say we think - * we are transmitting 1253 usecs from the earliest start. This would cause - * us to send a transmit window offset of 1. Since we are actually - * transmitting earlier than the slave thinks we could end up transmitting - * before the window offset. Transmitting later is fine since we have the - * transmit window to do so. Transmitting before is bad, since the slave - * wont be listening. We could do better calculation if we wanted to use - * a transmit window of 1 as opposed to 2, but for now we dont care. - */ - dur = req_slots * BLE_LL_SCHED_32KHZ_TICKS_PER_SLOT; - adv_rxend = os_cputime_get32(); - if (ble_hdr->rxinfo.channel >= BLE_PHY_NUM_DATA_CHANS) { - /* - * We received packet on advertising channel which means this is a legacy - * PDU on 1 Mbps - we do as described above. - */ - earliest_start = adv_rxend + 57; - } else { - /* - * The calculations are similar as above. - * - * We received packet on data channel which means this is AUX_ADV_IND - * received on secondary adv channel. We can schedule first packet at - * the earliest after "T_IFS + AUX_CONNECT_REQ + transmitWindowDelay". - * AUX_CONNECT_REQ and transmitWindowDelay times vary depending on which - * PHY we received on. - * - */ - if (ble_hdr->rxinfo.phy == BLE_PHY_1M) { - // 150 + 352 + 2500 = 3002us = 98.37 ticks - earliest_start = adv_rxend + 98; - } else if (ble_hdr->rxinfo.phy == BLE_PHY_2M) { - // 150 + 180 + 2500 = 2830us = 92.73 ticks - earliest_start = adv_rxend + 93; - } else if (ble_hdr->rxinfo.phy == BLE_PHY_CODED) { - // 150 + 2896 + 3750 = 6796us = 222.69 ticks - earliest_start = adv_rxend + 223; - } else { - BLE_LL_ASSERT(0); - } - } - earliest_start += MYNEWT_VAL(BLE_LL_CONN_INIT_MIN_WIN_OFFSET) * - BLE_LL_SCHED_32KHZ_TICKS_PER_SLOT; - earliest_end = earliest_start + dur; - itvl_t = connsm->conn_itvl_ticks; - - /* We have to find a place for this schedule */ - OS_ENTER_CRITICAL(sr); - - /* The schedule item must occur after current running item (if any) */ - sch->start_time = earliest_start; - initial_start = earliest_start; - - if (!ble_ll_sched_insert_if_empty(sch)) { - /* Nothing in schedule. Schedule as soon as possible */ - rc = 0; - connsm->tx_win_off = MYNEWT_VAL(BLE_LL_CONN_INIT_MIN_WIN_OFFSET); - } else { - os_cputime_timer_stop(&g_ble_ll_sched_timer); - TAILQ_FOREACH(entry, &g_ble_ll_sched_q, link) { - /* Set these because overlap function needs them to be set */ - sch->start_time = earliest_start; - sch->end_time = earliest_end; - - /* We can insert if before entry in list */ - if ((int32_t)(sch->end_time - entry->start_time) <= 0) { - if ((earliest_start - initial_start) <= itvl_t) { - rc = 0; - TAILQ_INSERT_BEFORE(entry, sch, link); - } - break; - } - - /* Check for overlapping events */ - if (ble_ll_sched_is_overlap(sch, entry)) { - /* Earliest start is end of this event since we overlap */ - earliest_start = entry->end_time; - earliest_end = earliest_start + dur; - } - } - - /* Must be able to schedule within one connection interval */ - if (!entry) { - if ((earliest_start - initial_start) <= itvl_t) { - rc = 0; - TAILQ_INSERT_TAIL(&g_ble_ll_sched_q, sch, link); - } - } - - if (!rc) { - /* calculate number of window offsets. Each offset is 1.25 ms */ - sch->enqueued = 1; - /* - * NOTE: we dont add sched offset ticks as we want to under-estimate - * the transmit window slightly since the window size is currently - * 2 when using a 32768 crystal. - */ - dur = os_cputime_ticks_to_usecs(earliest_start - initial_start); - connsm->tx_win_off = dur / BLE_LL_CONN_TX_OFF_USECS; - } - } - - if (!rc) { - sch->start_time = earliest_start; - sch->end_time = earliest_end; - /* - * Since we have the transmit window to transmit in, we dont need - * to set the anchor point usecs; just transmit to the nearest tick. - */ - connsm->anchor_point = earliest_start + g_ble_ll_sched_offset_ticks; - connsm->anchor_point_usecs = 0; - connsm->ce_end_time = earliest_end; - } - - /* Get head of list to restart timer */ - sch = TAILQ_FIRST(&g_ble_ll_sched_q); - ble_ll_rfmgmt_sched_changed(sch); - - OS_EXIT_CRITICAL(sr); - - os_cputime_timer_start(&g_ble_ll_sched_timer, sch->start_time); - - return rc; -} -#endif - -/** - * Schedules a slave connection for the first time. - * - * Context: Link Layer - * - * @param connsm - * - * @return int - */ -int -ble_ll_sched_slave_new(struct ble_ll_conn_sm *connsm) -{ - int rc; - os_sr_t sr; - struct ble_ll_sched_item *entry; - struct ble_ll_sched_item *next_sch; - struct ble_ll_sched_item *sch; - int first = 0; - - /* Get schedule element from connection */ - rc = -1; - sch = &connsm->conn_sch; - - /* Set schedule start and end times */ - /* - * XXX: for now, we dont care about anchor point usecs for the slave. It - * does not matter if we turn on the receiver up to one tick before w - * need to. We also subtract one extra tick since the conversion from - * usecs to ticks could be off by up to 1 tick. - */ - sch->start_time = connsm->anchor_point - g_ble_ll_sched_offset_ticks - - os_cputime_usecs_to_ticks(connsm->slave_cur_window_widening) - 1; - sch->end_time = connsm->ce_end_time; - sch->remainder = 0; - - /* We have to find a place for this schedule */ - OS_ENTER_CRITICAL(sr); - - /* The schedule item must occur after current running item (if any) */ - if (ble_ll_sched_overlaps_current(sch)) { - OS_EXIT_CRITICAL(sr); - return rc; - } - - entry = ble_ll_sched_insert_if_empty(sch); - if (!entry) { - /* Nothing in schedule. Schedule as soon as possible */ - rc = 0; - first = 1; - } else { - os_cputime_timer_stop(&g_ble_ll_sched_timer); - while (1) { - next_sch = entry->link.tqe_next; - /* Insert if event ends before next starts */ - if ((int32_t)(sch->end_time - entry->start_time) <= 0) { - rc = 0; - TAILQ_INSERT_BEFORE(entry, sch, link); - break; - } - - if (ble_ll_sched_is_overlap(sch, entry)) { - /* If we overlap with a connection, we re-schedule */ - if (ble_ll_sched_conn_overlap(entry)) { - break; - } - } - - /* Move to next entry */ - entry = next_sch; - - /* Insert at tail if none left to check */ - if (!entry) { - rc = 0; - TAILQ_INSERT_TAIL(&g_ble_ll_sched_q, sch, link); - break; - } - } - - if (!rc) { - sch->enqueued = 1; - } - - next_sch = TAILQ_FIRST(&g_ble_ll_sched_q); - if (next_sch == sch) { - first = 1; - } else { - sch = next_sch; - } - } - - if (first) { - ble_ll_rfmgmt_sched_changed(sch); - } - - OS_EXIT_CRITICAL(sr); - - os_cputime_timer_start(&g_ble_ll_sched_timer, sch->start_time); - - return rc; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) -/* - * Determines if the schedule item overlaps the currently running schedule - * item. This function cares about connection and sync. - */ -static int -ble_ll_sched_sync_overlaps_current(struct ble_ll_sched_item *sch) -{ - uint32_t end_time; - uint8_t state; - - state = ble_ll_state_get(); - switch (state) { - case BLE_LL_STATE_CONNECTION: - end_time = ble_ll_conn_get_ce_end_time(); - break; - case BLE_LL_STATE_SYNC: - end_time = ble_ll_sync_get_event_end_time(); - break; - default: - return 0; - } - - return CPUTIME_GT(end_time, sch->start_time); -} - -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) -{ - struct ble_ll_sched_item *entry; - uint8_t start_time_rem_usecs; - uint8_t window_rem_usecs; - uint32_t window_ticks; - uint32_t start_time; - uint32_t end_time; - uint32_t dur; - int rc = 0; - os_sr_t sr; - - window_ticks = os_cputime_usecs_to_ticks(window_widening); - window_rem_usecs = window_widening - os_cputime_ticks_to_usecs(window_ticks); - - /* adjust for subtraction */ - anchor_point_usecs += 31; - anchor_point--; - - start_time = anchor_point - window_ticks; - start_time_rem_usecs = anchor_point_usecs - window_rem_usecs; - if (start_time_rem_usecs >= 31) { - start_time++; - start_time_rem_usecs -= 31; - } - - dur = ble_ll_pdu_tx_time_get(MYNEWT_VAL(BLE_LL_SCHED_SCAN_SYNC_PDU_LEN), - phy_mode); - end_time = start_time + os_cputime_usecs_to_ticks(dur); - - start_time -= g_ble_ll_sched_offset_ticks; - - /* Set schedule start and end times */ - sch->start_time = start_time; - sch->remainder = start_time_rem_usecs; - sch->end_time = end_time; - - /* Better be past current time or we just leave */ - if (CPUTIME_LEQ(sch->start_time, os_cputime_get32())) { - return -1; - } - - /* We have to find a place for this schedule */ - OS_ENTER_CRITICAL(sr); - - if (ble_ll_sched_sync_overlaps_current(sch)) { - OS_EXIT_CRITICAL(sr); - return -1; - } - - /* Try to find slot for sync scan. */ - os_cputime_timer_stop(&g_ble_ll_sched_timer); - - TAILQ_FOREACH(entry, &g_ble_ll_sched_q, link) { - /* We can insert if before entry in list */ - if (CPUTIME_LEQ(sch->end_time, entry->start_time)) { - TAILQ_INSERT_BEFORE(entry, sch, link); - sch->enqueued = 1; - break; - } - - /* Check for overlapping events. For now drop if it overlaps with - * anything. We can make it smarter later on - */ - if (ble_ll_sched_is_overlap(sch, entry)) { - rc = -1; - break; - } - } - - if (!entry) { - TAILQ_INSERT_TAIL(&g_ble_ll_sched_q, sch, link); - sch->enqueued = 1; - } - - entry = TAILQ_FIRST(&g_ble_ll_sched_q); - if (entry == sch) { - ble_ll_rfmgmt_sched_changed(sch); - } else { - sch = entry; - } - - OS_EXIT_CRITICAL(sr); - - /* Restart timer */ - BLE_LL_ASSERT(sch != NULL); - os_cputime_timer_start(&g_ble_ll_sched_timer, sch->start_time); - - return rc; -} - -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) -{ - struct ble_ll_sched_item *entry; - uint32_t start_time_rem_usecs; - uint32_t off_rem_usecs; - uint32_t start_time; - uint32_t off_ticks; - uint32_t end_time; - uint32_t dur; - os_sr_t sr; - int rc = 0; - - off_ticks = os_cputime_usecs_to_ticks(offset); - off_rem_usecs = offset - os_cputime_ticks_to_usecs(off_ticks); - - start_time = beg_cputime + off_ticks; - start_time_rem_usecs = rem_usecs + off_rem_usecs; - if (start_time_rem_usecs >= 31) { - start_time++; - start_time_rem_usecs -= 31; - } - - dur = ble_ll_pdu_tx_time_get(MYNEWT_VAL(BLE_LL_SCHED_SCAN_SYNC_PDU_LEN), - phy_mode); - end_time = start_time + os_cputime_usecs_to_ticks(dur); - - start_time -= g_ble_ll_sched_offset_ticks; - - sch->start_time = start_time; - sch->remainder = start_time_rem_usecs; - sch->end_time = end_time; - - OS_ENTER_CRITICAL(sr); - - if (!ble_ll_sched_insert_if_empty(sch)) { - /* Nothing in schedule. Schedule as soon as possible - * If we are here it means sch has been added to the scheduler */ - goto done; - } - - /* Try to find slot for scan. */ - os_cputime_timer_stop(&g_ble_ll_sched_timer); - TAILQ_FOREACH(entry, &g_ble_ll_sched_q, link) { - /* We can insert if before entry in list */ - if (CPUTIME_LEQ(sch->end_time, entry->start_time)) { - TAILQ_INSERT_BEFORE(entry, sch, link); - sch->enqueued = 1; - break; - } - - /* Check for overlapping events. For now drop if it overlaps with - * anything. We can make it smarter later on - */ - if (ble_ll_sched_is_overlap(sch, entry)) { - rc = -1; - break; - } - } - - if (!entry) { - TAILQ_INSERT_TAIL(&g_ble_ll_sched_q, sch, link); - sch->enqueued = 1; - } - -done: - entry = TAILQ_FIRST(&g_ble_ll_sched_q); - if (entry == sch) { - ble_ll_rfmgmt_sched_changed(sch); - } else { - sch = entry; - } - - OS_EXIT_CRITICAL(sr); - - /* Restart timer */ - BLE_LL_ASSERT(sch != NULL); - os_cputime_timer_start(&g_ble_ll_sched_timer, sch->start_time); - - STATS_INC(ble_ll_stats, sync_scheduled); - return rc; -} -#endif - -int -ble_ll_sched_adv_new(struct ble_ll_sched_item *sch, ble_ll_sched_adv_new_cb cb, - void *arg) -{ - os_sr_t sr; - uint32_t adv_start; - uint32_t duration; - struct ble_ll_sched_item *entry; - struct ble_ll_sched_item *orig; - - /* Get length of schedule item */ - duration = sch->end_time - sch->start_time; - orig = sch; - - OS_ENTER_CRITICAL(sr); - entry = ble_ll_sched_insert_if_empty(sch); - if (!entry) { - adv_start = sch->start_time; - } else { - /* XXX: no need to stop timer if not first on list. Modify code? */ - os_cputime_timer_stop(&g_ble_ll_sched_timer); - TAILQ_FOREACH(entry, &g_ble_ll_sched_q, link) { - /* We can insert if before entry in list */ - if ((int32_t)(sch->end_time - entry->start_time) <= 0) { - TAILQ_INSERT_BEFORE(entry, sch, link); - break; - } - - /* Check for overlapping events */ - if (ble_ll_sched_is_overlap(sch, entry)) { - /* Earliest start is end of this event since we overlap */ - sch->start_time = entry->end_time; - sch->end_time = sch->start_time + duration; - } - } - - if (!entry) { - TAILQ_INSERT_TAIL(&g_ble_ll_sched_q, sch, link); - } - adv_start = sch->start_time; - - sch->enqueued = 1; - - /* Restart with head of list */ - sch = TAILQ_FIRST(&g_ble_ll_sched_q); - } - - if (cb) { - cb((struct ble_ll_adv_sm *)orig->cb_arg, adv_start, arg); - } - - if (orig == sch) { - ble_ll_rfmgmt_sched_changed(sch); - } - - OS_EXIT_CRITICAL(sr); - - /* Restart timer */ - BLE_LL_ASSERT(sch != NULL); - os_cputime_timer_start(&g_ble_ll_sched_timer, sch->start_time); - - return 0; -} - -int -ble_ll_sched_periodic_adv(struct ble_ll_sched_item *sch, uint32_t *start, - bool after_overlap) -{ - int rc = 0; - os_sr_t sr; - uint32_t adv_start; - uint32_t duration; - struct ble_ll_sched_item *entry; - struct ble_ll_sched_item *orig = sch; - - /* Get length of schedule item */ - duration = sch->end_time - sch->start_time; - - OS_ENTER_CRITICAL(sr); - entry = ble_ll_sched_insert_if_empty(sch); - if (!entry) { - adv_start = sch->start_time; - } else { - /* XXX: no need to stop timer if not first on list. Modify code? */ - os_cputime_timer_stop(&g_ble_ll_sched_timer); - TAILQ_FOREACH(entry, &g_ble_ll_sched_q, link) { - /* We can insert if before entry in list */ - if ((int32_t)(sch->end_time - entry->start_time) <= 0) { - TAILQ_INSERT_BEFORE(entry, sch, link); - break; - } - - /* Check for overlapping events */ - if (ble_ll_sched_is_overlap(sch, entry)) { - if (after_overlap) { - /* Earliest start is end of this event since we overlap */ - sch->start_time = entry->end_time; - sch->end_time = sch->start_time + duration; - } else { - rc = -1; - break; - } - } - } - - if (!entry) { - TAILQ_INSERT_TAIL(&g_ble_ll_sched_q, sch, link); - } - adv_start = sch->start_time; - - if (!rc) { - sch->enqueued = 1; - } - - /* Restart with head of list */ - sch = TAILQ_FIRST(&g_ble_ll_sched_q); - } - - if (!rc) { - *start = adv_start; - } - - if (orig == sch) { - ble_ll_rfmgmt_sched_changed(sch); - } - - OS_EXIT_CRITICAL(sr); - - /* Restart timer */ - BLE_LL_ASSERT(sch != NULL); - os_cputime_timer_start(&g_ble_ll_sched_timer, sch->start_time); - - return rc; -} - -int -ble_ll_sched_adv_reschedule(struct ble_ll_sched_item *sch, uint32_t *start, - uint32_t max_delay_ticks) -{ - int rc; - os_sr_t sr; - uint32_t orig_start; - uint32_t duration; - uint32_t rand_ticks; - struct ble_ll_sched_item *entry; - struct ble_ll_sched_item *next_sch; - struct ble_ll_sched_item *before; - struct ble_ll_sched_item *start_overlap; - struct ble_ll_sched_item *end_overlap; - - /* Get length of schedule item */ - duration = sch->end_time - sch->start_time; - - /* Add maximum randomization delay to end */ - rand_ticks = max_delay_ticks; - sch->end_time += max_delay_ticks; - - start_overlap = NULL; - end_overlap = NULL; - before = NULL; - rc = 0; - OS_ENTER_CRITICAL(sr); - - entry = ble_ll_sched_insert_if_empty(sch); - if (entry) { - os_cputime_timer_stop(&g_ble_ll_sched_timer); - while (1) { - next_sch = entry->link.tqe_next; - if (ble_ll_sched_is_overlap(sch, entry)) { - if (start_overlap == NULL) { - start_overlap = entry; - end_overlap = entry; - } else { - end_overlap = entry; - } - } else { - if ((int32_t)(sch->end_time - entry->start_time) <= 0) { - before = entry; - break; - } - } - - entry = next_sch; - if (entry == NULL) { - break; - } - } - - /* - * If there is no overlap, we either insert before the 'before' entry - * or we insert at the end if there is no before entry. - */ - if (start_overlap == NULL) { - if (before) { - TAILQ_INSERT_BEFORE(before, sch, link); - } else { - TAILQ_INSERT_TAIL(&g_ble_ll_sched_q, sch, link); - } - } else { - /* - * This item will overlap with others. See if we can fit it in - * with original duration. - */ - before = NULL; - orig_start = sch->start_time; - entry = start_overlap; - sch->end_time = sch->start_time + duration; - while (1) { - next_sch = entry->link.tqe_next; - if ((int32_t)(sch->end_time - entry->start_time) <= 0) { - rand_ticks = entry->start_time - sch->end_time; - before = entry; - TAILQ_INSERT_BEFORE(before, sch, link); - break; - } else { - sch->start_time = entry->end_time; - sch->end_time = sch->start_time + duration; - } - - if (entry == end_overlap) { - rand_ticks = (orig_start + max_delay_ticks) - sch->start_time; - if (rand_ticks > max_delay_ticks) { - /* No place for advertisement. */ - rc = -1; - } else { - if (next_sch == NULL) { - TAILQ_INSERT_TAIL(&g_ble_ll_sched_q, sch, link); - } else { - TAILQ_INSERT_BEFORE(next_sch, sch, link); - } - } - break; - } - entry = next_sch; - BLE_LL_ASSERT(entry != NULL); - } - } - } - - if (!rc) { - sch->enqueued = 1; - if (rand_ticks) { - sch->start_time += rand() % rand_ticks; - } - sch->end_time = sch->start_time + duration; - *start = sch->start_time; - - if (sch == TAILQ_FIRST(&g_ble_ll_sched_q)) { - ble_ll_rfmgmt_sched_changed(sch); - } - } - - OS_EXIT_CRITICAL(sr); - - sch = TAILQ_FIRST(&g_ble_ll_sched_q); - os_cputime_timer_start(&g_ble_ll_sched_timer, sch->start_time); - - return rc; -} - -int -ble_ll_sched_adv_resched_pdu(struct ble_ll_sched_item *sch) -{ - uint8_t lls; - os_sr_t sr; - struct ble_ll_sched_item *entry; - - OS_ENTER_CRITICAL(sr); - - lls = ble_ll_state_get(); - if ((lls == BLE_LL_STATE_ADV) || (lls == BLE_LL_STATE_CONNECTION) || - (lls == BLE_LL_STATE_SYNC)) { - goto adv_resched_pdu_fail; - } - - entry = ble_ll_sched_insert_if_empty(sch); - if (entry) { - /* If we overlap with the first item, simply re-schedule */ - if (ble_ll_sched_is_overlap(sch, entry)) { - goto adv_resched_pdu_fail; - } - os_cputime_timer_stop(&g_ble_ll_sched_timer); - TAILQ_INSERT_BEFORE(entry, sch, link); - sch->enqueued = 1; - } - - ble_ll_rfmgmt_sched_changed(TAILQ_FIRST(&g_ble_ll_sched_q)); - - OS_EXIT_CRITICAL(sr); - os_cputime_timer_start(&g_ble_ll_sched_timer, sch->start_time); - return 0; - -adv_resched_pdu_fail: - OS_EXIT_CRITICAL(sr); - return -1; -} - -/** - * Remove a schedule element - * - * @param sched_type - * - * @return int 0 - removed, 1 - not in the list - */ -int -ble_ll_sched_rmv_elem(struct ble_ll_sched_item *sch) -{ - os_sr_t sr; - struct ble_ll_sched_item *first; - int rc = 1; - - if (!sch) { - return rc; - } - - OS_ENTER_CRITICAL(sr); - if (sch->enqueued) { - first = TAILQ_FIRST(&g_ble_ll_sched_q); - if (first == sch) { - os_cputime_timer_stop(&g_ble_ll_sched_timer); - } - - TAILQ_REMOVE(&g_ble_ll_sched_q, sch, link); - sch->enqueued = 0; - rc = 0; - - if (first == sch) { - first = TAILQ_FIRST(&g_ble_ll_sched_q); - if (first) { - os_cputime_timer_start(&g_ble_ll_sched_timer, first->start_time); - } - ble_ll_rfmgmt_sched_changed(first); - } - } - OS_EXIT_CRITICAL(sr); - - return rc; -} - -void -ble_ll_sched_rmv_elem_type(uint8_t type, sched_remove_cb_func remove_cb) -{ - os_sr_t sr; - struct ble_ll_sched_item *entry; - struct ble_ll_sched_item *first; - - OS_ENTER_CRITICAL(sr); - first = TAILQ_FIRST(&g_ble_ll_sched_q); - - if (!first) { - OS_EXIT_CRITICAL(sr); - return; - } - - TAILQ_FOREACH(entry, &g_ble_ll_sched_q, link) { - if (entry->sched_type == type) { - if (first == entry) { - os_cputime_timer_stop(&g_ble_ll_sched_timer); - first = NULL; - } - - TAILQ_REMOVE(&g_ble_ll_sched_q, entry, link); - remove_cb(entry); - entry->enqueued = 0; - } - } - - if (!first) { - first = TAILQ_FIRST(&g_ble_ll_sched_q); - if (first) { - os_cputime_timer_start(&g_ble_ll_sched_timer, first->start_time); - } - ble_ll_rfmgmt_sched_changed(first); - } - - OS_EXIT_CRITICAL(sr); -} - -/** - * Executes a schedule item by calling the schedule callback function. - * - * Context: Interrupt - * - * @param sch Pointer to schedule item - * - * @return int 0: schedule item is not over; otherwise schedule item is done. - */ -static int -ble_ll_sched_execute_item(struct ble_ll_sched_item *sch) -{ - int rc; - uint8_t lls; - - lls = ble_ll_state_get(); - - ble_ll_trace_u32x3(BLE_LL_TRACE_ID_SCHED, lls, os_cputime_get32(), - sch->start_time); - - if (lls == BLE_LL_STATE_STANDBY) { - goto sched; - } - - /* If aux scan scheduled and LL is in state when scanner is running - * in 3 states: - * BLE_LL_STATE_SCANNING - * BLE_LL_STATE_INITIATING - * BLE_LL_STATE_STANDBY - * - * Let scanner to decide to disable phy or not. - */ - if (sch->sched_type == BLE_LL_SCHED_TYPE_AUX_SCAN) { - if (lls == BLE_LL_STATE_INITIATING || lls == BLE_LL_STATE_SCANNING) { - goto sched; - } - } - - /* - * This is either an advertising event or connection event start. If - * we are scanning or initiating just stop it. - */ - - /* We have to disable the PHY no matter what */ - ble_phy_disable(); - - if (lls == BLE_LL_STATE_SCANNING) { - ble_ll_state_set(BLE_LL_STATE_STANDBY); - ble_ll_scan_halt(); - } else if (lls == BLE_LL_STATE_INITIATING) { - ble_ll_state_set(BLE_LL_STATE_STANDBY); - ble_ll_scan_halt(); - /* PHY is disabled - make sure we do not wait for AUX_CONNECT_RSP */ - ble_ll_conn_reset_pending_aux_conn_rsp(); - } else if (lls == BLE_LL_STATE_ADV) { - STATS_INC(ble_ll_stats, sched_state_adv_errs); - ble_ll_adv_halt(); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - } else if (lls == BLE_LL_STATE_SYNC) { - STATS_INC(ble_ll_stats, sched_state_sync_errs); - ble_ll_sync_halt(); -#endif - } else { - STATS_INC(ble_ll_stats, sched_state_conn_errs); - ble_ll_conn_event_halt(); - } - -sched: - BLE_LL_DEBUG_GPIO(SCHED_ITEM_CB, 1); - BLE_LL_ASSERT(sch->sched_cb); - rc = sch->sched_cb(sch); - BLE_LL_DEBUG_GPIO(SCHED_ITEM_CB, 0); - return rc; -} - -/** - * Run the BLE scheduler. Iterate through all items on the schedule queue. - * - * Context: interrupt (scheduler) - * - * @return int - */ -static void -ble_ll_sched_run(void *arg) -{ - struct ble_ll_sched_item *sch; - - BLE_LL_DEBUG_GPIO(SCHED_RUN, 1); - - /* Look through schedule queue */ - sch = TAILQ_FIRST(&g_ble_ll_sched_q); - if (sch) { -#if (BLE_LL_SCHED_DEBUG == 1) - int32_t dt; - - /* Make sure we have passed the start time of the first event */ - dt = (int32_t)(os_cputime_get32() - sch->start_time); - if (dt > g_ble_ll_sched_max_late) { - g_ble_ll_sched_max_late = dt; - } - if (dt < g_ble_ll_sched_max_early) { - g_ble_ll_sched_max_early = dt; - } -#endif - - /* Remove schedule item and execute the callback */ - TAILQ_REMOVE(&g_ble_ll_sched_q, sch, link); - sch->enqueued = 0; - ble_ll_sched_execute_item(sch); - - /* Restart if there is an item on the schedule */ - sch = TAILQ_FIRST(&g_ble_ll_sched_q); - if (sch) { - os_cputime_timer_start(&g_ble_ll_sched_timer, sch->start_time); - } - ble_ll_rfmgmt_sched_changed(sch); - } - - BLE_LL_DEBUG_GPIO(SCHED_RUN, 0); -} - -/** - * 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 - * - * @return int 0: No events are scheduled 1: there is an upcoming event - */ -int -ble_ll_sched_next_time(uint32_t *next_event_time) -{ - int rc; - os_sr_t sr; - struct ble_ll_sched_item *first; - - rc = 0; - OS_ENTER_CRITICAL(sr); - first = TAILQ_FIRST(&g_ble_ll_sched_q); - if (first) { - *next_event_time = first->start_time; - rc = 1; - } - OS_EXIT_CRITICAL(sr); - - return rc; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -/** - * Called to check if there is place for a planned scan req. - * - * @param chan - * @param phy_mode - * - * @return int 0: Clear for scan req 1: there is an upcoming event - */ -int -ble_ll_sched_scan_req_over_aux_ptr(uint32_t chan, uint8_t phy_mode) -{ - struct ble_ll_sched_item *sch; - uint32_t usec_dur; - uint32_t now = os_cputime_get32(); - - /* Lets calculate roughly how much time we need for scan req and scan rsp */ - usec_dur = ble_ll_pdu_tx_time_get(BLE_SCAN_REQ_LEN, phy_mode); - if (chan >= BLE_PHY_NUM_DATA_CHANS) { - usec_dur += ble_ll_pdu_tx_time_get(BLE_SCAN_RSP_MAX_LEN, phy_mode); - } else { - usec_dur += ble_ll_pdu_tx_time_get(BLE_SCAN_RSP_MAX_EXT_LEN, phy_mode); - } - - sch = TAILQ_FIRST(&g_ble_ll_sched_q); - while (sch) { - /* Let's check if there is no scheduled item which want to start within - * given usecs.*/ - if ((int32_t)(sch->start_time - now + os_cputime_usecs_to_ticks(usec_dur)) > 0) { - /* We are fine. Have time for scan req */ - return 0; - } - - /* There is something in the scheduler. If it is not aux ptr we assume - * it is more important that scan req - */ - if (sch->sched_type != BLE_LL_SCHED_TYPE_AUX_SCAN) { - return 1; - } - - ble_ll_scan_end_adv_evt((struct ble_ll_aux_data *)sch->cb_arg); - TAILQ_REMOVE(&g_ble_ll_sched_q, sch, link); - sch->enqueued = 0; - sch = TAILQ_FIRST(&g_ble_ll_sched_q); - } - return 0; -} - -/** - * Called to schedule a aux scan. - * - * Context: Interrupt - * - * @param ble_hdr - * @param scansm - * @param aux_scan - * - * @return 0 on success, 1 otherwise - */ -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 rc = 1; - os_sr_t sr; - uint32_t off_ticks; - uint32_t off_rem_usecs; - uint32_t start_time; - uint32_t start_time_rem_usecs; - uint32_t end_time; - uint32_t dur; - struct ble_ll_sched_item *entry; - struct ble_ll_sched_item *sch; - int phy_mode; - - sch = &aux_scan->sch; - BLE_LL_ASSERT(sch->cb_arg == NULL); - - off_ticks = os_cputime_usecs_to_ticks(aux_scan->offset); - off_rem_usecs = aux_scan->offset - os_cputime_ticks_to_usecs(off_ticks); - - start_time = ble_hdr->beg_cputime + off_ticks; - start_time_rem_usecs = ble_hdr->rem_usecs + off_rem_usecs; - if (start_time_rem_usecs >= 31) { - start_time++; - start_time_rem_usecs -= 31; - } - start_time -= g_ble_ll_sched_offset_ticks; - - /* Let's calculate time we reserve for aux packet. For now we assume to wait - * for fixed number of bytes and handle possible interrupting it in - * ble_ll_sched_execute_item(). This is because aux packet can be up to - * 256bytes and we don't want to block sched that long - */ - phy_mode = ble_ll_phy_to_phy_mode(aux_scan->aux_phy, - BLE_HCI_LE_PHY_CODED_ANY); - dur = ble_ll_pdu_tx_time_get(MYNEWT_VAL(BLE_LL_SCHED_SCAN_AUX_PDU_LEN), - phy_mode); - end_time = start_time + os_cputime_usecs_to_ticks(dur); - - sch->start_time = start_time; - sch->remainder = start_time_rem_usecs; - sch->end_time = end_time; - - OS_ENTER_CRITICAL(sr); - - if (!ble_ll_sched_insert_if_empty(sch)) { - /* Nothing in schedule. Schedule as soon as possible - * If we are here it means sch has been added to the scheduler */ - rc = 0; - goto done; - } - - /* Try to find slot for aux scan. */ - os_cputime_timer_stop(&g_ble_ll_sched_timer); - TAILQ_FOREACH(entry, &g_ble_ll_sched_q, link) { - /* We can insert if before entry in list */ - if ((int32_t)(sch->end_time - entry->start_time) <= 0) { - rc = 0; - TAILQ_INSERT_BEFORE(entry, sch, link); - sch->enqueued = 1; - break; - } - - /* Check for overlapping events. For now drop if it overlaps with - * anything. We can make it smarter later on - */ - if (ble_ll_sched_is_overlap(sch, entry)) { - break; - } - } - - if (!entry) { - rc = 0; - TAILQ_INSERT_TAIL(&g_ble_ll_sched_q, sch, link); - sch->enqueued = 1; - } - -done: - - if (rc == 0) { - sch->cb_arg = ble_ll_scan_aux_data_ref(aux_scan); - STATS_INC(ble_ll_stats, aux_scheduled); - } - - /* Get head of list to restart timer */ - entry = TAILQ_FIRST(&g_ble_ll_sched_q); - if (entry == sch) { - ble_ll_rfmgmt_sched_changed(sch); - } else { - sch = entry; - } - - OS_EXIT_CRITICAL(sr); - - /* Restart timer */ - BLE_LL_ASSERT(sch != NULL); - os_cputime_timer_start(&g_ble_ll_sched_timer, sch->start_time); - - return rc; -} -#endif - -#if MYNEWT_VAL(BLE_LL_DTM) -int ble_ll_sched_dtm(struct ble_ll_sched_item *sch) -{ - int rc; - os_sr_t sr; - struct ble_ll_sched_item *entry; - - OS_ENTER_CRITICAL(sr); - - if (!ble_ll_sched_insert_if_empty(sch)) { - /* Nothing in schedule. Schedule as soon as possible - * If we are here it means sch has been added to the scheduler */ - rc = 0; - goto done; - } - - /* Try to find slot for test. */ - os_cputime_timer_stop(&g_ble_ll_sched_timer); - TAILQ_FOREACH(entry, &g_ble_ll_sched_q, link) { - /* We can insert if before entry in list */ - if (sch->end_time <= entry->start_time) { - rc = 0; - TAILQ_INSERT_BEFORE(entry, sch, link); - sch->enqueued = 1; - break; - } - - /* Check for overlapping events. For now drop if it overlaps with - * anything. We can make it smarter later on - */ - if (ble_ll_sched_is_overlap(sch, entry)) { - OS_EXIT_CRITICAL(sr); - return -1; - } - } - - if (!entry) { - rc = 0; - TAILQ_INSERT_TAIL(&g_ble_ll_sched_q, sch, link); - sch->enqueued = 1; - } - -done: - - /* Get head of list to restart timer */ - sch = TAILQ_FIRST(&g_ble_ll_sched_q); - - ble_ll_rfmgmt_sched_changed(sch); - - OS_EXIT_CRITICAL(sr); - - /* Restart timer */ - BLE_LL_ASSERT(sch != NULL); - os_cputime_timer_start(&g_ble_ll_sched_timer, sch->start_time); - - return rc; -} -#endif -/** - * Stop the scheduler - * - * Context: Link Layer task - */ -void -ble_ll_sched_stop(void) -{ - os_cputime_timer_stop(&g_ble_ll_sched_timer); -} - -/** - * Initialize the scheduler. Should only be called once and should be called - * before any of the scheduler API are called. - * - * @return int - */ -int -ble_ll_sched_init(void) -{ - BLE_LL_DEBUG_GPIO_INIT(SCHED_ITEM_CB); - BLE_LL_DEBUG_GPIO_INIT(SCHED_RUN); - - /* - * Initialize max early to large negative number. This is used - * to determine the worst-case "early" time the schedule was called. Dont - * expect this to be less than -3 or -4. - */ -#if (BLE_LL_SCHED_DEBUG == 1) - g_ble_ll_sched_max_early = -50000; -#endif - - /* - * This is the offset from the start of the scheduled item until the actual - * tx/rx should occur, in ticks. We also "round up" to the nearest tick. - */ - g_ble_ll_sched_offset_ticks = - (uint8_t) os_cputime_usecs_to_ticks(XCVR_TX_SCHED_DELAY_USECS + 30); - - /* Initialize cputimer for the scheduler */ - os_cputime_timer_init(&g_ble_ll_sched_timer, ble_ll_sched_run, NULL); - -#if MYNEWT_VAL(BLE_LL_STRICT_CONN_SCHEDULING) - memset(&g_ble_ll_sched_data, 0, sizeof(struct ble_ll_sched_obj)); - g_ble_ll_sched_data.sch_ticks_per_period = - os_cputime_usecs_to_ticks(MYNEWT_VAL(BLE_LL_USECS_PER_PERIOD)); - g_ble_ll_sched_data.sch_ticks_per_epoch = BLE_LL_SCHED_PERIODS * - g_ble_ll_sched_data.sch_ticks_per_period; -#endif - - return 0; -} - -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_supp_cmd.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_supp_cmd.c deleted file mode 100644 index 6ee912fa3..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_supp_cmd.c +++ /dev/null @@ -1,461 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include - -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/include/nimble/hci_common.h" -#include "../include/controller/ble_ll.h" -#include "../include/controller/ble_ll_hci.h" - -/* Octet 0 */ -#define BLE_SUPP_CMD_DISCONNECT (1 << 5) -#define BLE_LL_SUPP_CMD_OCTET_0 (BLE_SUPP_CMD_DISCONNECT) - -/* Octet 5 */ -#define BLE_SUPP_CMD_SET_EVENT_MASK (1 << 6) -#define BLE_LL_SUPP_CMD_OCTET_5 (BLE_SUPP_CMD_SET_EVENT_MASK) - -/* Octet 10 */ -#define BLE_SUPP_CMD_RD_TX_PWR (0 << 2) -#define BLE_LL_SUPP_CMD_OCTET_10 (BLE_SUPP_CMD_RD_TX_PWR) - -/* Octet 14 */ -#define BLE_SUPP_CMD_RD_LOC_VER (1 << 3) -#define BLE_SUPP_CMD_RD_LOC_SUPP_FEAT (1 << 5) -#define BLE_LL_SUPP_CMD_OCTET_14 \ -( \ - BLE_SUPP_CMD_RD_LOC_VER | \ - BLE_SUPP_CMD_RD_LOC_SUPP_FEAT \ -) - -/* Octet 15 */ -#define BLE_SUPP_CMD_RD_BD_ADDR (1 << 1) -#define BLE_SUPP_CMD_RD_RSSI (1 << 5) - -#define BLE_LL_SUPP_CMD_OCTET_15 \ -( \ - BLE_SUPP_CMD_RD_BD_ADDR | \ - BLE_SUPP_CMD_RD_RSSI \ -) - -/* Octet 25 */ -#define BLE_SUPP_CMD_LE_SET_EV_MASK (1 << 0) -#define BLE_SUPP_CMD_LE_RD_BUF_SIZE (1 << 1) -#define BLE_SUPP_CMD_LE_RD_LOC_FEAT (1 << 2) -#define BLE_SUPP_CMD_LE_SET_RAND_ADDR (1 << 4) -#define BLE_SUPP_CMD_LE_SET_ADV_PARAMS (1 << 5) -#define BLE_SUPP_CMD_LE_SET_ADV_TX_PWR (1 << 6) -#define BLE_SUPP_CMD_LE_SET_ADV_DATA (1 << 7) - -#define BLE_LL_SUPP_CMD_OCTET_25 \ -( \ - BLE_SUPP_CMD_LE_SET_EV_MASK | \ - BLE_SUPP_CMD_LE_RD_BUF_SIZE | \ - BLE_SUPP_CMD_LE_RD_LOC_FEAT | \ - BLE_SUPP_CMD_LE_SET_RAND_ADDR | \ - BLE_SUPP_CMD_LE_SET_ADV_PARAMS | \ - BLE_SUPP_CMD_LE_SET_ADV_TX_PWR | \ - BLE_SUPP_CMD_LE_SET_ADV_DATA \ -) - -/* Octet 26 */ -#define BLE_SUPP_CMD_LE_SET_SCAN_RSP_DATA (1 << 0) -#define BLE_SUPP_CMD_LE_SET_ADV_ENABLE (1 << 1) -#define BLE_SUPP_CMD_LE_SET_SCAN_PARAMS (1 << 2) -#define BLE_SUPP_CMD_LE_SET_SCAN_ENABLE (1 << 3) -#define BLE_SUPP_CMD_LE_CREATE_CONN (1 << 4) -#define BLE_SUPP_CMD_LE_CREATE_CONN_CANCEL (1 << 5) -#define BLE_SUPP_CMD_LE_RD_WHITELIST_SIZE (1 << 6) -#define BLE_SUPP_CMD_LE_CLR_WHITELIST (1 << 7) - -#define BLE_LL_SUPP_CMD_OCTET_26 \ -( \ - BLE_SUPP_CMD_LE_SET_SCAN_RSP_DATA | \ - BLE_SUPP_CMD_LE_SET_ADV_ENABLE | \ - BLE_SUPP_CMD_LE_SET_SCAN_PARAMS | \ - BLE_SUPP_CMD_LE_SET_SCAN_ENABLE | \ - BLE_SUPP_CMD_LE_CREATE_CONN | \ - BLE_SUPP_CMD_LE_CREATE_CONN_CANCEL | \ - BLE_SUPP_CMD_LE_RD_WHITELIST_SIZE | \ - BLE_SUPP_CMD_LE_CLR_WHITELIST \ -) - -/* Octet 27 */ -#define BLE_SUPP_CMD_LE_ADD_DEV_WHITELIST (1 << 0) -#define BLE_SUPP_CMD_LE_RMV_DEV_WHITELIST (1 << 1) -#define BLE_SUPP_CMD_LE_CONN_UPDATE (1 << 2) -#define BLE_SUPP_CMD_LE_SET_HOST_CHAN_CLASS (1 << 3) -#define BLE_SUPP_CMD_LE_RD_CHAN_MAP (1 << 4) -#define BLE_SUPP_CMD_LE_RD_REM_USED_FEAT (1 << 5) -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) -#define BLE_SUPP_CMD_LE_ENCRYPT (1 << 6) -#else -#define BLE_SUPP_CMD_LE_ENCRYPT (0 << 6) -#endif -#define BLE_SUPP_CMD_LE_RAND (1 << 7) - -#define BLE_LL_SUPP_CMD_OCTET_27 \ -( \ - BLE_SUPP_CMD_LE_ENCRYPT | \ - BLE_SUPP_CMD_LE_RAND | \ - BLE_SUPP_CMD_LE_ADD_DEV_WHITELIST | \ - BLE_SUPP_CMD_LE_RMV_DEV_WHITELIST | \ - BLE_SUPP_CMD_LE_CONN_UPDATE | \ - BLE_SUPP_CMD_LE_SET_HOST_CHAN_CLASS | \ - BLE_SUPP_CMD_LE_RD_CHAN_MAP | \ - BLE_SUPP_CMD_LE_RD_REM_USED_FEAT \ -) - -/* Octet 28 */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) -#define BLE_SUPP_CMD_LE_START_ENCRYPT (1 << 0) -#define BLE_SUPP_CMD_LE_LTK_REQ_REPLY (1 << 1) -#define BLE_SUPP_CMD_LE_LTK_REQ_NEG_REPLY (1 << 2) -#else -#define BLE_SUPP_CMD_LE_START_ENCRYPT (0 << 0) -#define BLE_SUPP_CMD_LE_LTK_REQ_REPLY (0 << 1) -#define BLE_SUPP_CMD_LE_LTK_REQ_NEG_REPLY (0 << 2) -#endif -#define BLE_SUPP_CMD_LE_READ_SUPP_STATES (1 << 3) - -#if MYNEWT_VAL(BLE_LL_DTM) -#define BLE_SUPP_CMD_LE_RX_TEST (1 << 4) -#define BLE_SUPP_CMD_LE_TX_TEST (1 << 5) -#define BLE_SUPP_CMD_LE_TEST_END (1 << 6) - -#else -#define BLE_SUPP_CMD_LE_RX_TEST (0 << 4) -#define BLE_SUPP_CMD_LE_TX_TEST (0 << 5) -#define BLE_SUPP_CMD_LE_TEST_END (0 << 6) -#endif - -#define BLE_LL_SUPP_CMD_OCTET_28 \ -( \ - BLE_SUPP_CMD_LE_START_ENCRYPT | \ - BLE_SUPP_CMD_LE_LTK_REQ_REPLY | \ - BLE_SUPP_CMD_LE_LTK_REQ_NEG_REPLY | \ - BLE_SUPP_CMD_LE_READ_SUPP_STATES | \ - BLE_SUPP_CMD_LE_RX_TEST | \ - BLE_SUPP_CMD_LE_TX_TEST | \ - BLE_SUPP_CMD_LE_TEST_END \ -) - -/* Octet 33 */ -#define BLE_SUPP_CMD_LE_REM_CONN_PRR (1 << 4) -#define BLE_SUPP_CMD_LE_REM_CONN_PRNR (1 << 5) -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_DATA_LEN_EXT) -#define BLE_SUPP_CMD_LE_SET_DATALEN (1 << 6) -#define BLE_SUPP_CMD_LE_RD_SUGG_DATALEN (1 << 7) -#else -#define BLE_SUPP_CMD_LE_SET_DATALEN (0 << 6) -#define BLE_SUPP_CMD_LE_RD_SUGG_DATALEN (0 << 7) -#endif - -#define BLE_LL_SUPP_CMD_OCTET_33 \ -( \ - BLE_SUPP_CMD_LE_REM_CONN_PRR | \ - BLE_SUPP_CMD_LE_REM_CONN_PRNR | \ - BLE_SUPP_CMD_LE_SET_DATALEN | \ - BLE_SUPP_CMD_LE_RD_SUGG_DATALEN \ -) - -/* Octet 34 */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_DATA_LEN_EXT) -#define BLE_SUPP_CMD_LE_WR_SUGG_DATALEN (1 << 0) -#else -#define BLE_SUPP_CMD_LE_WR_SUGG_DATALEN (0 << 0) -#endif -#define BLE_SUPP_CMD_LE_READ_LOCAL_P256_PK (0 << 1) -#define BLE_SUPP_CMD_LE_GENERATE_DH_KEY (0 << 2) -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) -#define BLE_SUPP_CMD_LE_ADD_RESOLV_LIST (1 << 3) -#define BLE_SUPP_CMD_LE_REMOVE_RESOLV_LIST (1 << 4) -#define BLE_SUPP_CMD_LE_CLEAR_RESOLV_LIST (1 << 5) -#define BLE_SUPP_CMD_LE_RD_RESOLV_SIZE (1 << 6) -#define BLE_SUPP_CMD_LE_RD_PEER_RESV_ADDR (1 << 7) -#else -#define BLE_SUPP_CMD_LE_ADD_RESOLV_LIST (0 << 3) -#define BLE_SUPP_CMD_LE_REMOVE_RESOLV_LIST (0 << 4) -#define BLE_SUPP_CMD_LE_CLEAR_RESOLV_LIST (0 << 5) -#define BLE_SUPP_CMD_LE_RD_RESOLV_SIZE (0 << 6) -#define BLE_SUPP_CMD_LE_RD_PEER_RESV_ADDR (0 << 7) -#endif - -#define BLE_LL_SUPP_CMD_OCTET_34 \ -( \ - BLE_SUPP_CMD_LE_WR_SUGG_DATALEN | \ - BLE_SUPP_CMD_LE_READ_LOCAL_P256_PK | \ - BLE_SUPP_CMD_LE_GENERATE_DH_KEY | \ - BLE_SUPP_CMD_LE_ADD_RESOLV_LIST | \ - BLE_SUPP_CMD_LE_REMOVE_RESOLV_LIST | \ - BLE_SUPP_CMD_LE_CLEAR_RESOLV_LIST | \ - BLE_SUPP_CMD_LE_RD_RESOLV_SIZE | \ - BLE_SUPP_CMD_LE_RD_PEER_RESV_ADDR \ -) - -/* Octet 35 */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) -#define BLE_SUPP_CMD_LE_RD_LOCAL_RESV_ADDR (1 << 0) -#define BLE_SUPP_CMD_LE_SET_ADDR_RES_EN (1 << 1) -#define BLE_SUPP_CMD_LE_SET_RESV_ADDR_TMO (1 << 2) -#else -#define BLE_SUPP_CMD_LE_RD_LOCAL_RESV_ADDR (0 << 0) -#define BLE_SUPP_CMD_LE_SET_ADDR_RES_EN (0 << 1) -#define BLE_SUPP_CMD_LE_SET_RESV_ADDR_TMO (0 << 2) -#endif -#define BLE_SUPP_CMD_LE_RD_MAX_DATALEN (1 << 3) -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) -#define BLE_SUPP_CMD_LE_READ_PHY (1 << 4) -#define BLE_SUPP_CMD_LE_SET_DEFAULT_PHY (1 << 5) -#define BLE_SUPP_CMD_LE_SET_PHY (1 << 6) -#else -#define BLE_SUPP_CMD_LE_READ_PHY (0 << 4) -#define BLE_SUPP_CMD_LE_SET_DEFAULT_PHY (0 << 5) -#define BLE_SUPP_CMD_LE_SET_PHY (0 << 6) -#endif - -#if MYNEWT_VAL(BLE_LL_DTM) -#define BLE_SUPP_CMD_LE_ENHANCED_RX_TEST (1 << 7) -#else -#define BLE_SUPP_CMD_LE_ENHANCED_RX_TEST (0 << 7) -#endif - -#define BLE_LL_SUPP_CMD_OCTET_35 \ -( \ - BLE_SUPP_CMD_LE_RD_LOCAL_RESV_ADDR | \ - BLE_SUPP_CMD_LE_SET_ADDR_RES_EN | \ - BLE_SUPP_CMD_LE_SET_RESV_ADDR_TMO | \ - BLE_SUPP_CMD_LE_RD_MAX_DATALEN | \ - BLE_SUPP_CMD_LE_READ_PHY | \ - BLE_SUPP_CMD_LE_SET_DEFAULT_PHY | \ - BLE_SUPP_CMD_LE_SET_PHY | \ - BLE_SUPP_CMD_LE_ENHANCED_RX_TEST \ -) - -/* Octet 36 */ -#if MYNEWT_VAL(BLE_LL_DTM) -#define BLE_SUPP_CMD_LE_ENHANCED_TX_TEST (1 << 0) -#else -#define BLE_SUPP_CMD_LE_ENHANCED_TX_TEST (0 << 0) -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -#define BLE_SUPP_CMD_LE_SET_ADVS_RAND_ADDR (1 << 1) -#define BLE_SUPP_CMD_LE_SET_EXT_ADV_PARAM (1 << 2) -#define BLE_SUPP_CMD_LE_SET_EXT_ADV_DATA (1 << 3) -#define BLE_SUPP_CMD_LE_SET_EXT_SCAN_RSP (1 << 4) -#define BLE_SUPP_CMD_LE_SET_EXT_ADV_ENABLE (1 << 5) -#define BLE_SUPP_CMD_LE_RD_MAX_ADV_DATA_LEN (1 << 6) -#define BLE_SUPP_CMD_LE_RD_NUM_SUPP_ADVS (1 << 7) -#else -#define BLE_SUPP_CMD_LE_SET_ADVS_RAND_ADDR (0 << 1) -#define BLE_SUPP_CMD_LE_SET_EXT_ADV_PARAM (0 << 2) -#define BLE_SUPP_CMD_LE_SET_EXT_ADV_DATA (0 << 3) -#define BLE_SUPP_CMD_LE_SET_EXT_SCAN_RSP (0 << 4) -#define BLE_SUPP_CMD_LE_SET_EXT_ADV_ENABLE (0 << 5) -#define BLE_SUPP_CMD_LE_RD_MAX_ADV_DATA_LEN (0 << 6) -#define BLE_SUPP_CMD_LE_RD_NUM_SUPP_ADVS (0 << 7) -#endif - -#define BLE_LL_SUPP_CMD_OCTET_36 \ -( \ - BLE_SUPP_CMD_LE_ENHANCED_TX_TEST | \ - BLE_SUPP_CMD_LE_SET_ADVS_RAND_ADDR | \ - BLE_SUPP_CMD_LE_SET_EXT_ADV_PARAM | \ - BLE_SUPP_CMD_LE_SET_EXT_ADV_DATA | \ - BLE_SUPP_CMD_LE_SET_EXT_SCAN_RSP | \ - BLE_SUPP_CMD_LE_SET_EXT_ADV_ENABLE | \ - BLE_SUPP_CMD_LE_RD_MAX_ADV_DATA_LEN | \ - BLE_SUPP_CMD_LE_RD_NUM_SUPP_ADVS \ -) - -/* Octet 37 */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -#define BLE_SUPP_CMD_LE_REMOVE_ADVS (1 << 0) -#define BLE_SUPP_CMD_LE_CLEAR_ADVS (1 << 1) -#else -#define BLE_SUPP_CMD_LE_REMOVE_ADVS (0 << 0) -#define BLE_SUPP_CMD_LE_CLEAR_ADVS (0 << 1) -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) -#define BLE_SUPP_CMD_LE_SET_PADV_PARAM (1 << 2) -#define BLE_SUPP_CMD_LE_SET_PADV_DATA (1 << 3) -#define BLE_SUPP_CMD_LE_SET_PADV_ENABLE (1 << 4) -#else -#define BLE_SUPP_CMD_LE_SET_PADV_PARAM (0 << 2) -#define BLE_SUPP_CMD_LE_SET_PADV_DATA (0 << 3) -#define BLE_SUPP_CMD_LE_SET_PADV_ENABLE (0 << 4) -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -#define BLE_SUPP_CMD_LE_SET_EXT_SCAN_PARAM (1 << 5) -#define BLE_SUPP_CMD_LE_SET_EXT_SCAN_ENABLE (1 << 6) -#define BLE_SUPP_CMD_LE_EXT_CREATE_CONN (1 << 7) -#else -#define BLE_SUPP_CMD_LE_SET_EXT_SCAN_PARAM (0 << 5) -#define BLE_SUPP_CMD_LE_SET_EXT_SCAN_ENABLE (0 << 6) -#define BLE_SUPP_CMD_LE_EXT_CREATE_CONN (0 << 7) -#endif - -#define BLE_LL_SUPP_CMD_OCTET_37 \ -( \ - BLE_SUPP_CMD_LE_REMOVE_ADVS | \ - BLE_SUPP_CMD_LE_CLEAR_ADVS | \ - BLE_SUPP_CMD_LE_SET_PADV_PARAM | \ - BLE_SUPP_CMD_LE_SET_PADV_DATA | \ - BLE_SUPP_CMD_LE_SET_PADV_ENABLE | \ - BLE_SUPP_CMD_LE_SET_EXT_SCAN_PARAM | \ - BLE_SUPP_CMD_LE_SET_EXT_SCAN_ENABLE | \ - BLE_SUPP_CMD_LE_EXT_CREATE_CONN \ -) - -/* Octet 38 */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) -#define BLE_SUPP_CMD_LE_PADV_CREATE_SYNC (1 << 0) -#define BLE_SUPP_CMD_LE_PADV_CREATE_SYNC_C (1 << 1) -#define BLE_SUPP_CMD_LE_PADV_TERMINATE_SYNC (1 << 2) -#define BLE_SUPP_CMD_LE_ADD_PADV_LIST (1 << 3) -#define BLE_SUPP_CMD_LE_REMOVE_PADV_LIST (1 << 4) -#define BLE_SUPP_CMD_LE_CLEAR_PADV_LIST (1 << 5) -#define BLE_SUPP_CMD_LE_RD_PADV_LIST_SIZE (1 << 6) -#else -#define BLE_SUPP_CMD_LE_PADV_CREATE_SYNC (0 << 0) -#define BLE_SUPP_CMD_LE_PADV_CREATE_SYNC_C (0 << 1) -#define BLE_SUPP_CMD_LE_PADV_TERMINATE_SYNC (0 << 2) -#define BLE_SUPP_CMD_LE_ADD_PADV_LIST (0 << 3) -#define BLE_SUPP_CMD_LE_REMOVE_PADV_LIST (0 << 4) -#define BLE_SUPP_CMD_LE_CLEAR_PADV_LIST (0 << 5) -#define BLE_SUPP_CMD_LE_RD_PADV_LIST_SIZE (0 << 6) -#endif -#define BLE_SUPP_CMD_LE_RD_TX_POWER (1 << 7) - -#define BLE_LL_SUPP_CMD_OCTET_38 \ -( \ - BLE_SUPP_CMD_LE_PADV_CREATE_SYNC | \ - BLE_SUPP_CMD_LE_PADV_CREATE_SYNC_C | \ - BLE_SUPP_CMD_LE_PADV_TERMINATE_SYNC | \ - BLE_SUPP_CMD_LE_ADD_PADV_LIST | \ - BLE_SUPP_CMD_LE_REMOVE_PADV_LIST | \ - BLE_SUPP_CMD_LE_CLEAR_PADV_LIST | \ - BLE_SUPP_CMD_LE_RD_PADV_LIST_SIZE | \ - BLE_SUPP_CMD_LE_RD_TX_POWER \ -) - -/* Octet 39 */ -#define BLE_SUPP_CMD_LE_RD_RF_PATH_COMP (1 << 0) -#define BLE_SUPP_CMD_LE_WR_RF_PATH_COMP (1 << 1) -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) -#define BLE_SUPP_CMD_LE_SET_PRIVACY_MODE (1 << 2) -#else -#define BLE_SUPP_CMD_LE_SET_PRIVACY_MODE (0 << 2) -#endif - -#define BLE_LL_SUPP_CMD_OCTET_39 \ -( \ - BLE_SUPP_CMD_LE_RD_RF_PATH_COMP | \ - BLE_SUPP_CMD_LE_WR_RF_PATH_COMP | \ - BLE_SUPP_CMD_LE_SET_PRIVACY_MODE \ -) - -/* Octet 40 */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) && MYNEWT_VAL(BLE_VERSION) >= 51 -#define BLE_SUPP_CMD_LE_PADV_RECV_ENABLE (1 << 5) -#else -#define BLE_SUPP_CMD_LE_PADV_RECV_ENABLE (0 << 5) -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) -#define BLE_SUPP_CMD_LE_PADV_SYNC_TRANSFER (1 << 6) -#define BLE_SUPP_CMD_LE_PADV_SET_INFO_TRANSFER (1 << 7) -#else -#define BLE_SUPP_CMD_LE_PADV_SYNC_TRANSFER (0 << 6) -#define BLE_SUPP_CMD_LE_PADV_SET_INFO_TRANSFER (0 << 7) -#endif - -#define BLE_LL_SUPP_CMD_OCTET_40 \ -( \ - BLE_SUPP_CMD_LE_PADV_RECV_ENABLE | \ - BLE_SUPP_CMD_LE_PADV_SYNC_TRANSFER | \ - BLE_SUPP_CMD_LE_PADV_SET_INFO_TRANSFER \ -) - -/* Octet 41 */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) -#define BLE_SUPP_CMD_LE_PADV_SYNC_TRANSFER_PARAMS (1 << 0) -#define BLE_SUPP_CMD_LE_PADV_DEFAULT_SYNC_TRANSFER_PARAMS (1 << 1) -#else -#define BLE_SUPP_CMD_LE_PADV_SYNC_TRANSFER_PARAMS (0 << 0) -#define BLE_SUPP_CMD_LE_PADV_DEFAULT_SYNC_TRANSFER_PARAMS (0 << 1) -#endif -#define BLE_LL_SUPP_CMD_OCTET_41 \ -( \ - BLE_SUPP_CMD_LE_PADV_SYNC_TRANSFER_PARAMS | \ - BLE_SUPP_CMD_LE_PADV_DEFAULT_SYNC_TRANSFER_PARAMS \ -) - -/* Defines the array of supported commands */ -const uint8_t g_ble_ll_supp_cmds[BLE_LL_SUPP_CMD_LEN] = -{ - BLE_LL_SUPP_CMD_OCTET_0, /* Octet 0 */ - 0, - 0, - 0, - 0, - BLE_LL_SUPP_CMD_OCTET_5, - 0, - 0, - 0, /* Octet 8 */ - 0, - BLE_LL_SUPP_CMD_OCTET_10, - 0, - 0, - 0, - BLE_LL_SUPP_CMD_OCTET_14, - BLE_LL_SUPP_CMD_OCTET_15, - 0, /* Octet 16 */ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, /* Octet 24 */ - BLE_LL_SUPP_CMD_OCTET_25, - BLE_LL_SUPP_CMD_OCTET_26, - BLE_LL_SUPP_CMD_OCTET_27, - BLE_LL_SUPP_CMD_OCTET_28, - 0, - 0, - 0, - 0, /* Octet 32 */ - BLE_LL_SUPP_CMD_OCTET_33, - BLE_LL_SUPP_CMD_OCTET_34, - BLE_LL_SUPP_CMD_OCTET_35, - BLE_LL_SUPP_CMD_OCTET_36, - BLE_LL_SUPP_CMD_OCTET_37, - BLE_LL_SUPP_CMD_OCTET_38, - BLE_LL_SUPP_CMD_OCTET_39, - BLE_LL_SUPP_CMD_OCTET_40, /* Octet 40 */ - BLE_LL_SUPP_CMD_OCTET_41, -}; - -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_sync.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_sync.c deleted file mode 100644 index 231a4d633..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_sync.c +++ /dev/null @@ -1,2248 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include - -#include "nimble/porting/nimble/include/syscfg/syscfg.h" - -#include "../include/controller/ble_ll.h" -#include "../include/controller/ble_ll_hci.h" -#include "../include/controller/ble_ll_sync.h" -#include "../include/controller/ble_ll_utils.h" -#include "../include/controller/ble_ll_sched.h" -#include "../include/controller/ble_ll_whitelist.h" -#include "../include/controller/ble_ll_scan.h" -#include "../include/controller/ble_ll_resolv.h" -#include "../include/controller/ble_ll_rfmgmt.h" - -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/hci_common.h" -#include "nimble/nimble/include/nimble/ble_hci_trans.h" - -#include "ble_ll_conn_priv.h" - -#include "nimble/porting/nimble/include/stats/stats.h" - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV) - -/* defines number of events that can be lost during sync establishment - * before failed to be established error is reported - */ -#define BLE_LL_SYNC_ESTABLISH_CNT 6 - -#define BLE_LL_SYNC_CNT MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_CNT) -#define BLE_LL_SYNC_LIST_CNT MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_LIST_CNT) - -#define BLE_LL_SYNC_SM_FLAG_RESERVED 0x0001 -#define BLE_LL_SYNC_SM_FLAG_ESTABLISHING 0x0002 -#define BLE_LL_SYNC_SM_FLAG_ESTABLISHED 0x0004 -#define BLE_LL_SYNC_SM_FLAG_SET_ANCHOR 0x0008 -#define BLE_LL_SYNC_SM_FLAG_OFFSET_300 0x0010 -#define BLE_LL_SYNC_SM_FLAG_SYNC_INFO 0x0020 -#define BLE_LL_SYNC_SM_FLAG_DISABLED 0x0040 -#define BLE_LL_SYNC_SM_FLAG_ADDR_RESOLVED 0x0080 -#define BLE_LL_SYNC_SM_FLAG_HCI_TRUNCATED 0x0100 - -#define BLE_LL_SYNC_CHMAP_LEN 5 -#define BLE_LL_SYNC_ITVL_USECS 1250 - -struct ble_ll_sync_sm { - uint16_t flags; - - uint8_t adv_sid; - uint8_t adv_addr[BLE_DEV_ADDR_LEN]; - uint8_t adv_addr_type; - - uint8_t sca; - uint8_t chanmap[BLE_LL_SYNC_CHMAP_LEN]; - uint8_t num_used_chans; - - uint8_t chan_index; - uint8_t chan_chain; - - uint8_t phy_mode; - - uint8_t sync_pending_cnt; - - uint32_t timeout; - uint16_t skip; - - uint16_t itvl; - uint8_t itvl_usecs; - uint32_t itvl_ticks; - - uint32_t crcinit; /* only 3 bytes are used */ - uint32_t access_addr; - uint16_t event_cntr; - uint16_t channel_id; - - uint32_t window_widening; - uint32_t last_anchor_point; - uint32_t anchor_point; - uint8_t anchor_point_usecs; - - struct ble_ll_sched_item sch; - - struct ble_npl_event sync_ev_end; - - uint8_t *next_report; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - struct ble_ll_conn_sm *transfer_conn; - uint8_t *transfer_received_ev; - uint16_t transfer_id; - uint16_t event_cntr_last_received; - uint8_t adv_addr_rpa[6]; -#endif -}; - -static struct ble_ll_sync_sm g_ble_ll_sync_sm[BLE_LL_SYNC_CNT]; - -static struct { - uint8_t adv_sid; - uint8_t adv_addr[BLE_DEV_ADDR_LEN]; - uint8_t adv_addr_type; -} g_ble_ll_sync_adv_list[BLE_LL_SYNC_LIST_CNT]; - -static struct { - uint32_t timeout; - uint16_t max_skip; - uint16_t options; -} g_ble_ll_sync_create_params; - -/* if this is set HCI LE Sync Create is pending */ -static uint8_t *g_ble_ll_sync_create_comp_ev; - -static struct ble_ll_sync_sm *g_ble_ll_sync_sm_current; - -static int -ble_ll_sync_on_list(const uint8_t *addr, uint8_t addr_type, uint8_t sid) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(g_ble_ll_sync_adv_list); i++) { - if ((g_ble_ll_sync_adv_list[i].adv_sid == sid) && - (g_ble_ll_sync_adv_list[i].adv_addr_type == addr_type) && - !memcmp(g_ble_ll_sync_adv_list[i].adv_addr, addr, BLE_DEV_ADDR_LEN)) { - return i; - } - } - - return -1; -} - -static int -ble_ll_sync_list_get_free(void) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(g_ble_ll_sync_adv_list); i++) { - if (g_ble_ll_sync_adv_list[i].adv_sid == 0xff) { - return i; - } - } - - return -1; -} - -static bool -ble_ll_sync_list_empty(void) { - int i; - - for (i = 0; i < ARRAY_SIZE(g_ble_ll_sync_adv_list); i++) { - if (g_ble_ll_sync_adv_list[i].adv_sid != 0xff) { - return false; - } - } - - return true; -} - -static uint8_t -ble_ll_sync_get_handle(struct ble_ll_sync_sm *sm) -{ - /* handle number is offset in global array */ - return sm - g_ble_ll_sync_sm; -} - -static void -ble_ll_sync_sm_clear(struct ble_ll_sync_sm *sm) -{ - if (sm->flags & (BLE_LL_SYNC_SM_FLAG_ESTABLISHING | - BLE_LL_SYNC_SM_FLAG_ESTABLISHED)) { - ble_ll_sched_rmv_elem(&sm->sch); - ble_npl_eventq_remove(&g_ble_ll_data.ll_evq, &sm->sync_ev_end); - } - - if (sm->next_report) { - ble_hci_trans_buf_free(sm->next_report); - } - - if (g_ble_ll_sync_sm_current == sm) { - ble_phy_disable(); - ble_ll_state_set(BLE_LL_STATE_STANDBY); - g_ble_ll_sync_sm_current = NULL; - ble_ll_scan_chk_resume(); - } - - ble_ll_rfmgmt_release(); - - BLE_LL_ASSERT(sm->sync_ev_end.ev.ev_queued == 0); - BLE_LL_ASSERT(sm->sch.enqueued == 0); - memset(sm, 0, sizeof(*sm)); -} - -static uint8_t -ble_ll_sync_phy_mode_to_hci(int8_t phy_mode) -{ -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - switch (phy_mode) { - case BLE_PHY_MODE_1M: - return BLE_HCI_LE_PHY_1M; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) - case BLE_PHY_MODE_2M: - return BLE_HCI_LE_PHY_2M; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - case BLE_PHY_MODE_CODED_125KBPS: - case BLE_PHY_MODE_CODED_500KBPS: - return BLE_HCI_LE_PHY_CODED; -#endif - default: - BLE_LL_ASSERT(false); - return BLE_PHY_MODE_1M; - } -#else - return BLE_PHY_MODE_1M; -#endif -} - -static struct ble_ll_sync_sm * -ble_ll_sync_find(const uint8_t *addr, uint8_t addr_type, uint8_t sid) -{ - struct ble_ll_sync_sm *sm; - int i; - - for (i = 0; i < BLE_LL_SYNC_CNT; i++) { - sm = &g_ble_ll_sync_sm[i]; - - if (!sm->flags) { - continue; - } - if ((sm->adv_sid == sid) && (sm->adv_addr_type == addr_type) && - !memcmp(&sm->adv_addr, addr, BLE_DEV_ADDR_LEN)) { - return sm; - } - } - - return NULL; -} - -static uint16_t -get_max_skip(uint32_t interval_us, uint32_t timeout_us) -{ - uint16_t max_skip; - - BLE_LL_ASSERT(interval_us); - BLE_LL_ASSERT(timeout_us); - - if (timeout_us <= interval_us) { - return 0; - } - - /* - * Calculate max allowed skip to receive something before timeout. We adjust - * current skip value to be no more than max_skip-6 so we have at least few - * attempts to receive an event (so we don't timeout immediately after just - * one missed event). - */ - - max_skip = (timeout_us / interval_us) - 1; - - if (max_skip < 6) { - return 0; - } - - return max_skip - 6; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) -static void -ble_ll_sync_transfer_received(struct ble_ll_sync_sm *sm, uint8_t status) -{ - struct ble_hci_ev_le_subev_periodic_adv_sync_transfer *ev; - struct ble_hci_ev *hci_ev; - - BLE_LL_ASSERT(sm->transfer_received_ev); - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_PERIODIC_ADV_SYNC_TRANSFER)) { - hci_ev = (void *) sm->transfer_received_ev; - - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - - ev = (void *) hci_ev->data; - ev->subev_code = BLE_HCI_LE_SUBEV_PERIODIC_ADV_SYNC_TRANSFER; - - ev->status = status; - ev->conn_handle = htole16(sm->transfer_conn->conn_handle); - ev->service_data = htole16(sm->transfer_id); - - /* this is ignored by host on error */ - ev->sync_handle = htole16(ble_ll_sync_get_handle(sm)); - ev->sid = sm->adv_sid; - ev->peer_addr_type = sm->adv_addr_type; - if (sm->flags & BLE_LL_SYNC_SM_FLAG_ADDR_RESOLVED) { - ev->peer_addr_type += 2; - } - memcpy(ev->peer_addr, sm->adv_addr, BLE_DEV_ADDR_LEN); - ev->phy = ble_ll_sync_phy_mode_to_hci(sm->phy_mode); - ev->interval = htole16(sm->itvl); - ev->aca = sm->sca; - - ble_ll_hci_event_send(hci_ev); - } else { - ble_hci_trans_buf_free(sm->transfer_received_ev); - } - - sm->transfer_received_ev = NULL; - sm->transfer_conn = NULL; -} -#endif - -static void -ble_ll_sync_est_event_success(struct ble_ll_sync_sm *sm) -{ - struct ble_hci_ev_le_subev_periodic_adv_sync_estab *ev; - struct ble_hci_ev *hci_ev; - - BLE_LL_ASSERT(g_ble_ll_sync_create_comp_ev); - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_PERIODIC_ADV_SYNC_ESTAB)) { - hci_ev = (void *) g_ble_ll_sync_create_comp_ev; - - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_PERIODIC_ADV_SYNC_ESTAB; - ev->status = BLE_ERR_SUCCESS; - ev->sync_handle = htole16(ble_ll_sync_get_handle(sm)); - ev->sid = sm->adv_sid; - ev->peer_addr_type = sm->adv_addr_type; - if (sm->flags & BLE_LL_SYNC_SM_FLAG_ADDR_RESOLVED) { - ev->peer_addr_type += 2; - } - memcpy(ev->peer_addr, sm->adv_addr, BLE_DEV_ADDR_LEN); - ev->phy = ble_ll_sync_phy_mode_to_hci(sm->phy_mode); - ev->interval = htole16(sm->itvl); - ev->aca = sm->sca; - - ble_ll_hci_event_send(hci_ev); - } else { - ble_hci_trans_buf_free(g_ble_ll_sync_create_comp_ev); - } - - g_ble_ll_sync_create_comp_ev = NULL; -} - -static void -ble_ll_sync_est_event_failed(uint8_t status) -{ - struct ble_hci_ev_le_subev_periodic_adv_sync_estab *ev; - struct ble_hci_ev *hci_ev; - - BLE_LL_ASSERT(g_ble_ll_sync_create_comp_ev); - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_PERIODIC_ADV_SYNC_ESTAB)) { - hci_ev = (void *) g_ble_ll_sync_create_comp_ev; - - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - memset(ev, 0, sizeof(*ev)); - - ev->subev_code = BLE_HCI_LE_SUBEV_PERIODIC_ADV_SYNC_ESTAB; - ev->status = status; - - ble_ll_hci_event_send(hci_ev); - } else { - ble_hci_trans_buf_free(g_ble_ll_sync_create_comp_ev); - } - - g_ble_ll_sync_create_comp_ev = NULL; -} - -static void -ble_ll_sync_lost_event(struct ble_ll_sync_sm *sm) -{ - struct ble_hci_ev_le_subev_periodic_adv_sync_lost *ev; - struct ble_hci_ev *hci_ev; - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_PERIODIC_ADV_SYNC_LOST)) { - hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (hci_ev) { - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_PERIODIC_ADV_SYNC_LOST; - ev->sync_handle = htole16(ble_ll_sync_get_handle(sm)); - - ble_ll_hci_event_send(hci_ev); - } - } -} - -static void -ble_ll_sync_current_sm_over(void) -{ - /* Disable the PHY */ - ble_phy_disable(); - - /* Link-layer is in standby state now */ - ble_ll_state_set(BLE_LL_STATE_STANDBY); - - /* Set current LL sync to NULL */ - g_ble_ll_sync_sm_current = NULL; -} - -static int -ble_ll_sync_event_start_cb(struct ble_ll_sched_item *sch) -{ - struct ble_ll_sync_sm *sm; - uint32_t wfr_usecs; - uint32_t start; - int rc; - - /* Set current connection state machine */ - sm = sch->cb_arg; - BLE_LL_ASSERT(sm); - - g_ble_ll_sync_sm_current = sm; - - /* Disable whitelisting */ - ble_ll_whitelist_disable(); - - /* Set LL state */ - ble_ll_state_set(BLE_LL_STATE_SYNC); - - /* Set channel */ - ble_phy_setchan(sm->chan_index, sm->access_addr, sm->crcinit); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - ble_phy_resolv_list_disable(); -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - ble_phy_encrypt_disable(); -#endif - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - ble_phy_mode_set(sm->phy_mode, sm->phy_mode); -#endif - - start = sch->start_time + g_ble_ll_sched_offset_ticks; - rc = ble_phy_rx_set_start_time(start, sch->remainder); - if (rc && rc != BLE_PHY_ERR_RX_LATE) { - STATS_INC(ble_ll_stats, sync_event_failed); - rc = BLE_LL_SCHED_STATE_DONE; - ble_ll_event_send(&sm->sync_ev_end); - ble_ll_sync_current_sm_over(); - } else { - /* - * Set flag that tells to set last anchor point if a packet - * has been received. - */ - sm->flags |= BLE_LL_SYNC_SM_FLAG_SET_ANCHOR; - - /* Set WFR timer. - * If establishing we always adjust with offset unit. - * If this is first packet of sync (one that was pointed by from - * SyncInfo we don't adjust WFT with window widening. - */ - if (sm->flags & BLE_LL_SYNC_SM_FLAG_ESTABLISHING) { - wfr_usecs = (sm->flags & BLE_LL_SYNC_SM_FLAG_OFFSET_300) ? 300 : 30; - if (!(sm->flags & BLE_LL_SYNC_SM_FLAG_SYNC_INFO)) { - wfr_usecs += 2 * sm->window_widening; - } - } else { - wfr_usecs = 2 * sm->window_widening; - } - ble_phy_wfr_enable(BLE_PHY_WFR_ENABLE_RX, 0, wfr_usecs); - - rc = BLE_LL_SCHED_STATE_RUNNING; - } - - sm->flags &= ~BLE_LL_SYNC_SM_FLAG_SYNC_INFO; - - return rc; -} - -/** - * Called when a receive PDU has started. - * - * Context: interrupt - * - * @return int - * < 0: A frame we dont want to receive. - * = 0: Continue to receive frame. Dont go from rx to tx - */ -int -ble_ll_sync_rx_isr_start(uint8_t pdu_type, struct ble_mbuf_hdr *rxhdr) -{ - BLE_LL_ASSERT(g_ble_ll_sync_sm_current); - - /* this also handles chains as those have same PDU type */ - if (pdu_type != BLE_ADV_PDU_TYPE_AUX_SYNC_IND) { - ble_ll_event_send(&g_ble_ll_sync_sm_current->sync_ev_end); - ble_ll_sync_current_sm_over(); - STATS_INC(ble_ll_stats, sched_invalid_pdu); - return -1; - } - - STATS_INC(ble_ll_stats, sync_received); - return 0; -} - -static int -ble_ll_sync_parse_ext_hdr(struct os_mbuf *om, uint8_t **aux, int8_t *tx_power) -{ - uint8_t *rxbuf = om->om_data; - uint8_t ext_hdr_flags; - uint8_t ext_hdr_len; - uint8_t *ext_hdr; - uint8_t pdu_len; - int i; - - pdu_len = rxbuf[1]; - if (pdu_len == 0) { - return -1; - } - ext_hdr_len = rxbuf[2] & 0x3F; - if (ext_hdr_len > (pdu_len - 1)) { - return -1; - } - - if (ext_hdr_len) { - ext_hdr_flags = rxbuf[3]; - ext_hdr = &rxbuf[4]; - - i = 0; - - /* there should be no AdvA in Sync or chain, skip it */ - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_ADVA_BIT)) { - i += BLE_LL_EXT_ADV_ADVA_SIZE; - } - - /* there should be no TargetA in Sync or chain, skip it */ - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_TARGETA_BIT)) { - i += BLE_LL_EXT_ADV_TARGETA_SIZE; - } - - /* Ignore CTE for now */ - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_CTE_INFO_BIT)) { - i += 1; - } - - /* there should be no ADI in Sync or chain, skip it */ - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_DATA_INFO_BIT)) { - i += BLE_LL_EXT_ADV_DATA_INFO_SIZE; - } - - /* get AuXPTR if present */ - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT)) { - *aux = ext_hdr + i; - i += BLE_LL_EXT_ADV_AUX_PTR_SIZE; - } - - /* there should be no SyncInfo in Sync or chain, skip it */ - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_SYNC_INFO_BIT)) { - i += BLE_LL_EXT_ADV_SYNC_INFO_SIZE; - } - - if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_TX_POWER_BIT)) { - *tx_power = *(ext_hdr + i); - i += BLE_LL_EXT_ADV_TX_POWER_SIZE; - } - - /* TODO Handle ACAD if needed */ - - /* sanity check */ - if (i > ext_hdr_len) { - return -1; - } - } - - return pdu_len - ext_hdr_len - 1; -} - -static void -ble_ll_sync_adjust_ext_hdr(struct os_mbuf *om) -{ - uint8_t *rxbuf = om->om_data; - uint8_t ext_hdr_len; - - /* this was already verified in ble_ll_sync_parse_ext_hdr() */ - ext_hdr_len = rxbuf[2] & 0x3F; - - os_mbuf_adj(om, 3 + ext_hdr_len); -} - -static void -ble_ll_sync_send_truncated_per_adv_rpt(struct ble_ll_sync_sm *sm, uint8_t *evbuf) -{ - struct ble_hci_ev_le_subev_periodic_adv_rpt *ev; - struct ble_hci_ev *hci_ev; - - if (!ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_PERIODIC_ADV_RPT) || - (sm->flags & BLE_LL_SYNC_SM_FLAG_DISABLED)) { - ble_hci_trans_buf_free(evbuf); - return; - } - - hci_ev = (void *) evbuf; - - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_PERIODIC_ADV_RPT; - ev->sync_handle = htole16(ble_ll_sync_get_handle(sm)); - ev->tx_power = 127; /* not available */ - ev->rssi = 127; /* not available */ - ev->cte_type = 0xff; - ev->data_status = BLE_HCI_PERIODIC_DATA_STATUS_TRUNCATED; - ev->data_len = 0; - - ble_ll_hci_event_send(hci_ev); -} - -static void -ble_ll_sync_send_per_adv_rpt(struct ble_ll_sync_sm *sm, struct os_mbuf *rxpdu, - int8_t rssi, int8_t tx_power, int datalen, - uint8_t *aux, bool aux_scheduled) -{ - struct ble_hci_ev_le_subev_periodic_adv_rpt *ev; - struct ble_hci_ev *hci_ev; - struct ble_hci_ev *hci_ev_next = NULL; - uint8_t max_data_len; - int offset; - - /* use next report buffer if present, this means we are chaining */ - if (sm->next_report) { - hci_ev = (void *) sm->next_report; - sm->next_report = NULL; - } else { - hci_ev = (void * )ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_LO); - if (!hci_ev) { - goto done; - } - } - - max_data_len = BLE_LL_MAX_EVT_LEN - sizeof(*hci_ev) - sizeof(*ev); - offset = 0; - - do { - if (hci_ev_next) { - hci_ev = hci_ev_next; - hci_ev_next = NULL; - } - - hci_ev->opcode = BLE_HCI_EVCODE_LE_META; - hci_ev->length = sizeof(*ev); - - ev = (void *) hci_ev->data; - - ev->subev_code = BLE_HCI_LE_SUBEV_PERIODIC_ADV_RPT; - ev->sync_handle = htole16(ble_ll_sync_get_handle(sm)); - ev->tx_power = tx_power; - ev->rssi = rssi; - ev->cte_type = 0xff; - - ev->data_len = min(max_data_len, datalen - offset); - /* adjust event length */ - hci_ev->length += ev->data_len; - - os_mbuf_copydata(rxpdu, offset, ev->data_len, ev->data); - offset += ev->data_len; - - /* Need another event for next fragment of this PDU */ - if (offset < datalen) { - hci_ev_next = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_LO); - if (hci_ev_next) { - ev->data_status = BLE_HCI_PERIODIC_DATA_STATUS_INCOMPLETE; - } else { - ev->data_status = BLE_HCI_PERIODIC_DATA_STATUS_TRUNCATED; - } - } else { - /* last report of this PDU */ - if (aux) { - if (aux_scheduled) { - /* if we scheduled aux, we need buffer for next report */ - hci_ev_next = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_LO); - if (hci_ev_next) { - ev->data_status = BLE_HCI_PERIODIC_DATA_STATUS_INCOMPLETE; - } else { - ev->data_status = BLE_HCI_PERIODIC_DATA_STATUS_TRUNCATED; - } - } else { - ev->data_status = BLE_HCI_PERIODIC_DATA_STATUS_TRUNCATED; - } - } else { - ev->data_status = BLE_HCI_PERIODIC_DATA_STATUS_COMPLETE; - } - } - ble_ll_hci_event_send(hci_ev); - } while ((offset < datalen) && hci_ev_next); - -done: - /* this means that we already truncated data (or didn't sent first at all) - * in HCI report but has scheduled for next PDU in chain. In that case mark - * it so that we end event properly when next PDU is received. - * */ - if (aux_scheduled && !hci_ev_next) { - sm->flags |= BLE_LL_SYNC_SM_FLAG_HCI_TRUNCATED; - } - - /* store for chain */ - sm->next_report = (void *) hci_ev_next; -} - -/** - * Called when a receive PDU has ended. - * - * Context: Interrupt - * - * @param rxpdu - * - * @return int - * < 0: Disable the phy after reception. - * == 0: Success. Do not disable the PHY. - * > 0: Do not disable PHY as that has already been done. - */ -int -ble_ll_sync_rx_isr_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr) -{ - struct ble_mbuf_hdr *ble_hdr; - struct os_mbuf *rxpdu; - - BLE_LL_ASSERT(g_ble_ll_sync_sm_current); - - /* type was verified in isr_start */ - - rxpdu = ble_ll_rxpdu_alloc(rxbuf[1] + BLE_LL_PDU_HDR_LEN); - if (rxpdu) { - ble_phy_rxpdu_copy(rxbuf, rxpdu); - - ble_hdr = BLE_MBUF_HDR_PTR(rxpdu); - ble_hdr->rxinfo.user_data = g_ble_ll_sync_sm_current; - - ble_ll_rx_pdu_in(rxpdu); - } else { - STATS_INC(ble_ll_stats, sync_rx_buf_err); - ble_ll_event_send(&g_ble_ll_sync_sm_current->sync_ev_end); - } - - /* PHY is disabled here */ - ble_ll_sync_current_sm_over(); - - return 1; -} - -/** - * Called when the wait for response timer expires while in the sync state. - * - * Context: Interrupt. - */ -void -ble_ll_sync_wfr_timer_exp(void) -{ - struct ble_ll_sync_sm *sm = g_ble_ll_sync_sm_current; - - BLE_LL_ASSERT(g_ble_ll_sync_sm_current); - STATS_INC(ble_ll_stats, sync_missed_err); - - ble_ll_sync_current_sm_over(); - ble_ll_event_send(&sm->sync_ev_end); -} - -/** - * Called when sync event needs to be halted. This normally should not be called - * and is only called when a scheduled item executes but scanning for sync/chain - * is stil ongoing - * Context: Interrupt - */ -void -ble_ll_sync_halt(void) -{ - struct ble_ll_sync_sm *sm = g_ble_ll_sync_sm_current; - - ble_ll_sync_current_sm_over(); - - if (sm) { - ble_ll_event_send(&sm->sync_ev_end); - } -} - -uint32_t -ble_ll_sync_get_event_end_time(void) -{ - uint32_t end_time; - - if (g_ble_ll_sync_sm_current) { - end_time = g_ble_ll_sync_sm_current->sch.end_time; - } else { - end_time = os_cputime_get32(); - } - return end_time; -} - -static uint8_t -ble_ll_sync_phy_mode_to_aux_phy(uint8_t phy_mode) -{ - switch (phy_mode) { - case BLE_PHY_MODE_1M: - return 0x00; - case BLE_PHY_MODE_2M: - return 0x01; - case BLE_PHY_MODE_CODED_125KBPS: - case BLE_PHY_MODE_CODED_500KBPS: - return 0x02; - default: - BLE_LL_ASSERT(false); - return 0x00; - } -} - -static void -ble_ll_sync_parse_aux_ptr(const uint8_t *buf, uint8_t *chan, uint32_t *offset, - uint8_t *offset_units, uint8_t *phy) -{ - uint32_t aux_ptr_field = get_le32(buf) & 0x00FFFFFF; - - *chan = aux_ptr_field & 0x3F; - - /* TODO use CA aux_ptr_field >> 6 */ - - if ((aux_ptr_field >> 7) & 0x01) { - *offset = 300 * ((aux_ptr_field >> 8) & 0x1FFF); - *offset_units = 1; - } else { - *offset = 30 * ((aux_ptr_field >> 8) & 0x1FFF); - *offset_units = 0; - } - - *phy = (aux_ptr_field >> 21) & 0x07; -} - -static int -ble_ll_sync_chain_start_cb(struct ble_ll_sched_item *sch) -{ - struct ble_ll_sync_sm *sm; - uint32_t wfr_usecs; - uint32_t start; - int rc; - - /* Set current connection state machine */ - sm = sch->cb_arg; - g_ble_ll_sync_sm_current = sm; - BLE_LL_ASSERT(sm); - - /* Disable whitelisting */ - ble_ll_whitelist_disable(); - - /* Set LL state */ - ble_ll_state_set(BLE_LL_STATE_SYNC); - - /* Set channel */ - ble_phy_setchan(sm->chan_chain, sm->access_addr, sm->crcinit); - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - ble_phy_resolv_list_disable(); -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - ble_phy_encrypt_disable(); -#endif - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - ble_phy_mode_set(sm->phy_mode, sm->phy_mode); -#endif - - start = sch->start_time + g_ble_ll_sched_offset_ticks; - rc = ble_phy_rx_set_start_time(start, sch->remainder); - if (rc && rc != BLE_PHY_ERR_RX_LATE) { - STATS_INC(ble_ll_stats, sync_chain_failed); - rc = BLE_LL_SCHED_STATE_DONE; - ble_ll_event_send(&sm->sync_ev_end); - ble_ll_sync_current_sm_over(); - } else { - /* - * Clear flag that tells to set last anchor point if a packet - * has been received, this is chain and we don't need it. - */ - sm->flags &= ~BLE_LL_SYNC_SM_FLAG_SET_ANCHOR; - - wfr_usecs = (sm->flags & BLE_LL_SYNC_SM_FLAG_OFFSET_300) ? 300 : 30; - - ble_phy_wfr_enable(BLE_PHY_WFR_ENABLE_RX, 0, wfr_usecs); - rc = BLE_LL_SCHED_STATE_RUNNING; - } - - return rc; -} - -static int -ble_ll_sync_schedule_chain(struct ble_ll_sync_sm *sm, struct ble_mbuf_hdr *hdr, - const uint8_t *aux) -{ - uint8_t offset_units; - uint32_t offset; - uint8_t chan; - uint8_t phy; - - ble_ll_sync_parse_aux_ptr(aux, &chan, &offset, &offset_units, &phy); - - if (chan >= BLE_PHY_NUM_DATA_CHANS) { - return -1; - } - - if (offset < BLE_LL_MAFS) { - return -1; - } - - /* chain should use same PHY as master PDU */ - if (phy != ble_ll_sync_phy_mode_to_aux_phy(sm->phy_mode)) { - return -1; - } - - if (offset_units) { - sm->flags |= BLE_LL_SYNC_SM_FLAG_OFFSET_300; - } else { - sm->flags &= ~BLE_LL_SYNC_SM_FLAG_OFFSET_300; - } - - sm->chan_chain = chan; - - sm->sch.sched_cb = ble_ll_sync_chain_start_cb; - sm->sch.cb_arg = sm; - sm->sch.sched_type = BLE_LL_SCHED_TYPE_SYNC; - - return ble_ll_sched_sync(&sm->sch, hdr->beg_cputime, hdr->rem_usecs, - offset, sm->phy_mode); -} - -static void -ble_ll_sync_established(struct ble_ll_sync_sm *sm) -{ - BLE_LL_ASSERT(sm->sync_pending_cnt); - - /* mark as established */ - - sm->flags |= BLE_LL_SYNC_SM_FLAG_ESTABLISHED; - sm->flags &= ~BLE_LL_SYNC_SM_FLAG_ESTABLISHING; - - sm->sync_pending_cnt = 0; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - if (sm->transfer_conn) { - ble_ll_sync_transfer_received(sm, BLE_ERR_SUCCESS); - return; - } -#endif - - ble_ll_sync_est_event_success(sm); -} - -static void -ble_ll_sync_check_failed(struct ble_ll_sync_sm *sm) -{ - BLE_LL_ASSERT(sm->sync_pending_cnt); - - /* if we can retry on next event */ - if (--sm->sync_pending_cnt) { - return; - } - - sm->flags &= ~BLE_LL_SYNC_SM_FLAG_ESTABLISHING; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - if (sm->transfer_conn) { - ble_ll_sync_transfer_received(sm, BLE_ERR_CONN_ESTABLISHMENT); - return; - } -#endif - - ble_ll_sync_est_event_failed(BLE_ERR_CONN_ESTABLISHMENT); -} - -void -ble_ll_sync_rx_pkt_in(struct os_mbuf *rxpdu, struct ble_mbuf_hdr *hdr) -{ - struct ble_ll_sync_sm *sm = hdr->rxinfo.user_data; - bool aux_scheduled = false; - int8_t tx_power = 127; /* defaults to not available */ - uint8_t *aux = NULL; - int datalen; - - BLE_LL_ASSERT(sm); - - /* this could happen if sync was cancelled or terminated while pkt_in was - * already in LL queue, just drop in that case - */ - if (!sm->flags) { - ble_ll_scan_chk_resume(); - ble_ll_rfmgmt_release(); - return; - } - - /* Set anchor point (and last) if 1st rxd frame in sync event. - * According to spec this should be done even if CRC is not valid so we - * can store it here - */ - if (sm->flags & BLE_LL_SYNC_SM_FLAG_SET_ANCHOR) { - sm->flags &= ~BLE_LL_SYNC_SM_FLAG_SET_ANCHOR; - - sm->anchor_point = hdr->beg_cputime; - sm->anchor_point_usecs = hdr->rem_usecs; - sm->last_anchor_point = sm->anchor_point; - } - - /* CRC error, end event */ - if (!BLE_MBUF_HDR_CRC_OK(hdr)) { - STATS_INC(ble_ll_stats, sync_crc_err); - goto end_event; - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - /* save last pa counter */ - sm->event_cntr_last_received = sm->event_cntr; -#endif - - /* this means we are chaining but due to low buffers already sent data - * truncated report to host (or didn't sent any at all). If this happens - * next_buf should be already set to NULL and we just end event. - */ - if (sm->flags & BLE_LL_SYNC_SM_FLAG_HCI_TRUNCATED) { - BLE_LL_ASSERT(!sm->next_report); - goto end_event; - } - - if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_PERIODIC_ADV_RPT) && - !(sm->flags & BLE_LL_SYNC_SM_FLAG_DISABLED)) { - /* get ext header data */ - datalen = ble_ll_sync_parse_ext_hdr(rxpdu, &aux, &tx_power); - if (datalen < 0) { - /* we got bad packet, end event */ - goto end_event; - } - - /* if aux is present, we need to schedule ASAP */ - if (aux && (ble_ll_sync_schedule_chain(sm, hdr, aux) == 0)) { - aux_scheduled = true; - } - - /* in case data reporting is enabled we need to send sync established here */ - if (sm->flags & BLE_LL_SYNC_SM_FLAG_ESTABLISHING) { - ble_ll_sync_established(sm); - } - - /* Adjust rxpdu to contain advertising data only */ - ble_ll_sync_adjust_ext_hdr(rxpdu); - - /* send reports from this PDU */ - ble_ll_sync_send_per_adv_rpt(sm, rxpdu, hdr->rxinfo.rssi, tx_power, - datalen, aux, aux_scheduled); - } else { - /* we need to establish link even if reporting was disabled */ - if (sm->flags & BLE_LL_SYNC_SM_FLAG_ESTABLISHING) { - ble_ll_sync_established(sm); - } - } - - /* if chain was scheduled we don't end event yet */ - /* TODO should we check resume only if offset is high? */ - if (aux_scheduled) { - ble_ll_scan_chk_resume(); - ble_ll_rfmgmt_release(); - return; - } - -end_event: - ble_ll_event_send(&sm->sync_ev_end); - ble_ll_rfmgmt_release(); -} - -static int -ble_ll_sync_next_event(struct ble_ll_sync_sm *sm, uint32_t cur_ww_adjust) -{ - uint32_t cur_ww; - uint32_t max_ww; - uint32_t ticks; - uint32_t itvl; - uint8_t usecs; - uint16_t skip = sm->skip; - - /* don't skip if are establishing sync or we missed last event */ - if (skip && ((sm->flags & BLE_LL_SYNC_SM_FLAG_ESTABLISHING) || - CPUTIME_LT(sm->last_anchor_point, sm->anchor_point))) { - skip = 0; - } - - /* Set next event start time, we can use pre-calculated values for one - * interval if not skipping - */ - if (skip == 0) { - ticks = sm->itvl_ticks; - usecs = sm->itvl_usecs; - } else { - itvl = sm->itvl * BLE_LL_SYNC_ITVL_USECS * (1 + skip); - ticks = os_cputime_usecs_to_ticks(itvl); - usecs = itvl - os_cputime_ticks_to_usecs(ticks); - } - - sm->anchor_point += ticks; - sm->anchor_point_usecs += usecs; - if (sm->anchor_point_usecs >= 31) { - sm->anchor_point++; - sm->anchor_point_usecs -= 31; - } - - /* Set event counter to the next event */ - sm->event_cntr += 1 + skip; - - /* Calculate channel index of next event */ - sm->chan_index = ble_ll_utils_calc_dci_csa2(sm->event_cntr, sm->channel_id, - sm->num_used_chans, sm->chanmap); - - cur_ww = ble_ll_utils_calc_window_widening(sm->anchor_point, - sm->last_anchor_point, - sm->sca); - - cur_ww += cur_ww_adjust; - - max_ww = (sm->itvl * (BLE_LL_SYNC_ITVL_USECS / 2)) - BLE_LL_IFS; - if (cur_ww >= max_ww) { - return -1; - } - - cur_ww += BLE_LL_JITTER_USECS; - - /* if updated anchor is pass last anchor + timeout it means we will not be - * able to get it in time and hit sync timeout - * - * note that this may result in sync timeout being sent before real - * timeout but we won't be able to fit in time anyway.. - * - * We don't do that when establishing since we try up to - * BLE_LL_SYNC_ESTABLISH_CNT events before failing regardless of timeout - */ - if (!(sm->flags & BLE_LL_SYNC_SM_FLAG_ESTABLISHING)) { - if (CPUTIME_GT(sm->anchor_point - os_cputime_usecs_to_ticks(cur_ww), - sm->last_anchor_point + sm->timeout )) { - return -1; - } - } - - sm->window_widening = cur_ww; - - return 0; -} - -static void -ble_ll_sync_event_end(struct ble_npl_event *ev) -{ - struct ble_ll_sync_sm *sm; - - /* Better be a connection state machine! */ - sm = ble_npl_event_get_arg(ev); - BLE_LL_ASSERT(sm); - - ble_ll_rfmgmt_release(); - - if (sm->flags & BLE_LL_SYNC_SM_FLAG_ESTABLISHING) { - ble_ll_sync_check_failed(sm); - } - - /* Check if we need to resume scanning */ - ble_ll_scan_chk_resume(); - - /* Remove any end events that might be enqueued */ - ble_npl_eventq_remove(&g_ble_ll_data.ll_evq, &sm->sync_ev_end); - - /* don't schedule next event if sync is not established nor establishing - * at this point SM is no longer valid - */ - if (!(sm->flags & (BLE_LL_SYNC_SM_FLAG_ESTABLISHED | - BLE_LL_SYNC_SM_FLAG_ESTABLISHING))) { - ble_ll_sync_sm_clear(sm); - return; - } - - /* if we had prepared buffer for next even it means we were chaining and - * must send truncated report to host - */ - if (sm->next_report) { - BLE_LL_ASSERT(!(sm->flags & BLE_LL_SYNC_SM_FLAG_HCI_TRUNCATED)); - ble_ll_sync_send_truncated_per_adv_rpt(sm, sm->next_report); - sm->next_report = NULL; - } - - /* Event ended so we are no longer chaining */ - sm->flags &= ~BLE_LL_SYNC_SM_FLAG_HCI_TRUNCATED; - - sm->sch.sched_cb = ble_ll_sync_event_start_cb; - sm->sch.cb_arg = sm; - sm->sch.sched_type = BLE_LL_SCHED_TYPE_SYNC; - - do { - if (ble_ll_sync_next_event(sm, 0) < 0) { - if (sm->flags & BLE_LL_SYNC_SM_FLAG_ESTABLISHING) { - /* don't allow any retry if this failed */ - sm->sync_pending_cnt = 1; - ble_ll_sync_check_failed(sm); - } else { - ble_ll_sync_lost_event(sm); - } - - /* at this point SM is no longer valid */ - ble_ll_sync_sm_clear(sm); - return; - } - } while (ble_ll_sched_sync_reschedule(&sm->sch, sm->anchor_point, - sm->anchor_point_usecs, - sm->window_widening, sm->phy_mode)); -} - -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) -{ - struct ble_ll_sync_sm *sm = NULL; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - const uint8_t *rpa = NULL; -#endif - uint16_t max_skip; - uint32_t offset; - uint32_t usecs; - uint16_t itvl; - int i; - - /* ignore if not synchronizing */ - if (!g_ble_ll_sync_create_comp_ev) { - return; - } - - /* get reserved SM */ - for (i = 0; i < BLE_LL_SYNC_CNT; i++) { - if (g_ble_ll_sync_sm[i].flags & BLE_LL_SYNC_SM_FLAG_RESERVED) { - sm = &g_ble_ll_sync_sm[i]; - break; - } - } - - /* this means we already got sync info event and pending sync */ - if (!sm) { - return; - } - - /* check if resolved */ - if (rpa_index >= 0) { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - rpa = addr; -#endif - addr = g_ble_ll_resolv_list[rpa_index].rl_identity_addr; - addr_type = g_ble_ll_resolv_list[rpa_index].rl_addr_type; - } - - /* check peer */ - if (g_ble_ll_sync_create_params.options & BLE_HCI_LE_PERIODIC_ADV_CREATE_SYNC_OPT_FILTER) { - if (ble_ll_sync_on_list(addr, addr_type, sid) < 0) { - return; - } - - /* set addr and sid in sm */ - sm->adv_sid = sid; - sm->adv_addr_type = addr_type; - memcpy(sm->adv_addr, addr, BLE_DEV_ADDR_LEN); - } else { - if ((sm->adv_sid != sid) || (sm->adv_addr_type != addr_type) || - memcmp(sm->adv_addr, addr, BLE_DEV_ADDR_LEN)) { - return; - } - } - - /* Sync Packet Offset (13 bits), Offset Units (1 bit), RFU (2 bits) */ - offset = syncinfo[0]; - offset |= (uint16_t)(syncinfo[1] & 0x1f) << 8; - - /* ignore if offset is not valid */ - if (!offset) { - return; - } - - /* Interval (2 bytes), ignore if invalid */ - itvl = get_le16(&syncinfo[2]); - if (itvl < 6) { - return; - } - - if (rpa_index >= 0) { - sm->flags |= BLE_LL_SYNC_SM_FLAG_ADDR_RESOLVED; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) - memcpy(sm->adv_addr_rpa, rpa, BLE_DEV_ADDR_LEN); -#endif - } - - /* set params from HCI LE Create Periodic Sync */ - sm->timeout = g_ble_ll_sync_create_params.timeout; - sm->skip = g_ble_ll_sync_create_params.max_skip; - sm->sync_pending_cnt = BLE_LL_SYNC_ESTABLISH_CNT; - - if (syncinfo[1] & 0x20) { - offset *= 300; - sm->flags |= BLE_LL_SYNC_SM_FLAG_OFFSET_300; - } else { - offset *= 30; - sm->flags &= ~BLE_LL_SYNC_SM_FLAG_OFFSET_300; - } - - /* sync end event */ - ble_npl_event_init(&sm->sync_ev_end, ble_ll_sync_event_end, sm); - - sm->itvl = itvl; - - /* precalculate interval ticks and usecs */ - usecs = sm->itvl * BLE_LL_SYNC_ITVL_USECS; - sm->itvl_ticks = os_cputime_usecs_to_ticks(usecs); - sm->itvl_usecs = (uint8_t)(usecs - - os_cputime_ticks_to_usecs(sm->itvl_ticks)); - if (sm->itvl_usecs == 31) { - sm->itvl_usecs = 0; - sm->itvl_ticks++; - } - - /* Channels Mask (37 bits) */ - sm->chanmap[0] = syncinfo[4]; - sm->chanmap[1] = syncinfo[5]; - sm->chanmap[2] = syncinfo[6]; - sm->chanmap[3] = syncinfo[7]; - sm->chanmap[4] = syncinfo[8] & 0x1f; - sm->num_used_chans = ble_ll_utils_calc_num_used_chans(sm->chanmap); - - /* SCA (3 bits) */ - sm->sca = syncinfo[8] >> 5; - - /* AA (4 bytes) */ - sm->access_addr = get_le32(&syncinfo[9]); - sm->channel_id = ((sm->access_addr & 0xffff0000) >> 16) ^ - (sm->access_addr & 0x0000ffff); - - /* CRCInit (3 bytes) */ - sm->crcinit = syncinfo[15]; - sm->crcinit = (sm->crcinit << 8) | syncinfo[14]; - sm->crcinit = (sm->crcinit << 8) | syncinfo[13]; - - /* Event Counter (2 bytes) */ - sm->event_cntr = get_le16(&syncinfo[16]); - - /* adjust skip if pass timeout */ - max_skip = get_max_skip(sm->itvl * BLE_LL_SYNC_ITVL_USECS, sm->timeout); - if (sm->skip > max_skip) { - sm->skip = max_skip; - } - - /* from now on we only need timeout in ticks */ - sm->timeout = os_cputime_usecs_to_ticks(sm->timeout); - - sm->phy_mode = rxhdr->rxinfo.phy_mode; - sm->window_widening = BLE_LL_JITTER_USECS; - - /* Calculate channel index of first event */ - sm->chan_index = ble_ll_utils_calc_dci_csa2(sm->event_cntr, sm->channel_id, - sm->num_used_chans, sm->chanmap); - - sm->sch.sched_cb = ble_ll_sync_event_start_cb; - sm->sch.cb_arg = sm; - sm->sch.sched_type = BLE_LL_SCHED_TYPE_SYNC; - - if (ble_ll_sched_sync(&sm->sch, rxhdr->beg_cputime, rxhdr->rem_usecs, - offset, sm->phy_mode)) { - return; - } - - sm->anchor_point = sm->sch.start_time + g_ble_ll_sched_offset_ticks; - sm->anchor_point_usecs = sm->sch.remainder; - sm->last_anchor_point = sm->anchor_point; - -#if MYNEWT_VAL(BLE_VERSION) >= 51 - if (g_ble_ll_sync_create_params.options & BLE_HCI_LE_PERIODIC_ADV_CREATE_SYNC_OPT_DISABLED) { - sm->flags |= BLE_LL_SYNC_SM_FLAG_DISABLED; - } -#endif - - sm->flags &= ~BLE_LL_SYNC_SM_FLAG_RESERVED; - sm->flags |= BLE_LL_SYNC_SM_FLAG_ESTABLISHING; - sm->flags |= BLE_LL_SYNC_SM_FLAG_SYNC_INFO; -} - -static struct ble_ll_sync_sm * -ble_ll_sync_reserve(void) -{ - struct ble_ll_sync_sm *sm; - int i; - - for (i = 0; i < BLE_LL_SYNC_CNT; i++) { - sm = &g_ble_ll_sync_sm[i]; - - if (!sm->flags) { - sm->flags |= BLE_LL_SYNC_SM_FLAG_RESERVED; - return sm; - } - } - - return NULL; -} - -int -ble_ll_sync_create(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_periodic_adv_create_sync_cp *cmd = (const void *) cmdbuf; - struct ble_ll_sync_sm *sm; - uint16_t timeout; - os_sr_t sr; - - if (g_ble_ll_sync_create_comp_ev) { - return BLE_ERR_CMD_DISALLOWED; - } - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - -#if MYNEWT_VAL(BLE_VERSION) >= 51 - if (cmd->options > BLE_HCI_LE_PERIODIC_ADV_CREATE_SYNC_OPT_DISABLED) { -#else - if (cmd->options > BLE_HCI_LE_PERIODIC_ADV_CREATE_SYNC_OPT_FILTER) { -#endif - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (cmd->skip > 0x01f3) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - timeout = le16toh(cmd->sync_timeout); - if (timeout < 0x000a || timeout > 0x4000) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - -#if MYNEWT_VAL(BLE_VERSION) >= 51 - /* we don't support any CTE yet */ - if (cmd->sync_cte_type) { - if (cmd->sync_cte_type > 4) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - return BLE_ERR_UNSUPPORTED; - } -#endif - - if (cmd->options & BLE_HCI_LE_PERIODIC_ADV_CREATE_SYNC_OPT_FILTER) { - if (ble_ll_sync_list_empty()) { - return BLE_ERR_CMD_DISALLOWED; - } - } else { - if (cmd->sid > 0x0f) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (cmd->peer_addr_type > BLE_HCI_ADV_PEER_ADDR_MAX) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - OS_ENTER_CRITICAL(sr); - sm = ble_ll_sync_find(cmd->peer_addr, cmd->peer_addr_type, cmd->sid); - OS_EXIT_CRITICAL(sr); - - if (sm) { - return BLE_ERR_ACL_CONN_EXISTS; - } - } - - /* reserve buffer for sync complete event */ - g_ble_ll_sync_create_comp_ev = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (!g_ble_ll_sync_create_comp_ev) { - return BLE_ERR_MEM_CAPACITY; - } - - OS_ENTER_CRITICAL(sr); - - /* reserve 1 SM for created sync */ - sm = ble_ll_sync_reserve(); - if (!sm) { - ble_hci_trans_buf_free(g_ble_ll_sync_create_comp_ev); - g_ble_ll_sync_create_comp_ev = NULL; - OS_EXIT_CRITICAL(sr); - return BLE_ERR_MEM_CAPACITY; - } - - /* if we don't use list, store expected address in reserved SM */ - if (!(cmd->options & BLE_HCI_LE_PERIODIC_ADV_CREATE_SYNC_OPT_FILTER)) { - sm->adv_sid = cmd->sid; - sm->adv_addr_type = cmd->peer_addr_type; - memcpy(&sm->adv_addr, cmd->peer_addr, BLE_DEV_ADDR_LEN); - } - - g_ble_ll_sync_create_params.timeout = timeout * 10000; /* 10ms units, store in us */; - g_ble_ll_sync_create_params.max_skip = cmd->skip; - g_ble_ll_sync_create_params.options = cmd->options; - - OS_EXIT_CRITICAL(sr); - return BLE_ERR_SUCCESS; -} - -static void -ble_ll_sync_cancel_complete_event(void) -{ - ble_ll_sync_est_event_failed(BLE_ERR_OPERATION_CANCELLED); -} - -int -ble_ll_sync_cancel(ble_ll_hci_post_cmd_complete_cb *post_cmd_cb) -{ - struct ble_ll_sync_sm *sm; - os_sr_t sr; - int i; - - if (!g_ble_ll_sync_create_comp_ev) { - return BLE_ERR_CMD_DISALLOWED; - } - - OS_ENTER_CRITICAL(sr); - - for (i = 0; i < BLE_LL_SYNC_CNT; i++) { - sm = &g_ble_ll_sync_sm[i]; - - /* cancelled before fist sync info packet */ - if (sm->flags & BLE_LL_SYNC_SM_FLAG_RESERVED) { - memset(sm, 0, sizeof(*sm)); - break; - } - - /* cancelled while pending sync */ - if (sm->flags & BLE_LL_SYNC_SM_FLAG_ESTABLISHING) { - ble_ll_sync_sm_clear(sm); - break; - } - } - - OS_EXIT_CRITICAL(sr); - - /* g_ble_ll_sync_create_comp_ev will be cleared by this callback */ - *post_cmd_cb = ble_ll_sync_cancel_complete_event; - - return BLE_ERR_SUCCESS; -} - -int -ble_ll_sync_terminate(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_periodic_adv_term_sync_cp *cmd = (const void *) cmdbuf; - struct ble_ll_sync_sm *sm; - uint16_t handle; - os_sr_t sr; - - if (g_ble_ll_sync_create_comp_ev) { - return BLE_ERR_CMD_DISALLOWED; - } - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - handle = le16toh(cmd->sync_handle); - if (handle > 0xeff) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (handle >= BLE_LL_SYNC_CNT) { - return BLE_ERR_UNK_ADV_INDENT; - } - - sm = &g_ble_ll_sync_sm[handle]; - - OS_ENTER_CRITICAL(sr); - - if (!(sm->flags & BLE_LL_SYNC_SM_FLAG_ESTABLISHED)) { - OS_EXIT_CRITICAL(sr); - return BLE_ERR_UNK_ADV_INDENT; - } - - ble_ll_sync_sm_clear(sm); - - OS_EXIT_CRITICAL(sr); - - return BLE_ERR_SUCCESS; -} - -int -ble_ll_sync_list_add(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_add_dev_to_periodic_adv_list_cp *cmd = (const void *)cmdbuf; - int i; - - if (g_ble_ll_sync_create_comp_ev) { - return BLE_ERR_CMD_DISALLOWED; - } - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (cmd->peer_addr_type > BLE_HCI_ADV_PEER_ADDR_MAX) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - if (cmd->sid > 0x0f) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - i = ble_ll_sync_on_list(cmd->peer_addr, cmd->peer_addr_type, cmd->sid); - if (i >= 0) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - i = ble_ll_sync_list_get_free(); - if (i < 0) { - return BLE_ERR_MEM_CAPACITY; - } - - g_ble_ll_sync_adv_list[i].adv_sid = cmd->sid; - g_ble_ll_sync_adv_list[i].adv_addr_type = cmd->peer_addr_type; - memcpy(&g_ble_ll_sync_adv_list[i].adv_addr, cmd->peer_addr, BLE_DEV_ADDR_LEN); - - return BLE_ERR_SUCCESS; -} - -int -ble_ll_sync_list_remove(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_rem_dev_from_periodic_adv_list_cp *cmd = (const void *)cmdbuf; - int i; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (g_ble_ll_sync_create_comp_ev) { - return BLE_ERR_CMD_DISALLOWED; - } - - if (cmd->peer_addr_type > BLE_HCI_ADV_PEER_ADDR_MAX) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (cmd->sid > 0x0f) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - i = ble_ll_sync_on_list(cmd->peer_addr, cmd->peer_addr_type, cmd->sid); - if (i < 0) { - return BLE_ERR_UNK_ADV_INDENT; - } - - memset(&g_ble_ll_sync_adv_list[i], 0, sizeof(g_ble_ll_sync_adv_list[i])); - g_ble_ll_sync_adv_list[i].adv_sid = 0xff; - - return BLE_ERR_SUCCESS; -} - -int -ble_ll_sync_list_clear(void) -{ - int i; - - if (g_ble_ll_sync_create_comp_ev) { - return BLE_ERR_CMD_DISALLOWED; - } - - for (i = 0; i < ARRAY_SIZE(g_ble_ll_sync_adv_list); i++) { - memset(&g_ble_ll_sync_adv_list[i], 0, sizeof(g_ble_ll_sync_adv_list[i])); - g_ble_ll_sync_adv_list[i].adv_sid = 0xff; - } - - return BLE_ERR_SUCCESS; -} - -int -ble_ll_sync_list_size(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_le_rd_periodic_adv_list_size_rp *rsp = (void *) rspbuf; - - rsp->list_size = ARRAY_SIZE(g_ble_ll_sync_adv_list); - - *rsplen = sizeof(*rsp); - return BLE_ERR_SUCCESS; -} - -#if MYNEWT_VAL(BLE_VERSION) >= 51 -int -ble_ll_sync_receive_enable(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_periodic_adv_receive_enable_cp *cmd = (const void *)cmdbuf; - struct ble_ll_sync_sm *sm; - uint16_t handle; - os_sr_t sr; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (cmd->enable > 0x01) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - handle = le16toh(cmd->sync_handle); - if (handle > 0xeff) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - if (handle >= BLE_LL_SYNC_CNT) { - return BLE_ERR_UNK_ADV_INDENT; - } - - sm = &g_ble_ll_sync_sm[handle]; - - OS_ENTER_CRITICAL(sr); - - if (!(sm->flags & BLE_LL_SYNC_SM_FLAG_ESTABLISHED)) { - OS_EXIT_CRITICAL(sr); - return BLE_ERR_UNK_ADV_INDENT; - } - - if (cmd->enable) { - sm->flags &= ~BLE_LL_SYNC_SM_FLAG_DISABLED; - } else { - sm->flags |= BLE_LL_SYNC_SM_FLAG_DISABLED; - } - - OS_EXIT_CRITICAL(sr); - return BLE_ERR_SUCCESS; -} -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) -static struct ble_ll_sync_sm * -ble_ll_sync_transfer_get(const uint8_t *addr, uint8_t addr_type, uint8_t sid) -{ - struct ble_ll_sync_sm *sm; - int i; - - for (i = 0; i < BLE_LL_SYNC_CNT; i++) { - sm = &g_ble_ll_sync_sm[i]; - - if (!sm->flags) { - /* allocate event for transfer received event */ - sm->transfer_received_ev = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI); - if (!sm->transfer_received_ev) { - break; - } - - sm->adv_sid = sid; - sm->adv_addr_type = addr_type; - memcpy(&sm->adv_addr, addr, BLE_DEV_ADDR_LEN); - - sm->flags |= BLE_LL_SYNC_SM_FLAG_ESTABLISHING; - return sm; - } - } - - return NULL; -} - -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) -{ - const uint8_t *syncinfo = sync_ind + 2; - uint16_t sync_conn_event_count; - uint16_t last_pa_event_count; - struct ble_ll_sync_sm *sm; - uint16_t conn_event_count; - uint8_t sync_anchor_usecs; - const uint8_t *rpa = NULL; - int last_pa_diff; - uint32_t sync_anchor; - const uint8_t *addr; - uint16_t event_cntr; - uint32_t itvl_usecs; - uint32_t ww_adjust; - uint8_t addr_type; - uint8_t phy_mode; - uint32_t offset; - uint32_t future; - uint16_t itvl; - int rpa_index; - uint8_t sid; - uint8_t sca; - os_sr_t sr; - - phy_mode = ble_ll_ctrl_phy_from_phy_mask(sync_ind[25]); - itvl = get_le16(syncinfo + 2); - /* ignore if sync params are not valid */ - if ((phy_mode == 0) || (itvl < 6)) { - return; - } - - last_pa_event_count = get_le16(sync_ind + 22); - event_cntr = get_le16(syncinfo + 16); - itvl_usecs = itvl * BLE_LL_SYNC_ITVL_USECS; - - last_pa_diff = abs((int16_t)(event_cntr - last_pa_event_count)); - /* check if not 5 seconds apart, if so ignore sync transfer */ - if ((last_pa_diff * itvl_usecs) > 5000000) { - return; - } - - sid = (sync_ind[24] & 0x0f); - addr_type = (sync_ind[24] & 0x10) ? BLE_ADDR_RANDOM : BLE_ADDR_PUBLIC; - addr = sync_ind + 26; - - rpa_index = -1; - - /* check if need to resolve */ - if (ble_ll_is_rpa(addr, addr_type)) { - rpa_index = ble_ll_resolv_peer_rpa_any(addr); - if (rpa_index >= 0) { - rpa = addr; - addr = g_ble_ll_resolv_list[rpa_index].rl_identity_addr; - addr_type = g_ble_ll_resolv_list[rpa_index].rl_addr_type; - } - } - - OS_ENTER_CRITICAL(sr); - /* check if already synchronized with this peer */ - sm = ble_ll_sync_find(addr, addr_type, sid); - if (sm) { - OS_EXIT_CRITICAL(sr); - return; - } - - /* ignore if no memory for new sync */ - sm = ble_ll_sync_transfer_get(addr, addr_type, sid); - if (!sm) { - OS_EXIT_CRITICAL(sr); - return; - } - - OS_EXIT_CRITICAL(sr); - - if (rpa_index >= 0) { - sm->flags |= BLE_LL_SYNC_SM_FLAG_ADDR_RESOLVED; - memcpy(sm->adv_addr_rpa, rpa, BLE_DEV_ADDR_LEN); - } - - /* set params from transfer */ - sm->timeout = os_cputime_usecs_to_ticks(sync_timeout); - sm->skip = max_skip; - sm->sync_pending_cnt = BLE_LL_SYNC_ESTABLISH_CNT; - sm->transfer_id = get_le16(sync_ind); /* first two bytes */ - sm->transfer_conn = connsm; - - /* Sync Packet Offset (13 bits), Offset Units (1 bit), Offset Adjust (1 bit), - * RFU (1 bit) - */ - offset = syncinfo[0]; - offset |= (uint16_t)(syncinfo[1] & 0x1f) << 8; - - if (syncinfo[1] & 0x20) { - if (syncinfo[1] & 0x40) { - offset += 0x2000; - } - - offset *= 300; - sm->flags |= BLE_LL_SYNC_SM_FLAG_OFFSET_300; - } else { - offset *= 30; - sm->flags &= ~BLE_LL_SYNC_SM_FLAG_OFFSET_300; - } - - /* sync end event */ - ble_npl_event_init(&sm->sync_ev_end, ble_ll_sync_event_end, sm); - - sm->itvl = itvl; - - /* precalculate interval ticks and usecs */ - sm->itvl_ticks = os_cputime_usecs_to_ticks(itvl_usecs); - sm->itvl_usecs = (uint8_t)(itvl_usecs - - os_cputime_ticks_to_usecs(sm->itvl_ticks)); - if (sm->itvl_usecs == 31) { - sm->itvl_usecs = 0; - sm->itvl_ticks++; - } - - /* Channels Mask (37 bits) */ - sm->chanmap[0] = syncinfo[4]; - sm->chanmap[1] = syncinfo[5]; - sm->chanmap[2] = syncinfo[6]; - sm->chanmap[3] = syncinfo[7]; - sm->chanmap[4] = syncinfo[8] & 0x1f; - sm->num_used_chans = ble_ll_utils_calc_num_used_chans(sm->chanmap); - - /* SCA (3 bits) */ - sm->sca = syncinfo[8] >> 5; - - /* AA (4 bytes) */ - sm->access_addr = get_le32(syncinfo + 9); - sm->channel_id = ((sm->access_addr & 0xffff0000) >> 16) ^ - (sm->access_addr & 0x0000ffff); - - /* CRCInit (3 bytes) */ - sm->crcinit = syncinfo[13]; - sm->crcinit |= syncinfo[14] << 8; - sm->crcinit |= syncinfo[15] << 16; - - /* Event Counter (2 bytes) */ - sm->event_cntr = event_cntr; - - /* adjust skip if pass timeout */ - max_skip = get_max_skip(sm->itvl * BLE_LL_SYNC_ITVL_USECS, sync_timeout); - if (sm->skip > max_skip) { - sm->skip = max_skip; - } - - sm->phy_mode = phy_mode; - - /* Calculate channel index of first event */ - sm->chan_index = ble_ll_utils_calc_dci_csa2(sm->event_cntr, sm->channel_id, - sm->num_used_chans, sm->chanmap); - - sm->sch.sched_cb = ble_ll_sync_event_start_cb; - sm->sch.cb_arg = sm; - sm->sch.sched_type = BLE_LL_SCHED_TYPE_SYNC; - - /* get anchor for specified conn event */ - conn_event_count = get_le16(sync_ind + 20); - ble_ll_conn_get_anchor(connsm, conn_event_count, &sm->anchor_point, - &sm->anchor_point_usecs); - - /* Set last anchor point */ - sm->last_anchor_point = sm->anchor_point - (last_pa_diff * sm->itvl_ticks); - - /* calculate extra window widening */ - sync_conn_event_count = get_le16(sync_ind + 32); - sca = sync_ind[24] >> 5; - ble_ll_conn_get_anchor(connsm, sync_conn_event_count, &sync_anchor, - &sync_anchor_usecs); - ww_adjust = ble_ll_utils_calc_window_widening(connsm->anchor_point, - sync_anchor, sca); - - /* spin until we get anchor in future */ - future = os_cputime_get32() + g_ble_ll_sched_offset_ticks; - while (CPUTIME_LT(sm->anchor_point, future)) { - if (ble_ll_sync_next_event(sm, ww_adjust) < 0) { - /* release SM if this failed */ - ble_ll_sync_transfer_received(sm, BLE_ERR_CONN_ESTABLISHMENT); - memset(sm, 0, sizeof(*sm)); - return; - } - } - - if (ble_ll_sched_sync(&sm->sch, sm->anchor_point, sm->anchor_point_usecs, - offset, sm->phy_mode)) { - /* release SM if this failed */ - ble_ll_sync_transfer_received(sm, BLE_ERR_CONN_ESTABLISHMENT); - memset(sm, 0, sizeof(*sm)); - return; - } - - /* Set new anchor point */ - sm->anchor_point = sm->sch.start_time + g_ble_ll_sched_offset_ticks; - sm->anchor_point_usecs = sm->sch.remainder; - - if (reports_disabled) { - sm->flags |= BLE_LL_SYNC_SM_FLAG_DISABLED; - } -} - -static void -ble_ll_sync_put_syncinfo(struct ble_ll_sync_sm *syncsm, - struct ble_ll_conn_sm *connsm, uint8_t *conn_event_cnt, - uint8_t *dptr) -{ - uint8_t anchor_usecs; - uint16_t conn_cnt; - uint32_t offset; - uint32_t anchor; - uint8_t units; - - anchor = connsm->anchor_point; - anchor_usecs = connsm->anchor_point_usecs; - conn_cnt = connsm->event_cntr; - - /* get anchor for conn event that is before periodic_adv_event_start_time */ - while (CPUTIME_GT(anchor, syncsm->anchor_point)) { - ble_ll_conn_get_anchor(connsm, --conn_cnt, &anchor, &anchor_usecs); - } - - offset = os_cputime_ticks_to_usecs(syncsm->anchor_point - anchor); - offset -= anchor_usecs; - offset += syncsm->anchor_point_usecs; - - /* connEventCount */ - put_le16(conn_event_cnt, conn_cnt); - - /* Sync Packet Offset (13 bits), Offset Units (1 bit), Offset Adjust (1 bit), - * RFU (1 bit) - */ - if (offset > 245700) { - units = 0x20; - - if (offset >= 0x2000) { - offset -= 0x2000; - units |= 0x40; - } - - offset = offset / 300; - } else { - units = 0x00; - offset = offset / 30; - } - - dptr[0] = (offset & 0x000000ff); - dptr[1] = ((offset >> 8) & 0x0000001f) | units; - - /* Interval (2 bytes) */ - put_le16(&dptr[2], syncsm->itvl); - - /* Channels Mask (37 bits) */ - dptr[4] = syncsm->chanmap[0]; - dptr[5] = syncsm->chanmap[1]; - dptr[6] = syncsm->chanmap[2]; - dptr[7] = syncsm->chanmap[3]; - dptr[8] = syncsm->chanmap[4] & 0x1f; - - /* SCA (3 bits) */ - dptr[8] |= syncsm->sca << 5; - - /* AA (4 bytes) */ - put_le32(&dptr[9], syncsm->access_addr); - - /* CRCInit (3 bytes) */ - dptr[13] = (uint8_t)syncsm->crcinit; - dptr[14] = (uint8_t)(syncsm->crcinit >> 8); - dptr[15] = (uint8_t)(syncsm->crcinit >> 16); - - /* Event Counter (2 bytes) */ - put_le16(&dptr[16], syncsm->event_cntr); -} - -static int -ble_ll_sync_send_sync_ind(struct ble_ll_sync_sm *syncsm, - struct ble_ll_conn_sm *connsm, uint16_t service_data) -{ - struct os_mbuf *om; - uint8_t *sync_ind; - - om = os_msys_get_pkthdr(BLE_LL_CTRL_MAX_PDU_LEN, - sizeof(struct ble_mbuf_hdr)); - if (!om) { - return BLE_ERR_MEM_CAPACITY; - } - - om->om_data[0] = BLE_LL_CTRL_PERIODIC_SYNC_IND; - - sync_ind = om->om_data + 1; - - /* ID (service_data), already in LE order */ - memcpy(sync_ind, &service_data, sizeof(service_data)); - - /* fill in syncinfo */ - ble_ll_sync_put_syncinfo(syncsm, connsm, sync_ind + 20, sync_ind + 2); - - /* lastPaEventCounter */ - put_le16(sync_ind + 22, syncsm->event_cntr_last_received); - - /* SID, AType, SCA */ - sync_ind[24] = syncsm->adv_sid; - - if (syncsm->flags & BLE_LL_SYNC_SM_FLAG_ADDR_RESOLVED) { - sync_ind[24] |= 1 << 4; - } else { - sync_ind[24] |= (syncsm->adv_addr_type == BLE_ADDR_RANDOM) << 4 ; - } - - sync_ind[24] |= MYNEWT_VAL(BLE_LL_MASTER_SCA) << 5; - - /* PHY */ - sync_ind[25] = (0x01 << (ble_ll_sync_phy_mode_to_hci(syncsm->phy_mode) - 1)); - - /* AdvA */ - if (syncsm->flags & BLE_LL_SYNC_SM_FLAG_ADDR_RESOLVED) { - memcpy(sync_ind + 26, syncsm->adv_addr_rpa, BLE_DEV_ADDR_LEN); - } else { - memcpy(sync_ind + 26, syncsm->adv_addr, BLE_DEV_ADDR_LEN); - } - - /* syncConnEventCount */ - put_le16(sync_ind + 32, connsm->event_cntr); - - ble_ll_conn_enqueue_pkt(connsm, om, BLE_LL_LLID_CTRL, - BLE_LL_CTRL_PERIODIC_SYNC_IND_LEN + 1); - - return BLE_ERR_SUCCESS; -} - -int -ble_ll_sync_transfer(const uint8_t *cmdbuf, uint8_t len, - uint8_t *rspbuf, uint8_t *rsplen) -{ - const struct ble_hci_le_periodic_adv_sync_transfer_cp *cmd = (const void *)cmdbuf; - struct ble_hci_le_periodic_adv_sync_transfer_rp *rsp = (void *) rspbuf; - struct ble_ll_conn_sm *connsm; - struct ble_ll_sync_sm *sm; - uint16_t handle; - os_sr_t sr; - int rc; - - if (len != sizeof(*cmd)) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - handle = le16toh(cmd->sync_handle); - if (handle > 0xeff) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - goto done; - } - - if (handle >= BLE_LL_SYNC_CNT) { - rc = BLE_ERR_UNK_ADV_INDENT; - goto done; - } - - sm = &g_ble_ll_sync_sm[handle]; - - OS_ENTER_CRITICAL(sr); - - if (!(sm->flags & BLE_LL_SYNC_SM_FLAG_ESTABLISHED)) { - rc = BLE_ERR_UNK_ADV_INDENT; - OS_EXIT_CRITICAL(sr); - goto done; - } - - handle = le16toh(cmd->conn_handle); - if (handle > 0xeff) { - rc = BLE_ERR_INV_HCI_CMD_PARMS; - OS_EXIT_CRITICAL(sr); - goto done; - } - - connsm = ble_ll_conn_find_active_conn(handle); - if (!connsm) { - rc = BLE_ERR_UNK_CONN_ID; - OS_EXIT_CRITICAL(sr); - goto done; - } - - /* TODO should not need to shift - * byte 3 (0 byte is conn_feature) , bit 1 - * - * Allow initiate LL procedure only if remote supports it. - */ - if (!(connsm->remote_features[2] & (BLE_LL_FEAT_SYNC_TRANS_RECV >> (8 * 3)))) { - rc = BLE_ERR_UNSUPP_REM_FEATURE; - goto done; - } - - rc = ble_ll_sync_send_sync_ind(sm, connsm, cmd->service_data); - - OS_EXIT_CRITICAL(sr); -done: - rsp->conn_handle = cmd->conn_handle; - *rsplen = sizeof(*rsp); - return rc; -} -#endif - -/* - * Called when a sync scan event has been removed from the scheduler - * without being run. - */ -void -ble_ll_sync_rmvd_from_sched(struct ble_ll_sync_sm *sm) -{ - ble_ll_event_send(&sm->sync_ev_end); -} - -bool -ble_ll_sync_enabled(void) -{ - return g_ble_ll_sync_create_comp_ev != NULL; -} - -/** - * Called to reset the sync module. When this function is called the - * scheduler has been stopped and the phy has been disabled. The LL should - * be in the standby state. - */ -void -ble_ll_sync_reset(void) -{ - int i; - - for (i = 0; i < BLE_LL_SYNC_CNT; i++) { - ble_ll_sync_sm_clear(&g_ble_ll_sync_sm[i]); - } - - for (i = 0; i < ARRAY_SIZE(g_ble_ll_sync_adv_list); i++) { - memset(&g_ble_ll_sync_adv_list[i], 0, sizeof(g_ble_ll_sync_adv_list[i])); - g_ble_ll_sync_adv_list[i].adv_sid = 0xff; - } - - g_ble_ll_sync_create_params.timeout = 0; - g_ble_ll_sync_create_params.max_skip = 0; - g_ble_ll_sync_create_params.options = 0; - - g_ble_ll_sync_sm_current = NULL; - - if (g_ble_ll_sync_create_comp_ev) { - ble_hci_trans_buf_free(g_ble_ll_sync_create_comp_ev); - g_ble_ll_sync_create_comp_ev = NULL; - } -} - -void -ble_ll_sync_init(void) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(g_ble_ll_sync_adv_list); i++) { - g_ble_ll_sync_adv_list[i].adv_sid = 0xff; - } -} -#endif -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_trace.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_trace.c deleted file mode 100644 index c5d2b1d41..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_trace.c +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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 ESP_PLATFORM -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os_trace_api.h" - -#if MYNEWT_VAL(BLE_LL_SYSVIEW) - -static os_trace_module_t g_ble_ll_trace_mod; -uint32_t ble_ll_trace_off; - -static void -ble_ll_trace_module_send_desc(void) -{ - os_trace_module_desc(&g_ble_ll_trace_mod, "0 ll_sched lls=%u cputime=%u start_time=%u"); - os_trace_module_desc(&g_ble_ll_trace_mod, "1 ll_rx_start lls=%u pdu_type=%x"); - os_trace_module_desc(&g_ble_ll_trace_mod, "2 ll_rx_end pdu_type=%x len=%u flags=%x"); - os_trace_module_desc(&g_ble_ll_trace_mod, "3 ll_wfr_timer_exp lls=%u xcvr=%u rx_start=%u"); - os_trace_module_desc(&g_ble_ll_trace_mod, "4 ll_ctrl_rx opcode=%u len=%u"); - os_trace_module_desc(&g_ble_ll_trace_mod, "5 ll_conn_ev_start conn_handle=%u"); - os_trace_module_desc(&g_ble_ll_trace_mod, "6 ll_conn_ev_end conn_handle=%u event_cntr=%u"); - os_trace_module_desc(&g_ble_ll_trace_mod, "7 ll_conn_end conn_handle=%u event_cntr=%u err=%u"); - os_trace_module_desc(&g_ble_ll_trace_mod, "8 ll_conn_tx len=%u offset=%u"); - os_trace_module_desc(&g_ble_ll_trace_mod, "9 ll_conn_rx conn_sn=%u pdu_nesn=%u"); - os_trace_module_desc(&g_ble_ll_trace_mod, "10 ll_adv_txdone inst=%u chanset=%x"); - os_trace_module_desc(&g_ble_ll_trace_mod, "11 ll_adv_halt inst=%u"); - os_trace_module_desc(&g_ble_ll_trace_mod, "12 ll_aux_ref aux=%p ref=%u"); - os_trace_module_desc(&g_ble_ll_trace_mod, "13 ll_aux_unref aux=%p ref=%u"); -} - -void -ble_ll_trace_init(void) -{ - ble_ll_trace_off = - os_trace_module_register(&g_ble_ll_trace_mod, "ble_ll", 12, - ble_ll_trace_module_send_desc); -} -#endif -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_utils.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_utils.c deleted file mode 100644 index 3814e58a8..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_utils.c +++ /dev/null @@ -1,303 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include "nimble/nimble/include/nimble/ble.h" -#include "../include/controller/ble_ll.h" -#include "../include/controller/ble_ll_utils.h" - -/* 37 bits require 5 bytes */ -#define BLE_LL_CHMAP_LEN (5) - -/* Sleep clock accuracy table (in ppm) */ -static const uint16_t g_ble_sca_ppm_tbl[8] = { - 500, 250, 150, 100, 75, 50, 30, 20 -}; - -uint32_t -ble_ll_utils_calc_access_addr(void) -{ - uint32_t aa; - uint16_t aa_low; - uint16_t aa_high; - uint32_t temp; - uint32_t mask; - uint32_t prev_bit; - uint8_t bits_diff; - uint8_t consecutive; - uint8_t transitions; - uint8_t ones; - int tmp; - - /* Calculate a random access address */ - aa = 0; - while (1) { - /* Get two, 16-bit random numbers */ - aa_low = rand() & 0xFFFF; - aa_high = rand() & 0xFFFF; - - /* All four bytes cannot be equal */ - if (aa_low == aa_high) { - continue; - } - - /* Upper 6 bits must have 2 transitions */ - tmp = (int16_t)aa_high >> 10; - if (__builtin_popcount(tmp ^ (tmp >> 1)) < 2) { - continue; - } - - /* Cannot be access address or be 1 bit different */ - aa = aa_high; - aa = (aa << 16) | aa_low; - bits_diff = 0; - temp = aa ^ BLE_ACCESS_ADDR_ADV; - for (mask = 0x00000001; mask != 0; mask <<= 1) { - if (mask & temp) { - ++bits_diff; - if (bits_diff > 1) { - break; - } - } - } - if (bits_diff <= 1) { - continue; - } - - /* Cannot have more than 24 transitions */ - transitions = 0; - consecutive = 1; - ones = 0; - mask = 0x00000001; - while (mask < 0x80000000) { - prev_bit = aa & mask; - mask <<= 1; - if (mask & aa) { - if (prev_bit == 0) { - ++transitions; - consecutive = 1; - } else { - ++consecutive; - } - } else { - if (prev_bit == 0) { - ++consecutive; - } else { - ++transitions; - consecutive = 1; - } - } - - if (prev_bit) { - ones++; - } - - /* 8 lsb should have at least three 1 */ - if (mask == 0x00000100 && ones < 3) { - break; - } - - /* 16 lsb should have no more than 11 transitions */ - if (mask == 0x00010000 && transitions > 11) { - break; - } - - /* This is invalid! */ - if (consecutive > 6) { - /* Make sure we always detect invalid sequence below */ - mask = 0; - break; - } - } - - /* Invalid sequence found */ - if (mask != 0x80000000) { - continue; - } - - /* Cannot be more than 24 transitions */ - if (transitions > 24) { - continue; - } - - /* We have a valid access address */ - break; - } - return aa; -} - -uint8_t -ble_ll_utils_remapped_channel(uint8_t remap_index, const uint8_t *chanmap) -{ - uint8_t cntr; - uint8_t mask; - uint8_t usable_chans; - uint8_t chan; - int i, j; - - /* NOTE: possible to build a map but this would use memory. For now, - * we just calculate - * Iterate through channel map to find this channel - */ - chan = 0; - cntr = 0; - for (i = 0; i < BLE_LL_CHMAP_LEN; i++) { - usable_chans = chanmap[i]; - if (usable_chans != 0) { - mask = 0x01; - for (j = 0; j < 8; j++) { - if (usable_chans & mask) { - if (cntr == remap_index) { - return (chan + j); - } - ++cntr; - } - mask <<= 1; - } - } - chan += 8; - } - - /* we should never reach here */ - BLE_LL_ASSERT(0); - return 0; -} - -uint8_t -ble_ll_utils_calc_num_used_chans(const uint8_t *chmap) -{ - int i; - int j; - uint8_t mask; - uint8_t chanbyte; - uint8_t used_channels; - - used_channels = 0; - for (i = 0; i < BLE_LL_CHMAP_LEN; ++i) { - chanbyte = chmap[i]; - if (chanbyte) { - if (chanbyte == 0xff) { - used_channels += 8; - } else { - mask = 0x01; - for (j = 0; j < 8; ++j) { - if (chanbyte & mask) { - ++used_channels; - } - mask <<= 1; - } - } - } - } - return used_channels; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) -static uint16_t -ble_ll_utils_csa2_perm(uint16_t in) -{ - uint16_t out = 0; - int i; - - for (i = 0; i < 8; i++) { - out |= ((in >> i) & 0x00000001) << (7 - i); - } - - for (i = 8; i < 16; i++) { - out |= ((in >> i) & 0x00000001) << (15 + 8 - i); - } - - return out; -} - -static uint16_t -ble_ll_utils_csa2_prng(uint16_t counter, uint16_t ch_id) -{ - uint16_t prn_e; - - prn_e = counter ^ ch_id; - - prn_e = ble_ll_utils_csa2_perm(prn_e); - prn_e = (prn_e * 17) + ch_id; - - prn_e = ble_ll_utils_csa2_perm(prn_e); - prn_e = (prn_e * 17) + ch_id; - - prn_e = ble_ll_utils_csa2_perm(prn_e); - prn_e = (prn_e * 17) + ch_id; - - prn_e = prn_e ^ ch_id; - - return prn_e; -} - -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) -{ - uint16_t channel_unmapped; - uint8_t remap_index; - - uint16_t prn_e; - uint8_t bitpos; - - prn_e = ble_ll_utils_csa2_prng(event_cntr, channel_id); - - channel_unmapped = prn_e % 37; - - /* - * If unmapped channel is the channel index of a used channel it is used - * as channel index. - */ - bitpos = 1 << (channel_unmapped & 0x07); - if (chanmap[channel_unmapped >> 3] & bitpos) { - return channel_unmapped; - } - - remap_index = (num_used_chans * prn_e) / 0x10000; - - return ble_ll_utils_remapped_channel(remap_index, chanmap); -} -#endif - -uint32_t -ble_ll_utils_calc_window_widening(uint32_t anchor_point, - uint32_t last_anchor_point, - uint8_t master_sca) -{ - uint32_t total_sca_ppm; - uint32_t window_widening; - int32_t time_since_last_anchor; - uint32_t delta_msec; - - window_widening = 0; - - time_since_last_anchor = (int32_t)(anchor_point - last_anchor_point); - if (time_since_last_anchor > 0) { - delta_msec = os_cputime_ticks_to_usecs(time_since_last_anchor) / 1000; - total_sca_ppm = g_ble_sca_ppm_tbl[master_sca] + - MYNEWT_VAL(BLE_LL_OUR_SCA); - window_widening = (total_sca_ppm * delta_msec) / 1000; - } - - return window_widening; -} -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_whitelist.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_whitelist.c deleted file mode 100644 index 8b9251117..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/src/ble_ll_whitelist.c +++ /dev/null @@ -1,297 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" - -#if defined(ARDUINO_ARCH_NRF5) && defined(NRF51) -#include "nimble/nimble/drivers/nrf51/include/ble/xcvr.h" -#elif defined(ARDUINO_ARCH_NRF5) && defined(NRF52_SERIES) -#include "nimble/nimble/drivers/nrf52/include/ble/xcvr.h" -#endif - -#include "../include/controller/ble_ll_whitelist.h" -#include "../include/controller/ble_ll_hci.h" -#include "../include/controller/ble_ll_adv.h" -#include "../include/controller/ble_ll_scan.h" -#include "../include/controller/ble_hw.h" - -#if (MYNEWT_VAL(BLE_LL_WHITELIST_SIZE) < BLE_HW_WHITE_LIST_SIZE) -#define BLE_LL_WHITELIST_SIZE MYNEWT_VAL(BLE_LL_WHITELIST_SIZE) -#else -#define BLE_LL_WHITELIST_SIZE BLE_HW_WHITE_LIST_SIZE -#endif - -struct ble_ll_whitelist_entry -{ - uint8_t wl_valid; - uint8_t wl_addr_type; - uint8_t wl_dev_addr[BLE_DEV_ADDR_LEN]; -}; - -struct ble_ll_whitelist_entry g_ble_ll_whitelist[BLE_LL_WHITELIST_SIZE]; - -static int -ble_ll_whitelist_chg_allowed(void) -{ - int rc; - - /* - * This command is not allowed if: - * -> advertising uses the whitelist and we are currently advertising. - * -> scanning uses the whitelist and is enabled. - * -> initiating uses whitelist and a LE create connection command is in - * progress - */ - rc = 1; - if (!ble_ll_adv_can_chg_whitelist() || !ble_ll_scan_can_chg_whitelist()) { - rc = 0; - } - return rc; -} - -/** - * Clear the whitelist. - * - * @return int 0: success, BLE error code otherwise - */ -int -ble_ll_whitelist_clear(void) -{ - int i; - struct ble_ll_whitelist_entry *wl; - - /* Check proper state */ - if (!ble_ll_whitelist_chg_allowed()) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* Set the number of entries to 0 */ - wl = &g_ble_ll_whitelist[0]; - for (i = 0; i < BLE_LL_WHITELIST_SIZE; ++i) { - wl->wl_valid = 0; - ++wl; - } - -#if (BLE_USES_HW_WHITELIST == 1) - ble_hw_whitelist_clear(); -#endif - - return BLE_ERR_SUCCESS; -} - -/** - * Read the size of the whitelist. This is the total number of whitelist - * entries allowed by the controller. - * - * @param rspbuf Pointer to response buffer - * - * @return int 0: success. - */ -int -ble_ll_whitelist_read_size(uint8_t *rspbuf, uint8_t *rsplen) -{ - struct ble_hci_le_rd_white_list_rp *rsp = (void *) rspbuf; - - rsp->size = BLE_LL_WHITELIST_SIZE; - - *rsplen = sizeof(*rsp); - - return BLE_ERR_SUCCESS; -} - -/** - * Searches the whitelist to determine if the address is present in the - * whitelist. This is an internal API that only searches the link layer - * whitelist and does not care about the hardware whitelist - * - * @param addr Device or identity address to check. - * @param addr_type Public address (0) or random address (1) - * - * @return int 0: device is not on whitelist; otherwise the return value - * is the 'position' of the device in the whitelist (the index of the element - * plus 1). - */ -static int -ble_ll_whitelist_search(const uint8_t *addr, uint8_t addr_type) -{ - int i; - struct ble_ll_whitelist_entry *wl; - - wl = &g_ble_ll_whitelist[0]; - for (i = 0; i < BLE_LL_WHITELIST_SIZE; ++i) { - if ((wl->wl_valid) && (wl->wl_addr_type == addr_type) && - (!memcmp(&wl->wl_dev_addr[0], addr, BLE_DEV_ADDR_LEN))) { - return i + 1; - } - ++wl; - } - - return 0; -} - -/** - * Is there a match between the device and a device on the whitelist. - * - * NOTE: This API uses the HW, if present, to determine if there was a match - * between a received address and an address in the whitelist. If the HW does - * not support whitelisting this API is the same as the whitelist search API - * - * @param addr - * @param addr_type Public address (0) or random address (1) - * @param is_ident True if addr is an identity address; false otherwise - * - * @return int - */ -int -ble_ll_whitelist_match(uint8_t *addr, uint8_t addr_type, int is_ident) -{ - int rc; -#if (BLE_USES_HW_WHITELIST == 1) - /* - * XXX: This should be changed. This is HW specific: some HW may be able - * to both resolve a private address and perform a whitelist check. The - * current BLE hw cannot support this. - */ - if (is_ident) { - rc = ble_ll_whitelist_search(addr, addr_type); - } else { - rc = ble_hw_whitelist_match(); - } -#else - rc = ble_ll_whitelist_search(addr, addr_type); -#endif - return rc; -} - -/** - * Add a device to the whitelist - * - * @return int - */ -int -ble_ll_whitelist_add(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_add_whte_list_cp *cmd = (const void *) cmdbuf; - struct ble_ll_whitelist_entry *wl; - int rc; - int i; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Must be in proper state */ - if (!ble_ll_whitelist_chg_allowed()) { - return BLE_ERR_CMD_DISALLOWED; - } - - /* Check if we have any open entries */ - rc = BLE_ERR_SUCCESS; - if (!ble_ll_whitelist_search(cmd->addr, cmd->addr_type)) { - wl = &g_ble_ll_whitelist[0]; - for (i = 0; i < BLE_LL_WHITELIST_SIZE; ++i) { - if (wl->wl_valid == 0) { - memcpy(&wl->wl_dev_addr[0], cmd->addr, BLE_DEV_ADDR_LEN); - wl->wl_addr_type = cmd->addr_type; - wl->wl_valid = 1; - break; - } - ++wl; - } - - if (i == BLE_LL_WHITELIST_SIZE) { - rc = BLE_ERR_MEM_CAPACITY; - } else { -#if (BLE_USES_HW_WHITELIST == 1) - rc = ble_hw_whitelist_add(cmd->addr, cmd->addr_type); -#endif - } - } - - return rc; -} - -/** - * Remove a device from the whitelist - * - * @param cmdbuf - * - * @return int 0: success, BLE error code otherwise - */ -int -ble_ll_whitelist_rmv(const uint8_t *cmdbuf, uint8_t len) -{ - const struct ble_hci_le_rmv_white_list_cp *cmd = (const void *) cmdbuf; - int position; - - if (len != sizeof(*cmd)) { - return BLE_ERR_INV_HCI_CMD_PARMS; - } - - /* Must be in proper state */ - if (!ble_ll_whitelist_chg_allowed()) { - return BLE_ERR_CMD_DISALLOWED; - } - - position = ble_ll_whitelist_search(cmd->addr, cmd->addr_type); - if (position) { - g_ble_ll_whitelist[position - 1].wl_valid = 0; - } - -#if (BLE_USES_HW_WHITELIST == 1) - ble_hw_whitelist_rmv(cmd->addr, cmd->addr_type); -#endif - - return BLE_ERR_SUCCESS; -} - -/** - * Enable whitelisting. - * - * Note: This function has no effect if we are not using HW whitelisting - */ -void -ble_ll_whitelist_enable(void) -{ -#if (BLE_USES_HW_WHITELIST == 1) - ble_hw_whitelist_enable(); -#endif -} - -/** - * Disable whitelisting. - * - * Note: This function has no effect if we are not using HW whitelisting - */ -void -ble_ll_whitelist_disable(void) -{ -#if (BLE_USES_HW_WHITELIST == 1) - ble_hw_whitelist_disable(); -#endif -} - -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/syscfg.yml deleted file mode 100644 index 85049cb09..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/controller/syscfg.yml +++ /dev/null @@ -1,434 +0,0 @@ -# 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. -# - -syscfg.defs: - BLE_CONTROLLER: - description: > - Indicates that NimBLE controller is present. The default value for - this setting shall not be overriden. - value: 1 - - BLE_HW_WHITELIST_ENABLE: - description: > - Used to enable hardware white list - value: 1 - - BLE_LL_SYSVIEW: - description: > - Enable SystemView tracing module for controller. - value: 0 - - BLE_LL_PRIO: - description: 'The priority of the LL task' - type: 'task_priority' - value: 0 - - # Sleep clock accuracy (sca). This is the amount of drift in the system - # during when the device is sleeping (in parts per million). - # - # NOTE: 'the' master sca is an enumerated value based on the sca. Rather - # than have a piece of code calculate this value, the developer must set - # this value based on the value of the SCA using the following table: - # - # SCA between 251 and 500 ppm (inclusive); master sca = 0 - # SCA between 151 and 250 ppm (inclusive); master sca = 1 - # SCA between 101 and 150 ppm (inclusive); master sca = 2 - # SCA between 76 and 100 ppm (inclusive); master sca = 3 - # SCA between 51 and 75 ppm (inclusive); master sca = 4 - # SCA between 31 and 50 ppm (inclusive); master sca = 5 - # SCA between 21 and 30 ppm (inclusive); master sca = 6 - # SCA between 0 and 20 ppm (inclusive); master sca = 7 - # - # For example: - # if your clock drift is 101 ppm, your master should be set to 2. - # if your clock drift is 20, your master sca should be set to 7. - # - # The values provided below are merely meant to be an example and should - # be replaced by values appropriate for your platform. - BLE_LL_OUR_SCA: - description: 'The system clock accuracy of the device.' - value: '60' # in ppm - - BLE_LL_MASTER_SCA: - description: 'Enumerated value based on our sca' - value: '4' - - BLE_LL_TX_PWR_DBM: - description: 'Transmit power level.' - value: '0' - - BLE_LL_NUM_COMP_PKT_ITVL_MS: - description: > - Determines the interval at which the controller will send the - number of completed packets event to the host. Rate is in milliseconds. - value: 2000 - - BLE_LL_MFRG_ID: - description: > - Manufacturer ID. Should be set to unique ID per manufacturer. - value: '0xFFFF' - - # Configuration items for the number of duplicate advertisers and the - # number of advertisers from which we have heard a scan response. - BLE_LL_NUM_SCAN_DUP_ADVS: - description: 'The number of duplicate advertisers stored.' - value: '8' - BLE_LL_NUM_SCAN_RSP_ADVS: - description: > - The number of advertisers from which we have heard a scan - response. Prevents sending duplicate events to host. - value: '8' - - BLE_LL_WHITELIST_SIZE: - description: 'Size of the LL whitelist.' - value: '8' - - BLE_LL_RESOLV_LIST_SIZE: - description: 'Size of the resolving list.' - value: '4' - - # Data length management definitions for connections. These define the - # maximum size of the PDU's that will be sent and/or received in a - # connection. - BLE_LL_MAX_PKT_SIZE: - description: 'The maximum PDU size that can be sent/received' - value: '251' - BLE_LL_SUPP_MAX_RX_BYTES: - description: 'The maximum supported received PDU size' - value: MYNEWT_VAL(BLE_LL_MAX_PKT_SIZE) - BLE_LL_SUPP_MAX_TX_BYTES: - description: 'The maximum supported transmit PDU size' - value: MYNEWT_VAL(BLE_LL_MAX_PKT_SIZE) - BLE_LL_CONN_INIT_MAX_TX_BYTES: - description: > - Used to set the initial maximum transmit PDU size in a - connection. If this is set to a value greater than 27, - the controller will automatically attempt to do the - data length update procedure. The host can always tell - the controller to update this value. - value: '27' - - # The number of slots that will be allocated to each connection - BLE_LL_CONN_INIT_SLOTS: - description: > - This is the number of "slots" allocated to a connection when scheduling - connections. Each slot is 1.25 msecs long. Note that a connection event may - last longer than the number of slots allocated here and may also end earlier - (depending on when the next scheduled event occurs and how much data needs - to be transferred in the connection). However, you will be guaranteed that - a connection event will be given this much time, if needed. Consecutively - scheduled items will be at least this far apart - value: '4' - - BLE_LL_CONN_INIT_MIN_WIN_OFFSET: - description: > - This is the minimum number of "slots" for WindowOffset value used for - CONNECT_IND when creating new connection as a master. Each slot is 1.25 - msecs long. Increasing this value will delay first connection event after - connection is created. However, older TI CC254x controllers cannot change - connection parameters later if WindowOffset was set to 0 in CONNECT_IND. To - ensure interoperability with such devices set this value to 2 (or more). - value: '0' - - # Strict scheduling - BLE_LL_STRICT_CONN_SCHEDULING: - description: > - Forces the scheduler on a central to schedule connections in fixed - time intervals called periods. If set to 0, the scheduler is not forced - to do this. If set to 1, the scheduler will only schedule connections at - period boundaries. See comments in ble_ll_sched.h for more details. - value: '0' - - BLE_LL_ADD_STRICT_SCHED_PERIODS: - description: > - The number of additional periods that will be allocated for strict - scheduling. The total # of periods allocated for strict scheduling - will be equal to the number of connections plus this number. - value: '0' - - BLE_LL_USECS_PER_PERIOD: - description: > - The number of usecs per period. - value: '3250' - - # The number of random bytes to store - BLE_LL_RNG_BUFSIZE: - description: > - The number of random bytes that the link layer will try to - always have available for the host to use. Decreasing this - value may cause host delays if the host needs lots of random - material often. - value: '32' - - BLE_LL_RFMGMT_ENABLE_TIME: - description: > - Time required for radio and/or related components to be fully - enabled before any request from LL is sent. This value is used - by rfmgmt to enable PHY in advance, before request from LL is - made. It depends on radio driver selected and may also depend - on hardware used: - - nrf51 - time required for XTAL to settle - - nrf52 - time required for XTAL to settle - Value is specified in microseconds. If set to 0, rfmgmt keeps - PHY enabled all the time. - value: MYNEWT_VAL(BLE_XTAL_SETTLE_TIME) - - # Configuration for LL supported features. - # - # There are a total 8 features that the LL can support. These can be found - # in v4.2, Vol 6 Part B Section 4.6. - # - # These feature definitions are used to inform a host or other controller - # about the LL features supported by the controller. - # - # NOTE: 'the' controller always supports extended reject indicate and thus - # is not listed here. - - - BLE_LL_CFG_FEAT_LE_ENCRYPTION: - description: > - This option enables/disables encryption support in the controller. - This option saves both both code and RAM. - value: '1' - - BLE_LL_CFG_FEAT_CONN_PARAM_REQ: - description: > - This option enables/disables the connection parameter request - procedure. This is implemented in the controller but is disabled - by default. - value: '1' - - BLE_LL_CFG_FEAT_SLAVE_INIT_FEAT_XCHG: - description: > - This option allows a slave to initiate the feature exchange - procedure. This feature is implemented but currently has no impact - on code or ram size - value: '1' - - BLE_LL_CFG_FEAT_LE_PING: - description: > - This option allows a controller to send/receive LE pings. - Currently, this feature is not implemented by the controller so - turning it on or off has no effect. - value: 'MYNEWT_VAL_BLE_LL_CFG_FEAT_LE_ENCRYPTION' - - BLE_LL_CFG_FEAT_DATA_LEN_EXT: - description: > - This option enables/disables the data length update procedure in - the controller. If enabled, the controller is allowed to change the - size of tx/rx pdu's used in a connection. This option has only - minor impact on code size and non on RAM. - value: '1' - - BLE_LL_CFG_FEAT_LL_PRIVACY: - description: > - This option is used to enable/disable LL privacy. - value: '1' - - BLE_LL_CFG_FEAT_LE_CSA2: - description: > - This option is used to enable/disable support for LE Channel - Selection Algorithm #2. - value: '0' - - BLE_LL_CFG_FEAT_LE_2M_PHY: - description: > - This option is used to enable/disable support for the 2Mbps PHY. - value: '0' - - BLE_LL_CFG_FEAT_LE_CODED_PHY: - description: > - This option is used to enable/disable support for the coded PHY. - value: '0' - - BLE_LL_CFG_FEAT_LL_EXT_ADV: - description: > - This option is used to enable/disable support for Extended - Advertising Feature. That means extended scanner, advertiser - and connect. - value: MYNEWT_VAL(BLE_EXT_ADV) - - BLE_LL_CFG_FEAT_LL_PERIODIC_ADV: - description: > - This option is used to enable/disable support for Periodic - Advertising Feature. - value: MYNEWT_VAL(BLE_PERIODIC_ADV) - - BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_CNT: - description: > - This option is used to configure number of supported periodic syncs. - value: MYNEWT_VAL(BLE_MAX_PERIODIC_SYNCS) - - BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_LIST_CNT: - description: > - Size of Periodic Advertiser sync list. - value: MYNEWT_VAL(BLE_MAX_PERIODIC_SYNCS) - - BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER: - description: > - This option is use to enable/disable support for Periodic - Advertising Sync Transfer Feature. - value: MYNEWT_VAL(BLE_PERIODIC_ADV_SYNC_TRANSFER) - - BLE_LL_EXT_ADV_AUX_PTR_CNT: - description: > - This option configure a max number of scheduled outstanding auxiliary - packets for receive on secondary advertising channel. - value: 0 - - BLE_PUBLIC_DEV_ADDR: - description: > - Allows the target or app to override the public device address - used by the controller. If all zero, the controller will - attempt to retrieve the public device address from its - chip specific location. If non-zero, this address will - be used. - value: "(uint8_t[6]){0x00, 0x00, 0x00, 0x00, 0x00, 0x00}" - - BLE_LL_DTM: - description: > - Enables HCI Test commands needed for Bluetooth SIG certification - value: MYNEWT_VAL(BLE_LL_DIRECT_TEST_MODE) - BLE_LL_DTM_EXTENSIONS: - description: > - Enables non-standard extensions to HCI test commands. Once enabled, - HCI_LE_Transmitter_Test accepts extra parameters in addition to - those defined in Core specification - interval (2 octets) interval between packets (usecs), overrides - standard interval - pkt_count (2 octets) number of packets to transmit, controller - will automatically stop sending packets - after given number of packets was sent - Setting either of these parameters to 0 will configure for default - behavior, as per Core specification. - If specified interval is shorter then allowed by specification it - will be ignored. - Extended parameters shall immediately follow standard parameters. - Controller can accept both standard and extended version of command - depending on specified HCI command length. - value: 0 - - BLE_LL_VND_EVENT_ON_ASSERT: - description: > - This options enables controller to send a vendor-specific event on - an assertion in controller code. The event contains file name and - line number where assertion occured. - value: 0 - - BLE_LL_SYSINIT_STAGE: - description: > - Sysinit stage for the NimBLE controller. - value: 250 - - BLE_LL_DEBUG_GPIO_HCI_CMD: - description: > - GPIO pin number to debug HCI commands flow. Pin is set to high state - when HCI command is being processed. - value: -1 - BLE_LL_DEBUG_GPIO_HCI_EV: - description: > - GPIO pin number to debug HCI events flow. Pin is set to high state - when HCI event is being sent. - value: -1 - BLE_LL_DEBUG_GPIO_SCHED_RUN: - description: > - GPIO pin number to debug scheduler running (on timer). Pin is set - to high state while scheduler is running. - value: -1 - BLE_LL_DEBUG_GPIO_SCHED_ITEM_CB: - description: > - GPIO pin number to debug scheduler item execution times. Pin is set - to high state while item is executed. - value: -1 - -# Below settings allow to change scheduler timings. These should be left at -# default values unless you know what you are doing! - BLE_LL_SCHED_AUX_MAFS_DELAY: - description: > - Additional delay [us] between last ADV_EXT_IND and AUX_ADV_IND PDUs - when scheduling extended advertising event. This extends T_MAFS. - value: 0 - BLE_LL_SCHED_AUX_CHAIN_MAFS_DELAY: - description: > - Additional delay [us] between consecutive AUX_CHAIN_IND PDUs - when scheduling extended or periodic advertising event. This extends - T_MAFS. - value: 0 - BLE_LL_SCHED_SCAN_AUX_PDU_LEN: - description: > - This is expected PDU len for AUX_ADV_IND and subsequent - AUX_CHAIN_IND. When scheduling scan scheduler will reserve time for - receiving this amount of time. Setting this to high value improves - reception of large PDUs but results in wasting scheduler space when - receiving small PDUs only. On the other hand too low value can - result in not being able to scan whole PDU due to being preempted - by next scheduled item. By default size matching legacy ADV_IND PDU - payload is used: ExtHeader (Flags, AdvA, ADI) + 31 bytes of data. - range: 1..257 - value: 41 - - BLE_LL_SCHED_SCAN_SYNC_PDU_LEN: - description: > - This is expected PDU len for AUX_SYNC_IND and subsequent - AUX_CHAIN_IND. When scheduling scan scheduler will reserve time for - receiving this amount of time. Setting this to high value improves - reception of large PDUs but results in wasting scheduler space when - receiving small PDUs only. On the other hand too low value can - result in not being able to scan whole PDU due to being preempted - by next scheduled item. By default size matching PDU with legacy - data size is used: ExtHeader + 31 bytes of data. - range: 1..257 - value: 32 - -# deprecated settings (to be defunct/removed eventually) - BLE_LL_DIRECT_TEST_MODE: - description: use BLE_LL_DTM instead - value: 0 - deprecated: 1 - BLE_XTAL_SETTLE_TIME: - description: use BLE_LL_RFMGMT_ENABLE_TIME instead - value: 0 - deprecated: 1 - -# defunct settings (to be removed eventually) - BLE_DEVICE: - description: Superseded by BLE_CONTROLLER - value: 1 - defunct: 1 - BLE_LP_CLOCK: - description: Superseded by BLE_CONTROLLER - value: 1 - defunct: 1 - BLE_NUM_COMP_PKT_RATE: - description: Superseded by BLE_LL_NUM_COMP_PKT_ITVL_MS - value: '(2 * OS_TICKS_PER_SEC)' - defunct: 1 - - -syscfg.vals.BLE_LL_CFG_FEAT_LL_EXT_ADV: - BLE_LL_CFG_FEAT_LE_CSA2: 1 - BLE_HW_WHITELIST_ENABLE: 0 - BLE_LL_EXT_ADV_AUX_PTR_CNT: 5 - -# Enable vendor event on assert in standalone build to make failed assertions in -# controller code visible when connected to external host -syscfg.vals.!BLE_HOST: - BLE_LL_VND_EVENT_ON_ASSERT: 1 - -syscfg.restrictions: - - OS_CPUTIME_FREQ == 32768 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/include/ble/xcvr.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/include/ble/xcvr.h deleted file mode 100644 index 6c1fb7b24..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/include/ble/xcvr.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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. - */ - - #if defined(ARDUINO_ARCH_NRF5) && defined(NRF51) - -#ifndef H_BLE_XCVR_ -#define H_BLE_XCVR_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Transceiver specific defintions */ -/* NOTE: we have to account for the RTC output compare issue */ -#define XCVR_PROC_DELAY_USECS (230) - -#define XCVR_RX_START_DELAY_USECS (140) -#define XCVR_TX_START_DELAY_USECS (140) -#define XCVR_TX_SCHED_DELAY_USECS \ - (XCVR_TX_START_DELAY_USECS + XCVR_PROC_DELAY_USECS) -#define XCVR_RX_SCHED_DELAY_USECS \ - (XCVR_RX_START_DELAY_USECS + XCVR_PROC_DELAY_USECS) - -/* - * Define HW whitelist size. This is the total possible whitelist size; - * not necessarily the size that will be used (may be smaller) - */ -#define BLE_HW_WHITE_LIST_SIZE (8) - -#ifdef __cplusplus -} -#endif - -#endif /* H_BLE_XCVR_ */ -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/pkg.yml deleted file mode 100644 index 816a56355..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/pkg.yml +++ /dev/null @@ -1,31 +0,0 @@ -# -# 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. -# - -pkg.name: nimble/drivers/nrf51 -pkg.description: BLE driver for nRF51 systems. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - -pkg.apis: ble_driver -pkg.deps: - - nimble - - nimble/controller diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/src/ble_hw.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/src/ble_hw.c deleted file mode 100644 index 3d4966b2d..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/src/ble_hw.c +++ /dev/null @@ -1,491 +0,0 @@ -/* - * 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. - */ - -#if defined(ARDUINO_ARCH_NRF5) && defined(NRF51) - -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "../include/ble/xcvr.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nrf.h" -#include "nimble/nimble/controller/include/controller/ble_hw.h" -#if MYNEWT -#include "mcu/cmsis_nvic.h" -#else -#include "core_cm0.h" -#include "nimble/porting/npl/freertos/include/nimble/nimble_npl_os.h" -#endif -#include "nimble/porting/nimble/include/os/os_trace_api.h" - -/* Total number of resolving list elements */ -#define BLE_HW_RESOLV_LIST_SIZE (16) - -/* We use this to keep track of which entries are set to valid addresses */ -static uint8_t g_ble_hw_whitelist_mask; - -/* Random number generator isr callback */ -ble_rng_isr_cb_t g_ble_rng_isr_cb; - -/* If LL privacy is enabled, allocate memory for AAR */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - -/* The NRF51 supports up to 16 IRK entries */ -#if (MYNEWT_VAL(BLE_LL_RESOLV_LIST_SIZE) < 16) -#define NRF_IRK_LIST_ENTRIES (MYNEWT_VAL(BLE_LL_RESOLV_LIST_SIZE)) -#else -#define NRF_IRK_LIST_ENTRIES (16) -#endif - -/* NOTE: each entry is 16 bytes long. */ -uint32_t g_nrf_irk_list[NRF_IRK_LIST_ENTRIES * 4]; - -/* Current number of IRK entries */ -uint8_t g_nrf_num_irks; - -#endif - -/* Returns public device address or -1 if not present */ -int -ble_hw_get_public_addr(ble_addr_t *addr) -{ - uint32_t addr_high; - uint32_t addr_low; - - /* Does FICR have a public address */ - if ((NRF_FICR->DEVICEADDRTYPE & 1) != 0) { - return -1; - } - - /* Copy into device address. We can do this because we know platform */ - addr_low = NRF_FICR->DEVICEADDR[0]; - addr_high = NRF_FICR->DEVICEADDR[1]; - memcpy(addr->val, &addr_low, 4); - memcpy(&addr->val[4], &addr_high, 2); - addr->type = BLE_ADDR_PUBLIC; - - return 0; -} - -/* Returns random static address or -1 if not present */ -int -ble_hw_get_static_addr(ble_addr_t *addr) -{ - int rc; - - if ((NRF_FICR->DEVICEADDRTYPE & 1) == 1) { - memcpy(addr->val, (void *)&NRF_FICR->DEVICEADDR[0], 4); - memcpy(&addr->val[4], (void *)&NRF_FICR->DEVICEADDR[1], 2); - addr->val[5] |= 0xc0; - addr->type = BLE_ADDR_RANDOM; - rc = 0; - } else { - rc = -1; - } - - return rc; -} - -/** - * Clear the whitelist - * - * @return int - */ -void -ble_hw_whitelist_clear(void) -{ - NRF_RADIO->DACNF = 0; - g_ble_hw_whitelist_mask = 0; -} - -/** - * Add a device to the hw whitelist - * - * @param addr - * @param addr_type - * - * @return int 0: success, BLE error code otherwise - */ -int -ble_hw_whitelist_add(const uint8_t *addr, uint8_t addr_type) -{ - int i; - uint32_t mask; - - /* Find first ununsed device address match element */ - mask = 0x01; - for (i = 0; i < BLE_HW_WHITE_LIST_SIZE; ++i) { - if ((mask & g_ble_hw_whitelist_mask) == 0) { - NRF_RADIO->DAB[i] = get_le32(addr); - NRF_RADIO->DAP[i] = get_le16(addr + 4); - if (addr_type == BLE_ADDR_RANDOM) { - NRF_RADIO->DACNF |= (mask << 8); - } - g_ble_hw_whitelist_mask |= mask; - return BLE_ERR_SUCCESS; - } - mask <<= 1; - } - - return BLE_ERR_MEM_CAPACITY; -} - -/** - * Remove a device from the hw whitelist - * - * @param addr - * @param addr_type - * - */ -void -ble_hw_whitelist_rmv(const uint8_t *addr, uint8_t addr_type) -{ - int i; - uint8_t cfg_addr; - uint16_t dap; - uint16_t txadd; - uint32_t dab; - uint32_t mask; - - /* Find first ununsed device address match element */ - dab = get_le32(addr); - dap = get_le16(addr + 4); - txadd = NRF_RADIO->DACNF >> 8; - mask = 0x01; - for (i = 0; i < BLE_HW_WHITE_LIST_SIZE; ++i) { - if (mask & g_ble_hw_whitelist_mask) { - if ((dab == NRF_RADIO->DAB[i]) && (dap == NRF_RADIO->DAP[i])) { - cfg_addr = txadd & mask; - if (addr_type == BLE_ADDR_RANDOM) { - if (cfg_addr != 0) { - break; - } - } else { - if (cfg_addr == 0) { - break; - } - } - } - } - mask <<= 1; - } - - if (i < BLE_HW_WHITE_LIST_SIZE) { - g_ble_hw_whitelist_mask &= ~mask; - NRF_RADIO->DACNF &= ~mask; - } -} - -/** - * Returns the size of the whitelist in HW - * - * @return int Number of devices allowed in whitelist - */ -uint8_t -ble_hw_whitelist_size(void) -{ - return BLE_HW_WHITE_LIST_SIZE; -} - -/** - * Enable the whitelisted devices - */ -void -ble_hw_whitelist_enable(void) -{ - /* Enable the configured device addresses */ - NRF_RADIO->DACNF |= g_ble_hw_whitelist_mask; -} - -/** - * Disables the whitelisted devices - */ -void -ble_hw_whitelist_disable(void) -{ - /* Disable all whitelist devices */ - NRF_RADIO->DACNF &= 0x0000ff00; -} - -/** - * Boolean function which returns true ('1') if there is a match on the - * whitelist. - * - * @return int - */ -int -ble_hw_whitelist_match(void) -{ - return (int)NRF_RADIO->EVENTS_DEVMATCH; -} - -/* Encrypt data */ -int -ble_hw_encrypt_block(struct ble_encryption_block *ecb) -{ - int rc; - uint32_t end; - uint32_t err; - - /* Stop ECB */ - NRF_ECB->TASKS_STOPECB = 1; - /* XXX: does task stop clear these counters? Anyway to do this quicker? */ - NRF_ECB->EVENTS_ENDECB = 0; - NRF_ECB->EVENTS_ERRORECB = 0; - NRF_ECB->ECBDATAPTR = (uint32_t)ecb; - - /* Start ECB */ - NRF_ECB->TASKS_STARTECB = 1; - - /* Wait till error or done */ - rc = 0; - while (1) { - end = NRF_ECB->EVENTS_ENDECB; - err = NRF_ECB->EVENTS_ERRORECB; - if (end || err) { - if (err) { - rc = -1; - } - break; - } - } - - return rc; -} - -/** - * Random number generator ISR. - */ -static void -ble_rng_isr(void) -{ - uint8_t rnum; - - os_trace_isr_enter(); - - /* No callback? Clear and disable interrupts */ - if (g_ble_rng_isr_cb == NULL) { - NRF_RNG->INTENCLR = 1; - NRF_RNG->EVENTS_VALRDY = 0; - (void)NRF_RNG->SHORTS; - os_trace_isr_exit(); - return; - } - - /* If there is a value ready grab it */ - if (NRF_RNG->EVENTS_VALRDY) { - NRF_RNG->EVENTS_VALRDY = 0; - rnum = (uint8_t)NRF_RNG->VALUE; - (*g_ble_rng_isr_cb)(rnum); - } - - os_trace_isr_exit(); -} - -/** - * Initialize the random number generator - * - * @param cb - * @param bias - * - * @return int - */ -int -ble_hw_rng_init(ble_rng_isr_cb_t cb, int bias) -{ - /* Set bias */ - if (bias) { - NRF_RNG->CONFIG = 1; - } else { - NRF_RNG->CONFIG = 0; - } - - /* If we were passed a function pointer we need to enable the interrupt */ - if (cb != NULL) { -#ifndef RIOT_VERSION - NVIC_SetPriority(RNG_IRQn, (1 << __NVIC_PRIO_BITS) - 1); -#endif -#if MYNEWT - NVIC_SetVector(RNG_IRQn, (uint32_t)ble_rng_isr); -#else - ble_npl_hw_set_isr(RNG_IRQn, ble_rng_isr); -#endif - NVIC_EnableIRQ(RNG_IRQn); - g_ble_rng_isr_cb = cb; - } - - return 0; -} - -/** - * Start the random number generator - * - * @return int - */ -int -ble_hw_rng_start(void) -{ - os_sr_t sr; - - /* No need for interrupt if there is no callback */ - OS_ENTER_CRITICAL(sr); - NRF_RNG->EVENTS_VALRDY = 0; - if (g_ble_rng_isr_cb) { - NRF_RNG->INTENSET = 1; - } - NRF_RNG->TASKS_START = 1; - OS_EXIT_CRITICAL(sr); - - return 0; -} - -/** - * Stop the random generator - * - * @return int - */ -int -ble_hw_rng_stop(void) -{ - os_sr_t sr; - - /* No need for interrupt if there is no callback */ - OS_ENTER_CRITICAL(sr); - NRF_RNG->INTENCLR = 1; - NRF_RNG->TASKS_STOP = 1; - NRF_RNG->EVENTS_VALRDY = 0; - OS_EXIT_CRITICAL(sr); - - return 0; -} - -/** - * Read the random number generator. - * - * @return uint8_t - */ -uint8_t -ble_hw_rng_read(void) -{ - uint8_t rnum; - - /* Wait for a sample */ - while (NRF_RNG->EVENTS_VALRDY == 0) { - } - - NRF_RNG->EVENTS_VALRDY = 0; - rnum = (uint8_t)NRF_RNG->VALUE; - - return rnum; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) -/** - * Clear the resolving list - * - * @return int - */ -void -ble_hw_resolv_list_clear(void) -{ - g_nrf_num_irks = 0; -} - -/** - * Add a device to the hw resolving list - * - * @param irk Pointer to IRK to add - * - * @return int 0: success, BLE error code otherwise - */ -int -ble_hw_resolv_list_add(uint8_t *irk) -{ - uint32_t *nrf_entry; - - /* Find first ununsed device address match element */ - if (g_nrf_num_irks == NRF_IRK_LIST_ENTRIES) { - return BLE_ERR_MEM_CAPACITY; - } - - /* Copy into irk list */ - nrf_entry = &g_nrf_irk_list[4 * g_nrf_num_irks]; - memcpy(nrf_entry, irk, 16); - - /* Add to total */ - ++g_nrf_num_irks; - return BLE_ERR_SUCCESS; -} - -/** - * Remove a device from the hw resolving list - * - * @param index Index of IRK to remove - */ -void -ble_hw_resolv_list_rmv(int index) -{ - uint32_t *irk_entry; - - if (index < g_nrf_num_irks) { - --g_nrf_num_irks; - irk_entry = &g_nrf_irk_list[index]; - if (g_nrf_num_irks > index) { - memmove(irk_entry, irk_entry + 4, 16 * (g_nrf_num_irks - index)); - } - } -} - -/** - * Returns the size of the resolving list. NOTE: this returns the maximum - * allowable entries in the HW. Configuration options may limit this. - * - * @return int Number of devices allowed in resolving list - */ -uint8_t -ble_hw_resolv_list_size(void) -{ - return BLE_HW_RESOLV_LIST_SIZE; -} - -/** - * Called to determine if the address received was resolved. - * - * @return int Negative values indicate unresolved address; positive values - * indicate index in resolving list of resolved address. - */ -int -ble_hw_resolv_list_match(void) -{ - uint32_t index; - - if (NRF_AAR->EVENTS_END) { - if (NRF_AAR->EVENTS_RESOLVED) { - index = NRF_AAR->STATUS; - return (int)index; - } - } - - return -1; -} -#endif -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/src/ble_phy.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/src/ble_phy.c deleted file mode 100644 index 3bfed096a..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf51/src/ble_phy.c +++ /dev/null @@ -1,1527 +0,0 @@ -/* - * 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. - */ - - #if defined(ARDUINO_ARCH_NRF5) && defined(NRF51) - -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "../include/ble/xcvr.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/controller/include/controller/ble_phy.h" -#include "nimble/nimble/controller/include/controller/ble_phy_trace.h" -#include "nimble/nimble/controller/include/controller/ble_ll.h" -#include "nrf.h" - -#if MYNEWT -#include "mcu/nrf51_clock.h" -#include "mcu/cmsis_nvic.h" -#else -#include "core_cm0.h" -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) -#error LE 2M PHY cannot be enabled on nRF51 -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) -#error LE Coded PHY cannot be enabled on nRF51 -#endif - -/* XXX: 4) Make sure RF is higher priority interrupt than schedule */ - -/* - * XXX: Maximum possible transmit time is 1 msec for a 60ppm crystal - * and 16ms for a 30ppm crystal! We need to limit PDU size based on - * crystal accuracy. Look at this in the spec. - */ - -/* XXX: private header file? */ -extern uint8_t g_nrf_num_irks; -extern uint32_t g_nrf_irk_list[]; - -/* To disable all radio interrupts */ -#define NRF_RADIO_IRQ_MASK_ALL (0x34FF) - -/* - * We configure the nrf with a 1 byte S0 field, 8 bit length field, and - * zero bit S1 field. The preamble is 8 bits long. - */ -#define NRF_LFLEN_BITS (8) -#define NRF_S0_LEN (1) - -/* Maximum length of frames */ -#define NRF_MAXLEN (255) -#define NRF_BALEN (3) /* For base address of 3 bytes */ - -/* Maximum tx power */ -#define NRF_TX_PWR_MAX_DBM (4) -#define NRF_TX_PWR_MIN_DBM (-40) - -/* Max. encrypted payload length */ -#define NRF_MAX_ENCRYPTED_PYLD_LEN (27) -#define NRF_ENC_HDR_SIZE (3) -#define NRF_ENC_BUF_SIZE \ - (NRF_MAX_ENCRYPTED_PYLD_LEN + NRF_ENC_HDR_SIZE + BLE_LL_DATA_MIC_LEN) - -/* BLE PHY data structure */ -struct ble_phy_obj -{ - uint8_t phy_stats_initialized; - int8_t phy_txpwr_dbm; - uint8_t phy_chan; - uint8_t phy_state; - uint8_t phy_transition; - uint8_t phy_rx_started; - uint8_t phy_encrypted; - uint8_t phy_privacy; - uint8_t phy_tx_pyld_len; - uint8_t *rxdptr; - int8_t rx_pwr_compensation; - uint32_t phy_aar_scratch; - uint32_t phy_access_address; - struct ble_mbuf_hdr rxhdr; - void *txend_arg; - ble_phy_tx_end_func txend_cb; - uint32_t phy_start_cputime; -}; -struct ble_phy_obj g_ble_phy_data; - -/* XXX: if 27 byte packets desired we can make this smaller */ -/* Global transmit/receive buffer */ -static uint32_t g_ble_phy_tx_buf[(BLE_PHY_MAX_PDU_LEN + 3) / 4]; -static uint32_t g_ble_phy_rx_buf[(BLE_PHY_MAX_PDU_LEN + 3) / 4]; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) -/* Make sure word-aligned for faster copies */ -static uint32_t g_ble_phy_enc_buf[(NRF_ENC_BUF_SIZE + 3) / 4]; -#endif - -/* RF center frequency for each channel index (offset from 2400 MHz) */ -static const uint8_t g_ble_phy_chan_freq[BLE_PHY_NUM_CHANS] = { - 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, /* 0-9 */ - 24, 28, 30, 32, 34, 36, 38, 40, 42, 44, /* 10-19 */ - 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, /* 20-29 */ - 66, 68, 70, 72, 74, 76, 78, 2, 26, 80, /* 30-39 */ -}; - -/* Statistics */ -STATS_SECT_START(ble_phy_stats) - STATS_SECT_ENTRY(phy_isrs) - STATS_SECT_ENTRY(tx_good) - STATS_SECT_ENTRY(tx_fail) - STATS_SECT_ENTRY(tx_late) - STATS_SECT_ENTRY(tx_bytes) - STATS_SECT_ENTRY(rx_starts) - STATS_SECT_ENTRY(rx_aborts) - STATS_SECT_ENTRY(rx_valid) - STATS_SECT_ENTRY(rx_crc_err) - STATS_SECT_ENTRY(rx_late) - STATS_SECT_ENTRY(radio_state_errs) - STATS_SECT_ENTRY(rx_hw_err) - STATS_SECT_ENTRY(tx_hw_err) -STATS_SECT_END -STATS_SECT_DECL(ble_phy_stats) ble_phy_stats; - -STATS_NAME_START(ble_phy_stats) - STATS_NAME(ble_phy_stats, phy_isrs) - STATS_NAME(ble_phy_stats, tx_good) - STATS_NAME(ble_phy_stats, tx_fail) - STATS_NAME(ble_phy_stats, tx_late) - STATS_NAME(ble_phy_stats, tx_bytes) - STATS_NAME(ble_phy_stats, rx_starts) - STATS_NAME(ble_phy_stats, rx_aborts) - STATS_NAME(ble_phy_stats, rx_valid) - STATS_NAME(ble_phy_stats, rx_crc_err) - STATS_NAME(ble_phy_stats, rx_late) - STATS_NAME(ble_phy_stats, radio_state_errs) - STATS_NAME(ble_phy_stats, rx_hw_err) - STATS_NAME(ble_phy_stats, tx_hw_err) -STATS_NAME_END(ble_phy_stats) - -/* - * NOTE: - * Tested the following to see what would happen: - * -> NVIC has radio irq enabled (interrupt # 1, mask 0x2). - * -> Set up nrf to receive. Clear ADDRESS event register. - * -> Enable ADDRESS interrupt on nrf5 by writing to INTENSET. - * -> Enable RX. - * -> Disable interrupts globally using OS_ENTER_CRITICAL(). - * -> Wait until a packet is received and the ADDRESS event occurs. - * -> Call ble_phy_disable(). - * - * At this point I wanted to see the state of the cortex NVIC. The IRQ - * pending bit was TRUE for the radio interrupt (as expected) as we never - * serviced the radio interrupt (interrupts were disabled). - * - * What was unexpected was this: without clearing the pending IRQ in the NVIC, - * when radio interrupts were re-enabled (address event bit in INTENSET set to - * 1) and the radio ADDRESS event register read 1 (it was never cleared after - * the first address event), the radio did not enter the ISR! I would have - * expected that if the following were true, an interrupt would occur: - * -> NVIC ISER bit set to TRUE - * -> NVIC ISPR bit reads TRUE, meaning interrupt is pending. - * -> Radio peripheral interrupts are enabled for some event (or events). - * -> Corresponding event register(s) in radio peripheral read 1. - * - * Not sure what the end result of all this is. We will clear the pending - * bit in the NVIC just to be sure when we disable the PHY. - */ - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) -/* Per nordic, the number of bytes needed for scratch is 16 + MAX_PKT_SIZE. */ -#define NRF_ENC_SCRATCH_WORDS (((NRF_MAX_ENCRYPTED_PYLD_LEN + 16) + 3) / 4) - -uint32_t g_nrf_encrypt_scratchpad[NRF_ENC_SCRATCH_WORDS]; - -struct nrf_ccm_data -{ - uint8_t key[16]; - uint64_t pkt_counter; - uint8_t dir_bit; - uint8_t iv[8]; -} __attribute__((packed)); - -struct nrf_ccm_data g_nrf_ccm_data; -#endif - -/** - * Copies the data from the phy receive buffer into a mbuf chain. - * - * @param dptr Pointer to receive buffer - * @param rxpdu Pointer to already allocated mbuf chain - * - * NOTE: the packet header already has the total mbuf length in it. The - * lengths of the individual mbufs are not set prior to calling. - * - */ -void -ble_phy_rxpdu_copy(uint8_t *dptr, struct os_mbuf *rxpdu) -{ - uint32_t rem_len; - uint32_t copy_len; - uint32_t block_len; - uint32_t block_rem_len; - void *dst; - void *src; - struct os_mbuf * om; - - /* Better be aligned */ - assert(((uint32_t)dptr & 3) == 0); - - block_len = rxpdu->om_omp->omp_databuf_len; - rem_len = OS_MBUF_PKTHDR(rxpdu)->omp_len; - src = dptr; - - /* - * Setup for copying from first mbuf which is shorter due to packet header - * and extra leading space - */ - copy_len = block_len - rxpdu->om_pkthdr_len - 4; - om = rxpdu; - dst = om->om_data; - - while (true) { - /* - * Always copy blocks of length aligned to word size, only last mbuf - * will have remaining non-word size bytes appended. - */ - block_rem_len = copy_len; - copy_len = min(copy_len, rem_len); - copy_len &= ~3; - - dst = om->om_data; - om->om_len = copy_len; - rem_len -= copy_len; - block_rem_len -= copy_len; - - __asm__ volatile (".syntax unified \n" - " mov r4, %[len] \n" - " b 2f \n" - "1: ldr r3, [%[src], %[len]] \n" - " str r3, [%[dst], %[len]] \n" - "2: subs %[len], #4 \n" - " bpl 1b \n" - " adds %[src], %[src], r4 \n" - " adds %[dst], %[dst], r4 \n" - : [dst] "+l" (dst), [src] "+l" (src), - [len] "+l" (copy_len) - : - : "r3", "r4", "memory" - ); - - if ((rem_len < 4) && (block_rem_len >= rem_len)) { - break; - } - - /* Move to next mbuf */ - om = SLIST_NEXT(om, om_next); - copy_len = block_len; - } - - /* Copy remaining bytes, if any, to last mbuf */ - om->om_len += rem_len; - __asm__ volatile (".syntax unified \n" - " b 2f \n" - "1: ldrb r3, [%[src], %[len]] \n" - " strb r3, [%[dst], %[len]] \n" - "2: subs %[len], #1 \n" - " bpl 1b \n" - : [len] "+l" (rem_len) - : [dst] "l" (dst), [src] "l" (src) - : "r3", "memory" - ); - - /* Copy header */ - memcpy(BLE_MBUF_HDR_PTR(rxpdu), &g_ble_phy_data.rxhdr, - sizeof(struct ble_mbuf_hdr)); -} - -/** - * Called when we want to wait if the radio is in either the rx or tx - * disable states. We want to wait until that state is over before doing - * anything to the radio - */ -static void -nrf_wait_disabled(void) -{ - uint32_t state; - - /* - * RX and TX states have the same values except for 3rd bit (0=RX, 1=TX) so - * we use RX symbols only. - */ - state = NRF_RADIO->STATE & 0x07; - - if (state != RADIO_STATE_STATE_Disabled) { - /* If PHY is in idle state for whatever reason, disable it now */ - if (state == RADIO_STATE_STATE_RxIdle) { - NRF_RADIO->TASKS_DISABLE = 1; - STATS_INC(ble_phy_stats, radio_state_errs); - } - - if (state == RADIO_STATE_STATE_RxDisable) { - /* This will end within a short time (6 usecs). Just poll */ - while (NRF_RADIO->STATE == state) { - /* If this fails, something is really wrong. Should last - * no more than 6 usecs */ - } - } - } -} - -/** - * - * - */ -int -ble_phy_set_start_time(uint32_t cputime, uint8_t rem_usecs) -{ - uint32_t next_cc; - uint32_t cur_cc; - uint32_t cntr; - uint32_t delta; - - /* - * XXX: The TXEN time is 140 usecs but there may be additional delays - * Need to look at this. - */ - - /* - * With the 32.768 kHz crystal, we may need to adjust the RTC compare - * value by 1 tick due to the time it takes for TXEN. The code uses a 5 RTC - * tick offset, which is 152.5 usecs. The TXEN time is 140 usecs. This - * means that with a remainder of 0, TIMER0 should be set to 12 or 13 (as - * TIMER0 counts at 1MHz). A remainder of 19 or more we will need to add - * 1 tick. We dont need to add 1 tick per se, but it does give us slightly - * more time and thus less of a chance to miss a tick. Another note: we - * cant set TIMER0 CC to 0 as the compare wont occur; it must be 1 or more. - * This is why we subtract 18 (as opposed to 19) as rem_uses will be >= 1. - */ - if (rem_usecs <= 18) { - cputime -= 5; - rem_usecs += 12; - } else { - cputime -= 4; - rem_usecs -= 18; - } - - /* - * Can we set the RTC compare to start TIMER0? We can do it if: - * a) Current compare value is not N+1 or N+2 ticks from current - * counter. - * b) The value we want to set is not at least N+2 from current - * counter. - * - * NOTE: since the counter can tick 1 while we do these calculations we - * need to account for it. - */ - next_cc = cputime & 0xffffff; - cur_cc = NRF_RTC0->CC[0]; - cntr = NRF_RTC0->COUNTER; - - delta = (cur_cc - cntr) & 0xffffff; - if ((delta <= 3) && (delta != 0)) { - return -1; - } - delta = (next_cc - cntr) & 0xffffff; - if ((delta & 0x800000) || (delta < 3)) { - return -1; - } - - /* Clear and set TIMER0 to fire off at proper time */ - NRF_TIMER0->TASKS_CLEAR = 1; - NRF_TIMER0->CC[0] = rem_usecs; - NRF_TIMER0->EVENTS_COMPARE[0] = 0; - - /* Set RTC compare to start TIMER0 */ - NRF_RTC0->EVENTS_COMPARE[0] = 0; - NRF_RTC0->CC[0] = next_cc; - NRF_RTC0->EVTENSET = RTC_EVTENSET_COMPARE0_Msk; - - /* Enable PPI */ - NRF_PPI->CHENSET = PPI_CHEN_CH31_Msk; - - /* Store the cputime at which we set the RTC */ - g_ble_phy_data.phy_start_cputime = cputime; - - return 0; -} - -/** - * Function is used to set PPI so that we can time out waiting for a reception - * to occur. This happens for two reasons: we have sent a packet and we are - * waiting for a respons (txrx should be set to ENABLE_TXRX) or we are - * starting a connection event and we are a slave and we are waiting for the - * master to send us a packet (txrx should be set to ENABLE_RX). - * - * NOTE: when waiting for a txrx turn-around, wfr_usecs is not used as there - * is no additional time to wait; we know when we should receive the address of - * the received frame. - * - * @param txrx Flag denoting if this wfr is a txrx turn-around or not. - * @param tx_phy_mode phy mode for last TX (not used on nRF51) - * @param wfr_usecs Amount of usecs to wait. - */ -void -ble_phy_wfr_enable(int txrx, uint8_t tx_phy_mode, uint32_t wfr_usecs) -{ - uint32_t end_time; - - if (txrx == BLE_PHY_WFR_ENABLE_TXRX) { - /* - * Timeout occurs an IFS time plus time it takes to receive address - * from the transmit end. We add additional time to make sure the - * address event comes before the compare. Note that transmit end - * is captured in CC[2]. I just made up the 16 usecs I add here. - */ - end_time = NRF_TIMER0->CC[2] + BLE_LL_IFS + - ble_phy_mode_pdu_start_off(BLE_PHY_MODE_1M) + 16; - } else { - /* CC[0] is set to when RXEN occurs. */ - end_time = NRF_TIMER0->CC[0] + XCVR_RX_START_DELAY_USECS + wfr_usecs + - ble_phy_mode_pdu_start_off(BLE_PHY_MODE_1M) + BLE_LL_JITTER_USECS; - } - - /* wfr_secs is the time from rxen until timeout */ - NRF_TIMER0->CC[3] = end_time; - NRF_TIMER0->EVENTS_COMPARE[3] = 0; - - /* Enable wait for response PPI */ - NRF_PPI->CHENSET = (PPI_CHEN_CH4_Msk | PPI_CHEN_CH5_Msk); - - /* Enable the disabled interrupt so we time out on events compare */ - NRF_RADIO->INTENSET = RADIO_INTENSET_DISABLED_Msk; -} - -/** - * Setup transceiver for receive. - */ -static void -ble_phy_rx_xcvr_setup(void) -{ - uint8_t *dptr; - - dptr = (uint8_t *)&g_ble_phy_rx_buf[0]; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (g_ble_phy_data.phy_encrypted) { - dptr += 3; - NRF_RADIO->PACKETPTR = (uint32_t)&g_ble_phy_enc_buf[0]; - NRF_CCM->INPTR = (uint32_t)&g_ble_phy_enc_buf[0]; - NRF_CCM->OUTPTR = (uint32_t)dptr; - NRF_CCM->SCRATCHPTR = (uint32_t)&g_nrf_encrypt_scratchpad[0]; - NRF_CCM->MODE = CCM_MODE_MODE_Decryption; - NRF_CCM->CNFPTR = (uint32_t)&g_nrf_ccm_data; - NRF_CCM->SHORTS = 0; - NRF_CCM->EVENTS_ERROR = 0; - NRF_CCM->EVENTS_ENDCRYPT = 0; - NRF_PPI->CHENSET = PPI_CHEN_CH24_Msk | PPI_CHEN_CH25_Msk; - } else { - NRF_RADIO->PACKETPTR = (uint32_t)dptr; - } -#else - NRF_RADIO->PACKETPTR = (uint32_t)dptr; -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - if (g_ble_phy_data.phy_privacy) { - dptr += 3; - NRF_RADIO->PACKETPTR = (uint32_t)dptr; - NRF_RADIO->PCNF0 = (6 << RADIO_PCNF0_LFLEN_Pos) | - (2 << RADIO_PCNF0_S1LEN_Pos) | - (NRF_S0_LEN << RADIO_PCNF0_S0LEN_Pos); - NRF_AAR->ENABLE = AAR_ENABLE_ENABLE_Enabled; - NRF_AAR->IRKPTR = (uint32_t)&g_nrf_irk_list[0]; - NRF_AAR->SCRATCHPTR = (uint32_t)&g_ble_phy_data.phy_aar_scratch; - NRF_AAR->EVENTS_END = 0; - NRF_AAR->EVENTS_RESOLVED = 0; - NRF_AAR->EVENTS_NOTRESOLVED = 0; - } else { - if (g_ble_phy_data.phy_encrypted == 0) { - NRF_RADIO->PCNF0 = (NRF_LFLEN_BITS << RADIO_PCNF0_LFLEN_Pos) | - (NRF_S0_LEN << RADIO_PCNF0_S0LEN_Pos); - /* XXX: do I only need to do this once? Figure out what I can do - once. */ - NRF_AAR->ENABLE = AAR_ENABLE_ENABLE_Disabled; - } - } -#endif - - /* Turn off trigger TXEN on output compare match and AAR on bcmatch */ - NRF_PPI->CHENCLR = PPI_CHEN_CH20_Msk | PPI_CHEN_CH23_Msk; - - /* Reset the rx started flag. Used for the wait for response */ - g_ble_phy_data.phy_rx_started = 0; - g_ble_phy_data.phy_state = BLE_PHY_STATE_RX; - g_ble_phy_data.rxdptr = dptr; - - /* I want to know when 1st byte received (after address) */ - NRF_RADIO->BCC = 8; /* in bits */ - NRF_RADIO->EVENTS_ADDRESS = 0; - NRF_RADIO->EVENTS_DEVMATCH = 0; - NRF_RADIO->EVENTS_BCMATCH = 0; - NRF_RADIO->EVENTS_RSSIEND = 0; - NRF_RADIO->SHORTS = RADIO_SHORTS_END_DISABLE_Msk | - RADIO_SHORTS_READY_START_Msk | - RADIO_SHORTS_DISABLED_TXEN_Msk | - RADIO_SHORTS_ADDRESS_BCSTART_Msk | - RADIO_SHORTS_ADDRESS_RSSISTART_Msk | - RADIO_SHORTS_DISABLED_RSSISTOP_Msk; - - NRF_RADIO->INTENSET = RADIO_INTENSET_ADDRESS_Msk; -} - -/** - * Called from interrupt context when the transmit ends - * - */ -static void -ble_phy_tx_end_isr(void) -{ - uint8_t was_encrypted; - uint8_t transition; - uint8_t txlen; - uint32_t wfr_time; - - /* If this transmission was encrypted we need to remember it */ - was_encrypted = g_ble_phy_data.phy_encrypted; - (void)was_encrypted; - - /* Better be in TX state! */ - assert(g_ble_phy_data.phy_state == BLE_PHY_STATE_TX); - - /* Clear events and clear interrupt on disabled event */ - NRF_RADIO->EVENTS_DISABLED = 0; - NRF_RADIO->INTENCLR = RADIO_INTENCLR_DISABLED_Msk; - NRF_RADIO->EVENTS_END = 0; - wfr_time = NRF_RADIO->SHORTS; - (void)wfr_time; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - /* - * XXX: not sure what to do. We had a HW error during transmission. - * For now I just count a stat but continue on like all is good. - */ - if (was_encrypted) { - if (NRF_CCM->EVENTS_ERROR) { - STATS_INC(ble_phy_stats, tx_hw_err); - NRF_CCM->EVENTS_ERROR = 0; - } - } -#endif - - /* Call transmit end callback */ - if (g_ble_phy_data.txend_cb) { - g_ble_phy_data.txend_cb(g_ble_phy_data.txend_arg); - } - - transition = g_ble_phy_data.phy_transition; - if (transition == BLE_PHY_TRANSITION_TX_RX) { - /* Packet pointer needs to be reset. */ - ble_phy_rx_xcvr_setup(); - - /* - * Enable the wait for response timer. Note that cc #1 on - * timer 0 contains the transmit start time - */ - txlen = g_ble_phy_data.phy_tx_pyld_len; - if (txlen && was_encrypted) { - txlen += BLE_LL_DATA_MIC_LEN; - } - ble_phy_wfr_enable(BLE_PHY_WFR_ENABLE_TXRX, 0, 0); - } else { - /* - * XXX: not sure we need to stop the timer here all the time. Or that - * it should be stopped here. - */ - NRF_TIMER0->TASKS_STOP = 1; - NRF_TIMER0->TASKS_SHUTDOWN = 1; - NRF_PPI->CHENCLR = PPI_CHEN_CH4_Msk | PPI_CHEN_CH5_Msk | - PPI_CHEN_CH20_Msk | PPI_CHEN_CH31_Msk; - assert(transition == BLE_PHY_TRANSITION_NONE); - } -} - -static void -ble_phy_rx_end_isr(void) -{ - int rc; - uint8_t *dptr; - uint8_t crcok; - struct ble_mbuf_hdr *ble_hdr; - - /* Clear events and clear interrupt */ - NRF_RADIO->EVENTS_END = 0; - NRF_RADIO->INTENCLR = RADIO_INTENCLR_END_Msk; - - /* Disable automatic RXEN */ - NRF_PPI->CHENCLR = PPI_CHEN_CH21_Msk; - - /* Set RSSI and CRC status flag in header */ - ble_hdr = &g_ble_phy_data.rxhdr; - assert(NRF_RADIO->EVENTS_RSSIEND != 0); - ble_hdr->rxinfo.rssi = (-1 * NRF_RADIO->RSSISAMPLE) + - g_ble_phy_data.rx_pwr_compensation; - - dptr = g_ble_phy_data.rxdptr; - - /* Count PHY crc errors and valid packets */ - crcok = (uint8_t)NRF_RADIO->CRCSTATUS; - if (!crcok) { - STATS_INC(ble_phy_stats, rx_crc_err); - } else { - STATS_INC(ble_phy_stats, rx_valid); - ble_hdr->rxinfo.flags |= BLE_MBUF_HDR_F_CRC_OK; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (g_ble_phy_data.phy_encrypted) { - /* Only set MIC failure flag if frame is not zero length */ - if ((dptr[1] != 0) && (NRF_CCM->MICSTATUS == 0)) { - ble_hdr->rxinfo.flags |= BLE_MBUF_HDR_F_MIC_FAILURE; - } - - /* - * XXX: not sure how to deal with this. This should not - * be a MIC failure but we should not hand it up. I guess - * this is just some form of rx error and that is how we - * handle it? For now, just set CRC error flags - */ - if (NRF_CCM->EVENTS_ERROR) { - STATS_INC(ble_phy_stats, rx_hw_err); - ble_hdr->rxinfo.flags &= ~BLE_MBUF_HDR_F_CRC_OK; - } - - /* - * XXX: This is a total hack work-around for now but I dont - * know what else to do. If ENDCRYPT is not set and we are - * encrypted we need to not trust this frame and drop it. - */ - if (NRF_CCM->EVENTS_ENDCRYPT == 0) { - STATS_INC(ble_phy_stats, rx_hw_err); - ble_hdr->rxinfo.flags &= ~BLE_MBUF_HDR_F_CRC_OK; - } - } -#endif - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) || MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - if (g_ble_phy_data.phy_encrypted || g_ble_phy_data.phy_privacy) { - /* - * XXX: This is a horrible ugly hack to deal with the RAM S1 byte. - * This should get fixed as we should not be handing up the header - * and length as part of the pdu. - */ - dptr[2] = dptr[1]; - dptr[1] = dptr[0]; - ++dptr; - } -#endif - rc = ble_ll_rx_end(dptr, ble_hdr); - if (rc < 0) { - ble_phy_disable(); - } -} - -static void -ble_phy_rx_start_isr(void) -{ - int rc; - uint32_t state; - uint32_t usecs; - uint32_t ticks; - struct ble_mbuf_hdr *ble_hdr; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - uint8_t *dptr; - - dptr = (uint8_t *)&g_ble_phy_rx_buf[0]; -#endif - - /* Clear events and clear interrupt */ - NRF_RADIO->EVENTS_ADDRESS = 0; - - /* Clear wfr timer channels and DISABLED interrupt */ - NRF_RADIO->INTENCLR = RADIO_INTENCLR_DISABLED_Msk | RADIO_INTENCLR_ADDRESS_Msk; - NRF_PPI->CHENCLR = PPI_CHEN_CH4_Msk | PPI_CHEN_CH5_Msk; - - /* Initialize flags, channel and state in ble header at rx start */ - ble_hdr = &g_ble_phy_data.rxhdr; - ble_hdr->rxinfo.flags = ble_ll_state_get(); - ble_hdr->rxinfo.channel = g_ble_phy_data.phy_chan; - ble_hdr->rxinfo.handle = 0; - ble_hdr->rxinfo.phy = BLE_PHY_1M; - ble_hdr->rxinfo.phy_mode = BLE_PHY_MODE_1M; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - ble_hdr->rxinfo.user_data = NULL; -#endif - - /* - * Calculate receive start time. - * - * XXX: possibly use other routine with remainder! - */ - usecs = NRF_TIMER0->CC[1] - ble_phy_mode_pdu_start_off(BLE_PHY_MODE_1M); - ticks = os_cputime_usecs_to_ticks(usecs); - ble_hdr->rem_usecs = usecs - os_cputime_ticks_to_usecs(ticks); - if (ble_hdr->rem_usecs == 31) { - ble_hdr->rem_usecs = 0; - ++ticks; - } - ble_hdr->beg_cputime = g_ble_phy_data.phy_start_cputime + ticks; - - /* Wait to get 1st byte of frame */ - while (1) { - state = NRF_RADIO->STATE; - if (NRF_RADIO->EVENTS_BCMATCH != 0) { - break; - } - - /* - * If state is disabled, we should have the BCMATCH. If not, - * something is wrong! - */ - if (state == RADIO_STATE_STATE_Disabled) { - NRF_RADIO->INTENCLR = NRF_RADIO_IRQ_MASK_ALL; - NRF_RADIO->SHORTS = 0; - return; - } - } - - /* Call Link Layer receive start function */ - rc = ble_ll_rx_start(g_ble_phy_data.rxdptr, g_ble_phy_data.phy_chan, - &g_ble_phy_data.rxhdr); - if (rc >= 0) { - /* Set rx started flag and enable rx end ISR */ - g_ble_phy_data.phy_rx_started = 1; - NRF_RADIO->INTENSET = RADIO_INTENSET_END_Msk; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - /* Must start aar if we need to */ - if (g_ble_phy_data.phy_privacy) { - NRF_RADIO->EVENTS_BCMATCH = 0; - NRF_PPI->CHENSET = PPI_CHEN_CH23_Msk; - /* - * Setup AAR to resolve AdvA and trigger it after complete address - * is received, i.e. after PDU header and AdvA is received. - * - * AdvA starts at 4th octet in receive buffer, after S0, len and S1 - * fields. - * - * In case of extended advertising AdvA is located after extended - * header (+2 octets). - */ - if (BLE_MBUF_HDR_EXT_ADV(&g_ble_phy_data.rxhdr)) { - NRF_AAR->ADDRPTR = (uint32_t)(dptr + 5); - NRF_RADIO->BCC = (BLE_DEV_ADDR_LEN + BLE_LL_PDU_HDR_LEN + 2) * 8; - - } else { - NRF_AAR->ADDRPTR = (uint32_t)(dptr + 3); - NRF_RADIO->BCC = (BLE_DEV_ADDR_LEN + BLE_LL_PDU_HDR_LEN) * 8; - } - } -#endif - } else { - /* Disable PHY */ - ble_phy_disable(); - STATS_INC(ble_phy_stats, rx_aborts); - } - - /* Count rx starts */ - STATS_INC(ble_phy_stats, rx_starts); -} - -static void -ble_phy_isr(void) -{ - uint32_t irq_en; - - os_trace_isr_enter(); - - /* Read irq register to determine which interrupts are enabled */ - irq_en = NRF_RADIO->INTENCLR; - - /* - * NOTE: order of checking is important! Possible, if things get delayed, - * we have both an ADDRESS and DISABLED interrupt in rx state. If we get - * an address, we disable the DISABLED interrupt. - */ - - /* We get this if we have started to receive a frame */ - if ((irq_en & RADIO_INTENCLR_ADDRESS_Msk) && NRF_RADIO->EVENTS_ADDRESS) { - irq_en &= ~RADIO_INTENCLR_DISABLED_Msk; - ble_phy_rx_start_isr(); - } - - /* Check for disabled event. This only happens for transmits now */ - if ((irq_en & RADIO_INTENCLR_DISABLED_Msk) && NRF_RADIO->EVENTS_DISABLED) { - if (g_ble_phy_data.phy_state == BLE_PHY_STATE_RX) { - NRF_RADIO->EVENTS_DISABLED = 0; - ble_ll_wfr_timer_exp(NULL); - } else { - ble_phy_tx_end_isr(); - } - } - - /* Receive packet end (we dont enable this for transmit) */ - if ((irq_en & RADIO_INTENCLR_END_Msk) && NRF_RADIO->EVENTS_END) { - ble_phy_rx_end_isr(); - } - - /* Ensures IRQ is cleared */ - irq_en = NRF_RADIO->SHORTS; - - /* Count # of interrupts */ - STATS_INC(ble_phy_stats, phy_isrs); - - os_trace_isr_exit(); -} - -/** - * ble phy init - * - * Initialize the PHY. - * - * @return int 0: success; PHY error code otherwise - */ -int -ble_phy_init(void) -{ - int rc; - - /* Set phy channel to an invalid channel so first set channel works */ - g_ble_phy_data.phy_chan = BLE_PHY_NUM_CHANS; - - g_ble_phy_data.rx_pwr_compensation = 0; - - /* Toggle peripheral power to reset (just in case) */ - NRF_RADIO->POWER = 0; - NRF_RADIO->POWER = 1; - - /* Disable all interrupts */ - NRF_RADIO->INTENCLR = NRF_RADIO_IRQ_MASK_ALL; - - /* Set configuration registers */ - NRF_RADIO->MODE = RADIO_MODE_MODE_Ble_1Mbit; - NRF_RADIO->PCNF0 = (NRF_LFLEN_BITS << RADIO_PCNF0_LFLEN_Pos) | - (NRF_S0_LEN << RADIO_PCNF0_S0LEN_Pos); - /* XXX: should maxlen be 251 for encryption? */ - NRF_RADIO->PCNF1 = NRF_MAXLEN | - (RADIO_PCNF1_ENDIAN_Little << RADIO_PCNF1_ENDIAN_Pos) | - (NRF_BALEN << RADIO_PCNF1_BALEN_Pos) | - RADIO_PCNF1_WHITEEN_Msk; - - /* Set base0 with the advertising access address */ - NRF_RADIO->BASE0 = (BLE_ACCESS_ADDR_ADV << 8) & 0xFFFFFF00; - NRF_RADIO->PREFIX0 = (BLE_ACCESS_ADDR_ADV >> 24) & 0xFF; - - /* Configure the CRC registers */ - NRF_RADIO->CRCCNF = RADIO_CRCCNF_SKIPADDR_Msk | RADIO_CRCCNF_LEN_Three; - - /* Configure BLE poly */ - NRF_RADIO->CRCPOLY = 0x0100065B; - - /* Configure IFS */ - NRF_RADIO->TIFS = BLE_LL_IFS; - - /* Captures tx/rx start in timer0 cc 1 and tx/rx end in timer0 cc 2 */ - NRF_PPI->CHENSET = PPI_CHEN_CH26_Msk | PPI_CHEN_CH27_Msk; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - NRF_CCM->INTENCLR = 0xffffffff; - NRF_CCM->SHORTS = CCM_SHORTS_ENDKSGEN_CRYPT_Msk; - NRF_CCM->EVENTS_ERROR = 0; - memset(g_nrf_encrypt_scratchpad, 0, sizeof(g_nrf_encrypt_scratchpad)); -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - g_ble_phy_data.phy_aar_scratch = 0; - NRF_AAR->IRKPTR = (uint32_t)&g_nrf_irk_list[0]; - NRF_AAR->INTENCLR = 0xffffffff; - NRF_AAR->EVENTS_END = 0; - NRF_AAR->EVENTS_RESOLVED = 0; - NRF_AAR->EVENTS_NOTRESOLVED = 0; - NRF_AAR->NIRK = 0; -#endif - - /* TIMER0 setup for PHY when using RTC */ - NRF_TIMER0->TASKS_STOP = 1; - NRF_TIMER0->TASKS_SHUTDOWN = 1; - NRF_TIMER0->BITMODE = 3; /* 32-bit timer */ - NRF_TIMER0->MODE = 0; /* Timer mode */ - NRF_TIMER0->PRESCALER = 4; /* gives us 1 MHz */ - - /* - * PPI setup. - * Channel 4: Captures TIMER0 in CC[3] when EVENTS_ADDRESS occurs. Used - * to cancel the wait for response timer. - * Channel 5: TIMER0 CC[3] to TASKS_DISABLE on radio. This is the wait - * for response timer. - */ - NRF_PPI->CH[4].EEP = (uint32_t)&(NRF_RADIO->EVENTS_ADDRESS); - NRF_PPI->CH[4].TEP = (uint32_t)&(NRF_TIMER0->TASKS_CAPTURE[3]); - NRF_PPI->CH[5].EEP = (uint32_t)&(NRF_TIMER0->EVENTS_COMPARE[3]); - NRF_PPI->CH[5].TEP = (uint32_t)&(NRF_RADIO->TASKS_DISABLE); - - /* Set isr in vector table and enable interrupt */ -#ifndef RIOT_VERSION - NVIC_SetPriority(RADIO_IRQn, 0); -#endif -#if MYNEWT - NVIC_SetVector(RADIO_IRQn, (uint32_t)ble_phy_isr); -#else - ble_npl_hw_set_isr(RADIO_IRQn, ble_phy_isr); -#endif - NVIC_EnableIRQ(RADIO_IRQn); - - /* Register phy statistics */ - if (!g_ble_phy_data.phy_stats_initialized) { - rc = stats_init_and_reg(STATS_HDR(ble_phy_stats), - STATS_SIZE_INIT_PARMS(ble_phy_stats, - STATS_SIZE_32), - STATS_NAME_INIT_PARMS(ble_phy_stats), - "ble_phy"); - assert(rc == 0); - - g_ble_phy_data.phy_stats_initialized = 1; - } - - return 0; -} - -/** - * Puts the phy into receive mode. - * - * @return int 0: success; BLE Phy error code otherwise - */ -int -ble_phy_rx(void) -{ - /* Check radio state */ - nrf_wait_disabled(); - if (NRF_RADIO->STATE != RADIO_STATE_STATE_Disabled) { - ble_phy_disable(); - STATS_INC(ble_phy_stats, radio_state_errs); - return BLE_PHY_ERR_RADIO_STATE; - } - - /* Make sure all interrupts are disabled */ - NRF_RADIO->INTENCLR = NRF_RADIO_IRQ_MASK_ALL; - - /* Clear events prior to enabling receive */ - NRF_RADIO->EVENTS_END = 0; - NRF_RADIO->EVENTS_DISABLED = 0; - - /* Setup for rx */ - ble_phy_rx_xcvr_setup(); - - /* Start the receive task in the radio if not automatically going to rx */ - if ((NRF_PPI->CHEN & PPI_CHEN_CH21_Msk) == 0) { - NRF_RADIO->TASKS_RXEN = 1; - } - - return 0; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) -/** - * Called to enable encryption at the PHY. Note that this state will persist - * in the PHY; in other words, if you call this function you have to call - * disable so that future PHY transmits/receives will not be encrypted. - * - * @param pkt_counter - * @param iv - * @param key - * @param is_master - */ -void -ble_phy_encrypt_enable(uint64_t pkt_counter, uint8_t *iv, uint8_t *key, - uint8_t is_master) -{ - memcpy(g_nrf_ccm_data.key, key, 16); - g_nrf_ccm_data.pkt_counter = pkt_counter; - memcpy(g_nrf_ccm_data.iv, iv, 8); - g_nrf_ccm_data.dir_bit = is_master; - g_ble_phy_data.phy_encrypted = 1; - - /* Encryption uses LFLEN=5, S1LEN = 3. */ - NRF_RADIO->PCNF0 = (5 << RADIO_PCNF0_LFLEN_Pos) | - (3 << RADIO_PCNF0_S1LEN_Pos) | - (NRF_S0_LEN << RADIO_PCNF0_S0LEN_Pos); - - /* Enable the module (AAR cannot be on while CCM on) */ - NRF_AAR->ENABLE = AAR_ENABLE_ENABLE_Disabled; - NRF_CCM->ENABLE = CCM_ENABLE_ENABLE_Enabled; -} - -void -ble_phy_encrypt_set_pkt_cntr(uint64_t pkt_counter, int dir) -{ - g_nrf_ccm_data.pkt_counter = pkt_counter; - g_nrf_ccm_data.dir_bit = dir; -} - -void -ble_phy_encrypt_disable(void) -{ - NRF_PPI->CHENCLR = (PPI_CHEN_CH24_Msk | PPI_CHEN_CH25_Msk); - NRF_CCM->TASKS_STOP = 1; - NRF_CCM->EVENTS_ERROR = 0; - NRF_CCM->ENABLE = CCM_ENABLE_ENABLE_Disabled; - - /* Switch back to normal length */ - NRF_RADIO->PCNF0 = (NRF_LFLEN_BITS << RADIO_PCNF0_LFLEN_Pos) | - (NRF_S0_LEN << RADIO_PCNF0_S0LEN_Pos); - - g_ble_phy_data.phy_encrypted = 0; -} -#endif - -void -ble_phy_set_txend_cb(ble_phy_tx_end_func txend_cb, void *arg) -{ - /* Set transmit end callback and arg */ - g_ble_phy_data.txend_cb = txend_cb; - g_ble_phy_data.txend_arg = arg; -} - -/** - * Called to set the start time of a transmission. - * - * This function is called to set the start time when we are not going from - * rx to tx automatically. - * - * NOTE: care must be taken when calling this function. The channel should - * already be set. - * - * @param cputime This is the tick at which the 1st bit of the preamble - * should be transmitted - * @param rem_usecs This is used only when the underlying timing uses a 32.768 - * kHz crystal. It is the # of usecs from the cputime tick - * at which the first bit of the preamble should be - * transmitted. - * @return int - */ -int -ble_phy_tx_set_start_time(uint32_t cputime, uint8_t rem_usecs) -{ - int rc; - - ble_phy_trace_u32x2(BLE_PHY_TRACE_ID_START_TX, cputime, rem_usecs); - - /* XXX: This should not be necessary, but paranoia is good! */ - /* Clear timer0 compare to RXEN since we are transmitting */ - NRF_PPI->CHENCLR = PPI_CHEN_CH21_Msk; - - /* - * XXX: The TXEN time is 140 usecs but there may be additional delays - * Need to look at this. - */ - if (ble_phy_set_start_time(cputime, rem_usecs) != 0) { - STATS_INC(ble_phy_stats, tx_late); - ble_phy_disable(); - rc = BLE_PHY_ERR_TX_LATE; - } else { - /* Enable PPI to automatically start TXEN */ - NRF_PPI->CHENSET = PPI_CHEN_CH20_Msk; - rc = 0; - } - return rc; -} -/** - * Called to set the start time of a reception - * - * This function acts a bit differently than transmit. If we are late getting - * here we will still attempt to receive. - * - * NOTE: care must be taken when calling this function. The channel should - * already be set. - * - * @param cputime - * - * @return int - */ -int -ble_phy_rx_set_start_time(uint32_t cputime, uint8_t rem_usecs) -{ - int rc; - - ble_phy_trace_u32x2(BLE_PHY_TRACE_ID_START_RX, cputime, rem_usecs); - - /* XXX: This should not be necessary, but paranoia is good! */ - /* Clear timer0 compare to TXEN since we are transmitting */ - NRF_PPI->CHENCLR = PPI_CHEN_CH20_Msk; - - /* - * XXX: The RXEN time is 138 usecs but there may be additional delays - * Need to look at this. - */ - if (ble_phy_set_start_time(cputime, rem_usecs) != 0) { - STATS_INC(ble_phy_stats, rx_late); - NRF_PPI->CHENCLR = PPI_CHEN_CH21_Msk; - NRF_RADIO->TASKS_RXEN = 1; - rc = BLE_PHY_ERR_RX_LATE; - } else { - /* Enable PPI to automatically start RXEN */ - NRF_PPI->CHENSET = PPI_CHEN_CH21_Msk; - - /* Start rx */ - rc = ble_phy_rx(); - } - return rc; -} - -int -ble_phy_tx(ble_phy_tx_pducb_t pducb, void *pducb_arg, uint8_t end_trans) -{ - int rc; - uint8_t *dptr; - uint8_t payload_len; - uint8_t payload_off; - uint8_t hdr_byte; - uint32_t state; - uint32_t shortcuts; - - /* - * This check is to make sure that the radio is not in a state where - * it is moving to disabled state. If so, let it get there. - */ - nrf_wait_disabled(); - - /* - * XXX: Although we may not have to do this here, I clear all the PPI - * that should not be used when transmitting. Some of them are only enabled - * if encryption and/or privacy is on, but I dont care. Better to be - * paranoid, and if you are going to clear one, might as well clear them - * all. - */ - NRF_PPI->CHENCLR = PPI_CHEN_CH4_Msk | PPI_CHEN_CH5_Msk | PPI_CHEN_CH23_Msk | - PPI_CHEN_CH25_Msk; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (g_ble_phy_data.phy_encrypted) { - /* RAM representation has S0, LENGTH and S1 fields. (3 bytes) */ - dptr = (uint8_t *)&g_ble_phy_enc_buf[0]; - payload_off = 3; - - NRF_CCM->SHORTS = 1; - NRF_CCM->INPTR = (uint32_t)&g_ble_phy_enc_buf[0]; - NRF_CCM->OUTPTR = (uint32_t)&g_ble_phy_tx_buf[0]; - NRF_CCM->SCRATCHPTR = (uint32_t)&g_nrf_encrypt_scratchpad[0]; - NRF_CCM->EVENTS_ERROR = 0; - NRF_CCM->MODE = CCM_MODE_MODE_Encryption; - NRF_CCM->CNFPTR = (uint32_t)&g_nrf_ccm_data; - NRF_PPI->CHENSET = PPI_CHEN_CH24_Msk; - } else { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - /* Reconfigure PCNF0 */ - NRF_RADIO->PCNF0 = (NRF_LFLEN_BITS << RADIO_PCNF0_LFLEN_Pos) | - (NRF_S0_LEN << RADIO_PCNF0_S0LEN_Pos); - NRF_AAR->IRKPTR = (uint32_t)&g_nrf_irk_list[0]; -#endif - /* RAM representation has S0 and LENGTH fields (2 bytes) */ - dptr = (uint8_t *)&g_ble_phy_tx_buf[0]; - payload_off = 2; - } -#else - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - /* Reconfigure PCNF0 */ - NRF_RADIO->PCNF0 = (NRF_LFLEN_BITS << RADIO_PCNF0_LFLEN_Pos) | - (NRF_S0_LEN << RADIO_PCNF0_S0LEN_Pos); -#endif - - /* RAM representation has S0 and LENGTH fields (2 bytes) */ - dptr = (uint8_t *)&g_ble_phy_tx_buf[0]; - payload_off = 2; -#endif - - NRF_RADIO->PACKETPTR = (uint32_t)&g_ble_phy_tx_buf[0]; - - /* Clear the ready, end and disabled events */ - NRF_RADIO->EVENTS_READY = 0; - NRF_RADIO->EVENTS_END = 0; - NRF_RADIO->EVENTS_DISABLED = 0; - - /* Enable shortcuts for transmit start/end. */ - shortcuts = RADIO_SHORTS_END_DISABLE_Msk | RADIO_SHORTS_READY_START_Msk; - if (end_trans == BLE_PHY_TRANSITION_TX_RX) { - shortcuts |= RADIO_SHORTS_DISABLED_RXEN_Msk; - } - NRF_RADIO->SHORTS = shortcuts; - NRF_RADIO->INTENSET = RADIO_INTENSET_DISABLED_Msk; - - /* Set PDU payload */ - payload_len = pducb(&dptr[payload_off], pducb_arg, &hdr_byte); - - /* Set PDU header */ - dptr[0] = hdr_byte; - dptr[1] = payload_len; - if (payload_off > 2) { - dptr[2] = 0; - } - - /* Set the PHY transition */ - g_ble_phy_data.phy_transition = end_trans; - - /* Set transmitted payload length */ - g_ble_phy_data.phy_tx_pyld_len = payload_len; - - /* If we already started transmitting, abort it! */ - state = NRF_RADIO->STATE; - if (state != RADIO_STATE_STATE_Tx) { - - /* Set phy state to transmitting and count packet statistics */ - g_ble_phy_data.phy_state = BLE_PHY_STATE_TX; - STATS_INC(ble_phy_stats, tx_good); - STATS_INCN(ble_phy_stats, tx_bytes, payload_len + BLE_LL_PDU_HDR_LEN); - rc = BLE_ERR_SUCCESS; - } else { - ble_phy_disable(); - STATS_INC(ble_phy_stats, tx_late); - rc = BLE_PHY_ERR_RADIO_STATE; - } - - return rc; -} - -/** - * ble phy txpwr set - * - * Set the transmit output power (in dBm). - * - * NOTE: If the output power specified is within the BLE limits but outside - * the chip limits, we "rail" the power level so we dont exceed the min/max - * chip values. - * - * @param dbm Power output in dBm. - * - * @return int 0: success; anything else is an error - */ -int -ble_phy_txpwr_set(int dbm) -{ - /* Check valid range */ - assert(dbm <= BLE_PHY_MAX_PWR_DBM); - - /* "Rail" power level if outside supported range */ - if (dbm > NRF_TX_PWR_MAX_DBM) { - dbm = NRF_TX_PWR_MAX_DBM; - } else { - if (dbm < NRF_TX_PWR_MIN_DBM) { - dbm = NRF_TX_PWR_MIN_DBM; - } - } - - NRF_RADIO->TXPOWER = dbm; - g_ble_phy_data.phy_txpwr_dbm = dbm; - - return 0; -} - -/** - * ble phy txpwr round - * - * Get the rounded transmit output power (in dBm). - * - * @param dbm Power output in dBm. - * - * @return int Rounded power in dBm - */ -int ble_phy_txpower_round(int dbm) -{ - /* "Rail" power level if outside supported range */ - if (dbm > NRF_TX_PWR_MAX_DBM) { - dbm = NRF_TX_PWR_MAX_DBM; - } else { - if (dbm < NRF_TX_PWR_MIN_DBM) { - dbm = NRF_TX_PWR_MIN_DBM; - } - } - - return dbm; -} - -/** - * ble phy txpwr get - * - * Get the transmit power. - * - * @return int The current PHY transmit power, in dBm - */ -int -ble_phy_txpwr_get(void) -{ - return g_ble_phy_data.phy_txpwr_dbm; -} - -void -ble_phy_set_rx_pwr_compensation(int8_t compensation) -{ - g_ble_phy_data.rx_pwr_compensation = compensation; -} - -/** - * ble phy setchan - * - * Sets the logical frequency of the transceiver. The input parameter is the - * BLE channel index (0 to 39, inclusive). The NRF frequency register works like - * this: logical frequency = 2400 + FREQ (MHz). - * - * Thus, to get a logical frequency of 2402 MHz, you would program the - * FREQUENCY register to 2. - * - * @param chan This is the Data Channel Index or Advertising Channel index - * - * @return int 0: success; PHY error code otherwise - */ -int -ble_phy_setchan(uint8_t chan, uint32_t access_addr, uint32_t crcinit) -{ - uint32_t prefix; - - assert(chan < BLE_PHY_NUM_CHANS); - - /* Check for valid channel range */ - if (chan >= BLE_PHY_NUM_CHANS) { - return BLE_PHY_ERR_INV_PARAM; - } - - /* Get correct frequency */ - if (chan < BLE_PHY_NUM_DATA_CHANS) { - /* Set current access address */ - g_ble_phy_data.phy_access_address = access_addr; - - /* Configure logical address 1 and crcinit */ - prefix = NRF_RADIO->PREFIX0; - prefix &= 0xffff00ff; - prefix |= ((access_addr >> 24) & 0xFF) << 8; - NRF_RADIO->BASE1 = (access_addr << 8) & 0xFFFFFF00; - NRF_RADIO->PREFIX0 = prefix; - NRF_RADIO->TXADDRESS = 1; - NRF_RADIO->RXADDRESSES = (1 << 1); - NRF_RADIO->CRCINIT = crcinit; - } else { - /* Logical adddress 0 preconfigured */ - NRF_RADIO->TXADDRESS = 0; - NRF_RADIO->RXADDRESSES = (1 << 0); - NRF_RADIO->CRCINIT = BLE_LL_CRCINIT_ADV; - - /* Set current access address */ - g_ble_phy_data.phy_access_address = BLE_ACCESS_ADDR_ADV; - } - - /* Set the frequency and the data whitening initial value */ - g_ble_phy_data.phy_chan = chan; - NRF_RADIO->FREQUENCY = g_ble_phy_chan_freq[chan]; - NRF_RADIO->DATAWHITEIV = chan; - - return 0; -} - -/** - * Stop the timer used to count microseconds when using RTC for cputime - */ -static void -ble_phy_stop_usec_timer(void) -{ - NRF_TIMER0->TASKS_STOP = 1; - NRF_TIMER0->TASKS_SHUTDOWN = 1; - NRF_RTC0->EVTENCLR = RTC_EVTENSET_COMPARE0_Msk; -} - -/** - * ble phy disable irq and ppi - * - * This routine is to be called when reception was stopped due to either a - * wait for response timeout or a packet being received and the phy is to be - * restarted in receive mode. Generally, the disable routine is called to stop - * the phy. - */ -static void -ble_phy_disable_irq_and_ppi(void) -{ - NRF_RADIO->INTENCLR = NRF_RADIO_IRQ_MASK_ALL; - NRF_RADIO->SHORTS = 0; - NRF_RADIO->TASKS_DISABLE = 1; - NRF_PPI->CHENCLR = PPI_CHEN_CH4_Msk | PPI_CHEN_CH5_Msk | PPI_CHEN_CH20_Msk | - PPI_CHEN_CH21_Msk | PPI_CHEN_CH23_Msk | PPI_CHEN_CH24_Msk | - PPI_CHEN_CH25_Msk | PPI_CHEN_CH31_Msk; - NVIC_ClearPendingIRQ(RADIO_IRQn); - g_ble_phy_data.phy_state = BLE_PHY_STATE_IDLE; -} - -void -ble_phy_restart_rx(void) -{ - ble_phy_stop_usec_timer(); - ble_phy_disable_irq_and_ppi(); - ble_phy_rx(); -} - -/** - * ble phy disable - * - * Disables the PHY. This should be called when an event is over. It stops - * the usec timer (if used), disables interrupts, disables the RADIO, disables - * PPI and sets state to idle. - */ -void -ble_phy_disable(void) -{ - ble_phy_trace_void(BLE_PHY_TRACE_ID_DISABLE); - - ble_phy_stop_usec_timer(); - ble_phy_disable_irq_and_ppi(); -} - -/* Gets the current access address */ -uint32_t ble_phy_access_addr_get(void) -{ - return g_ble_phy_data.phy_access_address; -} - -/** - * Return the phy state - * - * @return int The current PHY state. - */ -int -ble_phy_state_get(void) -{ - return g_ble_phy_data.phy_state; -} - -/** - * Called to see if a reception has started - * - * @return int - */ -int -ble_phy_rx_started(void) -{ - return g_ble_phy_data.phy_rx_started; -} - -/** - * Return the transceiver state - * - * @return int transceiver state. - */ -uint8_t -ble_phy_xcvr_state_get(void) -{ - uint32_t state; - state = NRF_RADIO->STATE; - return (uint8_t)state; -} - -/** - * Called to return the maximum data pdu payload length supported by the - * phy. For this chip, if encryption is enabled, the maximum payload is 27 - * bytes. - * - * @return uint8_t Maximum data channel PDU payload size supported - */ -uint8_t -ble_phy_max_data_pdu_pyld(void) -{ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - return NRF_MAX_ENCRYPTED_PYLD_LEN; -#else - return BLE_LL_DATA_PDU_MAX_PYLD; -#endif -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) -void -ble_phy_resolv_list_enable(void) -{ - NRF_AAR->NIRK = (uint32_t)g_nrf_num_irks; - g_ble_phy_data.phy_privacy = 1; -} - -void -ble_phy_resolv_list_disable(void) -{ - g_ble_phy_data.phy_privacy = 0; -} -#endif - -void -ble_phy_rfclk_enable(void) -{ -#if MYNEWT - nrf51_clock_hfxo_request(); -#else - NRF_CLOCK->TASKS_HFCLKSTART = 1; -#endif -} - -void -ble_phy_rfclk_disable(void) -{ -#if MYNEWT - nrf51_clock_hfxo_release(); -#else - NRF_CLOCK->TASKS_HFCLKSTOP = 1; -#endif -} -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/include/ble/xcvr.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/include/ble/xcvr.h deleted file mode 100644 index fd8e1e898..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/include/ble/xcvr.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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. - */ - -#if defined(ARDUINO_ARCH_NRF5) && defined(NRF52_SERIES) - -#ifndef H_BLE_XCVR_ -#define H_BLE_XCVR_ - -#ifdef __cplusplus -extern "C" { -#endif - -#define XCVR_RX_RADIO_RAMPUP_USECS (40) -#define XCVR_TX_RADIO_RAMPUP_USECS (40) - -/* - * NOTE: we have to account for the RTC output compare issue. We want it to be - * 5 ticks. - */ -#define XCVR_PROC_DELAY_USECS (153) -#define XCVR_RX_START_DELAY_USECS (XCVR_RX_RADIO_RAMPUP_USECS) -#define XCVR_TX_START_DELAY_USECS (XCVR_TX_RADIO_RAMPUP_USECS) -#define XCVR_TX_SCHED_DELAY_USECS \ - (XCVR_TX_START_DELAY_USECS + XCVR_PROC_DELAY_USECS) -#define XCVR_RX_SCHED_DELAY_USECS \ - (XCVR_RX_START_DELAY_USECS + XCVR_PROC_DELAY_USECS) - -/* - * Define HW whitelist size. This is the total possible whitelist size; - * not necessarily the size that will be used (may be smaller) - */ -#define BLE_HW_WHITE_LIST_SIZE (8) - -#ifdef __cplusplus -} -#endif - -#endif /* H_BLE_XCVR_ */ -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/pkg.yml deleted file mode 100644 index a1ff457e6..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/pkg.yml +++ /dev/null @@ -1,31 +0,0 @@ -# -# 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. -# - -pkg.name: nimble/drivers/nrf52 -pkg.description: BLE driver for nRF52 systems. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - -pkg.apis: ble_driver -pkg.deps: - - nimble - - nimble/controller diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/src/ble_hw.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/src/ble_hw.c deleted file mode 100644 index 400fddf6f..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/src/ble_hw.c +++ /dev/null @@ -1,491 +0,0 @@ -/* - * 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. - */ - -#if defined(ARDUINO_ARCH_NRF5) && defined(NRF52_SERIES) - -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "../include/ble/xcvr.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nrf.h" -#include "nimble/nimble/controller/include/controller/ble_hw.h" -#if MYNEWT -#include "mcu/cmsis_nvic.h" -#else -#include "core_cm4.h" -#include "nimble/porting/npl/freertos/include/nimble/nimble_npl_os.h" -#endif -#include "nimble/porting/nimble/include/os/os_trace_api.h" - -/* Total number of resolving list elements */ -#define BLE_HW_RESOLV_LIST_SIZE (16) - -/* We use this to keep track of which entries are set to valid addresses */ -static uint8_t g_ble_hw_whitelist_mask; - -/* Random number generator isr callback */ -ble_rng_isr_cb_t g_ble_rng_isr_cb; - -/* If LL privacy is enabled, allocate memory for AAR */ -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - -/* The NRF51 supports up to 16 IRK entries */ -#if (MYNEWT_VAL(BLE_LL_RESOLV_LIST_SIZE) < 16) -#define NRF_IRK_LIST_ENTRIES (MYNEWT_VAL(BLE_LL_RESOLV_LIST_SIZE)) -#else -#define NRF_IRK_LIST_ENTRIES (16) -#endif - -/* NOTE: each entry is 16 bytes long. */ -uint32_t g_nrf_irk_list[NRF_IRK_LIST_ENTRIES * 4]; - -/* Current number of IRK entries */ -uint8_t g_nrf_num_irks; - -#endif - -/* Returns public device address or -1 if not present */ -int -ble_hw_get_public_addr(ble_addr_t *addr) -{ - uint32_t addr_high; - uint32_t addr_low; - - /* Does FICR have a public address */ - if ((NRF_FICR->DEVICEADDRTYPE & 1) != 0) { - return -1; - } - - /* Copy into device address. We can do this because we know platform */ - addr_low = NRF_FICR->DEVICEADDR[0]; - addr_high = NRF_FICR->DEVICEADDR[1]; - memcpy(addr->val, &addr_low, 4); - memcpy(&addr->val[4], &addr_high, 2); - addr->type = BLE_ADDR_PUBLIC; - - return 0; -} - -/* Returns random static address or -1 if not present */ -int -ble_hw_get_static_addr(ble_addr_t *addr) -{ - int rc; - - if ((NRF_FICR->DEVICEADDRTYPE & 1) == 1) { - memcpy(addr->val, (void *)&NRF_FICR->DEVICEADDR[0], 4); - memcpy(&addr->val[4], (void *)&NRF_FICR->DEVICEADDR[1], 2); - addr->val[5] |= 0xc0; - addr->type = BLE_ADDR_RANDOM; - rc = 0; - } else { - rc = -1; - } - - return rc; -} - -/** - * Clear the whitelist - * - * @return int - */ -void -ble_hw_whitelist_clear(void) -{ - NRF_RADIO->DACNF = 0; - g_ble_hw_whitelist_mask = 0; -} - -/** - * Add a device to the hw whitelist - * - * @param addr - * @param addr_type - * - * @return int 0: success, BLE error code otherwise - */ -int -ble_hw_whitelist_add(const uint8_t *addr, uint8_t addr_type) -{ - int i; - uint32_t mask; - - /* Find first ununsed device address match element */ - mask = 0x01; - for (i = 0; i < BLE_HW_WHITE_LIST_SIZE; ++i) { - if ((mask & g_ble_hw_whitelist_mask) == 0) { - NRF_RADIO->DAB[i] = get_le32(addr); - NRF_RADIO->DAP[i] = get_le16(addr + 4); - if (addr_type == BLE_ADDR_RANDOM) { - NRF_RADIO->DACNF |= (mask << 8); - } - g_ble_hw_whitelist_mask |= mask; - return BLE_ERR_SUCCESS; - } - mask <<= 1; - } - - return BLE_ERR_MEM_CAPACITY; -} - -/** - * Remove a device from the hw whitelist - * - * @param addr - * @param addr_type - * - */ -void -ble_hw_whitelist_rmv(const uint8_t *addr, uint8_t addr_type) -{ - int i; - uint8_t cfg_addr; - uint16_t dap; - uint16_t txadd; - uint32_t dab; - uint32_t mask; - - /* Find first ununsed device address match element */ - dab = get_le32(addr); - dap = get_le16(addr + 4); - txadd = NRF_RADIO->DACNF >> 8; - mask = 0x01; - for (i = 0; i < BLE_HW_WHITE_LIST_SIZE; ++i) { - if (mask & g_ble_hw_whitelist_mask) { - if ((dab == NRF_RADIO->DAB[i]) && (dap == NRF_RADIO->DAP[i])) { - cfg_addr = txadd & mask; - if (addr_type == BLE_ADDR_RANDOM) { - if (cfg_addr != 0) { - break; - } - } else { - if (cfg_addr == 0) { - break; - } - } - } - } - mask <<= 1; - } - - if (i < BLE_HW_WHITE_LIST_SIZE) { - g_ble_hw_whitelist_mask &= ~mask; - NRF_RADIO->DACNF &= ~mask; - } -} - -/** - * Returns the size of the whitelist in HW - * - * @return int Number of devices allowed in whitelist - */ -uint8_t -ble_hw_whitelist_size(void) -{ - return BLE_HW_WHITE_LIST_SIZE; -} - -/** - * Enable the whitelisted devices - */ -void -ble_hw_whitelist_enable(void) -{ - /* Enable the configured device addresses */ - NRF_RADIO->DACNF |= g_ble_hw_whitelist_mask; -} - -/** - * Disables the whitelisted devices - */ -void -ble_hw_whitelist_disable(void) -{ - /* Disable all whitelist devices */ - NRF_RADIO->DACNF &= 0x0000ff00; -} - -/** - * Boolean function which returns true ('1') if there is a match on the - * whitelist. - * - * @return int - */ -int -ble_hw_whitelist_match(void) -{ - return (int)NRF_RADIO->EVENTS_DEVMATCH; -} - -/* Encrypt data */ -int -ble_hw_encrypt_block(struct ble_encryption_block *ecb) -{ - int rc; - uint32_t end; - uint32_t err; - - /* Stop ECB */ - NRF_ECB->TASKS_STOPECB = 1; - /* XXX: does task stop clear these counters? Anyway to do this quicker? */ - NRF_ECB->EVENTS_ENDECB = 0; - NRF_ECB->EVENTS_ERRORECB = 0; - NRF_ECB->ECBDATAPTR = (uint32_t)ecb; - - /* Start ECB */ - NRF_ECB->TASKS_STARTECB = 1; - - /* Wait till error or done */ - rc = 0; - while (1) { - end = NRF_ECB->EVENTS_ENDECB; - err = NRF_ECB->EVENTS_ERRORECB; - if (end || err) { - if (err) { - rc = -1; - } - break; - } - } - - return rc; -} - -/** - * Random number generator ISR. - */ -static void -ble_rng_isr(void) -{ - uint8_t rnum; - - os_trace_isr_enter(); - - /* No callback? Clear and disable interrupts */ - if (g_ble_rng_isr_cb == NULL) { - NRF_RNG->INTENCLR = 1; - NRF_RNG->EVENTS_VALRDY = 0; - (void)NRF_RNG->SHORTS; - os_trace_isr_exit(); - return; - } - - /* If there is a value ready grab it */ - if (NRF_RNG->EVENTS_VALRDY) { - NRF_RNG->EVENTS_VALRDY = 0; - rnum = (uint8_t)NRF_RNG->VALUE; - (*g_ble_rng_isr_cb)(rnum); - } - - os_trace_isr_exit(); -} - -/** - * Initialize the random number generator - * - * @param cb - * @param bias - * - * @return int - */ -int -ble_hw_rng_init(ble_rng_isr_cb_t cb, int bias) -{ - /* Set bias */ - if (bias) { - NRF_RNG->CONFIG = 1; - } else { - NRF_RNG->CONFIG = 0; - } - - /* If we were passed a function pointer we need to enable the interrupt */ - if (cb != NULL) { -#ifndef RIOT_VERSION - NVIC_SetPriority(RNG_IRQn, (1 << __NVIC_PRIO_BITS) - 1); -#endif -#if MYNEWT - NVIC_SetVector(RNG_IRQn, (uint32_t)ble_rng_isr); -#else - ble_npl_hw_set_isr(RNG_IRQn, ble_rng_isr); -#endif - NVIC_EnableIRQ(RNG_IRQn); - g_ble_rng_isr_cb = cb; - } - - return 0; -} - -/** - * Start the random number generator - * - * @return int - */ -int -ble_hw_rng_start(void) -{ - os_sr_t sr; - - /* No need for interrupt if there is no callback */ - OS_ENTER_CRITICAL(sr); - NRF_RNG->EVENTS_VALRDY = 0; - if (g_ble_rng_isr_cb) { - NRF_RNG->INTENSET = 1; - } - NRF_RNG->TASKS_START = 1; - OS_EXIT_CRITICAL(sr); - - return 0; -} - -/** - * Stop the random generator - * - * @return int - */ -int -ble_hw_rng_stop(void) -{ - os_sr_t sr; - - /* No need for interrupt if there is no callback */ - OS_ENTER_CRITICAL(sr); - NRF_RNG->INTENCLR = 1; - NRF_RNG->TASKS_STOP = 1; - NRF_RNG->EVENTS_VALRDY = 0; - OS_EXIT_CRITICAL(sr); - - return 0; -} - -/** - * Read the random number generator. - * - * @return uint8_t - */ -uint8_t -ble_hw_rng_read(void) -{ - uint8_t rnum; - - /* Wait for a sample */ - while (NRF_RNG->EVENTS_VALRDY == 0) { - } - - NRF_RNG->EVENTS_VALRDY = 0; - rnum = (uint8_t)NRF_RNG->VALUE; - - return rnum; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) -/** - * Clear the resolving list - * - * @return int - */ -void -ble_hw_resolv_list_clear(void) -{ - g_nrf_num_irks = 0; -} - -/** - * Add a device to the hw resolving list - * - * @param irk Pointer to IRK to add - * - * @return int 0: success, BLE error code otherwise - */ -int -ble_hw_resolv_list_add(uint8_t *irk) -{ - uint32_t *nrf_entry; - - /* Find first ununsed device address match element */ - if (g_nrf_num_irks == NRF_IRK_LIST_ENTRIES) { - return BLE_ERR_MEM_CAPACITY; - } - - /* Copy into irk list */ - nrf_entry = &g_nrf_irk_list[4 * g_nrf_num_irks]; - memcpy(nrf_entry, irk, 16); - - /* Add to total */ - ++g_nrf_num_irks; - return BLE_ERR_SUCCESS; -} - -/** - * Remove a device from the hw resolving list - * - * @param index Index of IRK to remove - */ -void -ble_hw_resolv_list_rmv(int index) -{ - uint32_t *irk_entry; - - if (index < g_nrf_num_irks) { - --g_nrf_num_irks; - irk_entry = &g_nrf_irk_list[index]; - if (g_nrf_num_irks > index) { - memmove(irk_entry, irk_entry + 4, 16 * (g_nrf_num_irks - index)); - } - } -} - -/** - * Returns the size of the resolving list. NOTE: this returns the maximum - * allowable entries in the HW. Configuration options may limit this. - * - * @return int Number of devices allowed in resolving list - */ -uint8_t -ble_hw_resolv_list_size(void) -{ - return BLE_HW_RESOLV_LIST_SIZE; -} - -/** - * Called to determine if the address received was resolved. - * - * @return int Negative values indicate unresolved address; positive values - * indicate index in resolving list of resolved address. - */ -int -ble_hw_resolv_list_match(void) -{ - uint32_t index; - - if (NRF_AAR->EVENTS_END) { - if (NRF_AAR->EVENTS_RESOLVED) { - index = NRF_AAR->STATUS; - return (int)index; - } - } - - return -1; -} -#endif -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/src/ble_phy.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/src/ble_phy.c deleted file mode 100644 index 2ee29ab9c..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/src/ble_phy.c +++ /dev/null @@ -1,2120 +0,0 @@ -/* - * 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. - */ - - #if defined(ARDUINO_ARCH_NRF5) && defined(NRF52_SERIES) - -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "../include/ble/xcvr.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/nimble_opt.h" -#include "nimble/nimble/include/nimble/nimble_npl.h" -#include "nimble/nimble/controller/include/controller/ble_phy.h" -#include "nimble/nimble/controller/include/controller/ble_phy_trace.h" -#include "nimble/nimble/controller/include/controller/ble_ll.h" -#include "nrf.h" -#if MYNEWT -#include "mcu/nrf52_clock.h" -#include "mcu/cmsis_nvic.h" -#include "hal/hal_gpio.h" -#else -#include "core_cm4.h" -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) -#if !MYNEWT_VAL_CHOICE(MCU_TARGET, nRF52840) && !MYNEWT_VAL_CHOICE(MCU_TARGET, nRF52811) -#error LE Coded PHY can only be enabled on nRF52811 or nRF52840 -#endif -#endif - -/* - * NOTE: This code uses a couple of PPI channels so care should be taken when - * using PPI somewhere else. - * - * Pre-programmed channels: CH20, CH21, CH23, CH25, CH31 - * Regular channels: CH4, CH5 and optionally CH17, CH18, CH19 - * - CH4 = cancel wfr timer on address match - * - CH5 = disable radio on wfr timer expiry - * - CH17 = (optional) gpio debug for radio ramp-up - * - CH18 = (optional) gpio debug for wfr timer RX enabled - * - CH19 = (optional) gpio debug for wfr timer radio disabled - * - */ - -/* XXX: 4) Make sure RF is higher priority interrupt than schedule */ - -/* - * XXX: Maximum possible transmit time is 1 msec for a 60ppm crystal - * and 16ms for a 30ppm crystal! We need to limit PDU size based on - * crystal accuracy. Look at this in the spec. - */ - -/* XXX: private header file? */ -extern uint8_t g_nrf_num_irks; -extern uint32_t g_nrf_irk_list[]; - -/* To disable all radio interrupts */ -#define NRF_RADIO_IRQ_MASK_ALL (0x34FF) - -/* - * We configure the nrf with a 1 byte S0 field, 8 bit length field, and - * zero bit S1 field. The preamble is 8 bits long. - */ -#define NRF_LFLEN_BITS (8) -#define NRF_S0LEN (1) -#define NRF_S1LEN_BITS (0) -#define NRF_CILEN_BITS (2) -#define NRF_TERMLEN_BITS (3) - -/* Maximum length of frames */ -#define NRF_MAXLEN (255) -#define NRF_BALEN (3) /* For base address of 3 bytes */ - -/* NRF_RADIO->PCNF0 configuration values */ -#define NRF_PCNF0 (NRF_LFLEN_BITS << RADIO_PCNF0_LFLEN_Pos) | \ - (RADIO_PCNF0_S1INCL_Msk) | \ - (NRF_S0LEN << RADIO_PCNF0_S0LEN_Pos) | \ - (NRF_S1LEN_BITS << RADIO_PCNF0_S1LEN_Pos) -#define NRF_PCNF0_1M (NRF_PCNF0) | \ - (RADIO_PCNF0_PLEN_8bit << RADIO_PCNF0_PLEN_Pos) -#define NRF_PCNF0_2M (NRF_PCNF0) | \ - (RADIO_PCNF0_PLEN_16bit << RADIO_PCNF0_PLEN_Pos) -#define NRF_PCNF0_CODED (NRF_PCNF0) | \ - (RADIO_PCNF0_PLEN_LongRange << RADIO_PCNF0_PLEN_Pos) | \ - (NRF_CILEN_BITS << RADIO_PCNF0_CILEN_Pos) | \ - (NRF_TERMLEN_BITS << RADIO_PCNF0_TERMLEN_Pos) - -/* BLE PHY data structure */ -struct ble_phy_obj -{ - uint8_t phy_stats_initialized; - int8_t phy_txpwr_dbm; - uint8_t phy_chan; - uint8_t phy_state; - uint8_t phy_transition; - uint8_t phy_transition_late; - uint8_t phy_rx_started; - uint8_t phy_encrypted; - uint8_t phy_privacy; - uint8_t phy_tx_pyld_len; - uint8_t phy_cur_phy_mode; - uint8_t phy_tx_phy_mode; - uint8_t phy_rx_phy_mode; - uint8_t phy_bcc_offset; - int8_t rx_pwr_compensation; - uint32_t phy_aar_scratch; - uint32_t phy_access_address; - struct ble_mbuf_hdr rxhdr; - void *txend_arg; - ble_phy_tx_end_func txend_cb; - uint32_t phy_start_cputime; -}; -struct ble_phy_obj g_ble_phy_data; - -/* XXX: if 27 byte packets desired we can make this smaller */ -/* Global transmit/receive buffer */ -static uint32_t g_ble_phy_tx_buf[(BLE_PHY_MAX_PDU_LEN + 3) / 4]; -static uint32_t g_ble_phy_rx_buf[(BLE_PHY_MAX_PDU_LEN + 3) / 4]; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) -/* Make sure word-aligned for faster copies */ -static uint32_t g_ble_phy_enc_buf[(BLE_PHY_MAX_PDU_LEN + 3) / 4]; -#endif - -/* RF center frequency for each channel index (offset from 2400 MHz) */ -static const uint8_t g_ble_phy_chan_freq[BLE_PHY_NUM_CHANS] = { - 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, /* 0-9 */ - 24, 28, 30, 32, 34, 36, 38, 40, 42, 44, /* 10-19 */ - 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, /* 20-29 */ - 66, 68, 70, 72, 74, 76, 78, 2, 26, 80, /* 30-39 */ -}; - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) -/* packet start offsets (in usecs) */ -static const uint16_t g_ble_phy_mode_pkt_start_off[BLE_PHY_NUM_MODE] = { - [BLE_PHY_MODE_1M] = 40, - [BLE_PHY_MODE_2M] = 24, - [BLE_PHY_MODE_CODED_125KBPS] = 376, - [BLE_PHY_MODE_CODED_500KBPS] = 376 -}; -#endif - -/* Various radio timings */ -/* Radio ramp-up times in usecs (fast mode) */ -#define BLE_PHY_T_TXENFAST (XCVR_TX_RADIO_RAMPUP_USECS) -#define BLE_PHY_T_RXENFAST (XCVR_RX_RADIO_RAMPUP_USECS) -/* delay between EVENTS_READY and start of tx */ -static const uint8_t g_ble_phy_t_txdelay[BLE_PHY_NUM_MODE] = { - [BLE_PHY_MODE_1M] = 4, - [BLE_PHY_MODE_2M] = 3, - [BLE_PHY_MODE_CODED_125KBPS] = 5, - [BLE_PHY_MODE_CODED_500KBPS] = 5 -}; -/* delay between EVENTS_END and end of txd packet */ -static const uint8_t g_ble_phy_t_txenddelay[BLE_PHY_NUM_MODE] = { - [BLE_PHY_MODE_1M] = 4, - [BLE_PHY_MODE_2M] = 3, - [BLE_PHY_MODE_CODED_125KBPS] = 9, - [BLE_PHY_MODE_CODED_500KBPS] = 3 -}; -/* delay between rxd access address (w/ TERM1 for coded) and EVENTS_ADDRESS */ -static const uint8_t g_ble_phy_t_rxaddrdelay[BLE_PHY_NUM_MODE] = { - [BLE_PHY_MODE_1M] = 6, - [BLE_PHY_MODE_2M] = 2, - [BLE_PHY_MODE_CODED_125KBPS] = 17, - [BLE_PHY_MODE_CODED_500KBPS] = 17 -}; -/* delay between end of rxd packet and EVENTS_END */ -static const uint8_t g_ble_phy_t_rxenddelay[BLE_PHY_NUM_MODE] = { - [BLE_PHY_MODE_1M] = 6, - [BLE_PHY_MODE_2M] = 2, - [BLE_PHY_MODE_CODED_125KBPS] = 27, - [BLE_PHY_MODE_CODED_500KBPS] = 22 -}; - -/* Statistics */ -STATS_SECT_START(ble_phy_stats) - STATS_SECT_ENTRY(phy_isrs) - STATS_SECT_ENTRY(tx_good) - STATS_SECT_ENTRY(tx_fail) - STATS_SECT_ENTRY(tx_late) - STATS_SECT_ENTRY(tx_bytes) - STATS_SECT_ENTRY(rx_starts) - STATS_SECT_ENTRY(rx_aborts) - STATS_SECT_ENTRY(rx_valid) - STATS_SECT_ENTRY(rx_crc_err) - STATS_SECT_ENTRY(rx_late) - STATS_SECT_ENTRY(radio_state_errs) - STATS_SECT_ENTRY(rx_hw_err) - STATS_SECT_ENTRY(tx_hw_err) -STATS_SECT_END -STATS_SECT_DECL(ble_phy_stats) ble_phy_stats; - -STATS_NAME_START(ble_phy_stats) - STATS_NAME(ble_phy_stats, phy_isrs) - STATS_NAME(ble_phy_stats, tx_good) - STATS_NAME(ble_phy_stats, tx_fail) - STATS_NAME(ble_phy_stats, tx_late) - STATS_NAME(ble_phy_stats, tx_bytes) - STATS_NAME(ble_phy_stats, rx_starts) - STATS_NAME(ble_phy_stats, rx_aborts) - STATS_NAME(ble_phy_stats, rx_valid) - STATS_NAME(ble_phy_stats, rx_crc_err) - STATS_NAME(ble_phy_stats, rx_late) - STATS_NAME(ble_phy_stats, radio_state_errs) - STATS_NAME(ble_phy_stats, rx_hw_err) - STATS_NAME(ble_phy_stats, tx_hw_err) -STATS_NAME_END(ble_phy_stats) - -/* - * NOTE: - * Tested the following to see what would happen: - * -> NVIC has radio irq enabled (interrupt # 1, mask 0x2). - * -> Set up nrf to receive. Clear ADDRESS event register. - * -> Enable ADDRESS interrupt on nrf5 by writing to INTENSET. - * -> Enable RX. - * -> Disable interrupts globally using OS_ENTER_CRITICAL(). - * -> Wait until a packet is received and the ADDRESS event occurs. - * -> Call ble_phy_disable(). - * - * At this point I wanted to see the state of the cortex NVIC. The IRQ - * pending bit was TRUE for the radio interrupt (as expected) as we never - * serviced the radio interrupt (interrupts were disabled). - * - * What was unexpected was this: without clearing the pending IRQ in the NVIC, - * when radio interrupts were re-enabled (address event bit in INTENSET set to - * 1) and the radio ADDRESS event register read 1 (it was never cleared after - * the first address event), the radio did not enter the ISR! I would have - * expected that if the following were true, an interrupt would occur: - * -> NVIC ISER bit set to TRUE - * -> NVIC ISPR bit reads TRUE, meaning interrupt is pending. - * -> Radio peripheral interrupts are enabled for some event (or events). - * -> Corresponding event register(s) in radio peripheral read 1. - * - * Not sure what the end result of all this is. We will clear the pending - * bit in the NVIC just to be sure when we disable the PHY. - */ - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - -/* - * Per nordic, the number of bytes needed for scratch is 16 + MAX_PKT_SIZE. - * However, when I used a smaller size it still overwrote the scratchpad. Until - * I figure this out I am just going to allocate 67 words so we have enough - * space for 267 bytes of scratch. I used 268 bytes since not sure if this - * needs to be aligned and burning a byte is no big deal. - */ -//#define NRF_ENC_SCRATCH_WORDS (((MYNEWT_VAL(BLE_LL_MAX_PKT_SIZE) + 16) + 3) / 4) -#define NRF_ENC_SCRATCH_WORDS (67) - -uint32_t g_nrf_encrypt_scratchpad[NRF_ENC_SCRATCH_WORDS]; - -struct nrf_ccm_data -{ - uint8_t key[16]; - uint64_t pkt_counter; - uint8_t dir_bit; - uint8_t iv[8]; -} __attribute__((packed)); - -struct nrf_ccm_data g_nrf_ccm_data; -#endif - -static void -ble_phy_apply_errata_102_106_107(void) -{ - /* [102] RADIO: PAYLOAD/END events delayed or not triggered after ADDRESS - * [106] RADIO: Higher CRC error rates for some access addresses - * [107] RADIO: Immediate address match for access addresses containing MSBs 0x00 - */ - *(volatile uint32_t *)0x40001774 = ((*(volatile uint32_t *)0x40001774) & - 0xfffffffe) | 0x01000000; -} - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - -/* Packet start offset (in usecs). This is the preamble plus access address. - * For LE Coded PHY this also includes CI and TERM1. */ -uint32_t -ble_phy_mode_pdu_start_off(int phy_mode) -{ - return g_ble_phy_mode_pkt_start_off[phy_mode]; -} - -#if NRF52840_XXAA -static inline bool -ble_phy_mode_is_coded(uint8_t phy_mode) -{ - return (phy_mode == BLE_PHY_MODE_CODED_125KBPS) || - (phy_mode == BLE_PHY_MODE_CODED_500KBPS); -} - -static void -ble_phy_apply_nrf52840_errata(uint8_t new_phy_mode) -{ - bool new_coded = ble_phy_mode_is_coded(new_phy_mode); - bool cur_coded = ble_phy_mode_is_coded(g_ble_phy_data.phy_cur_phy_mode); - - /* - * Workarounds should be applied only when switching to/from LE Coded PHY - * so no need to apply them every time. - * - * nRF52840 Engineering A Errata v1.2 - * [164] RADIO: Low sensitivity in long range mode - * - * nRF52840 Rev 1 Errata - * [191] RADIO: High packet error rate in BLE Long Range mode - */ - if (new_coded == cur_coded) { - return; - } - - if (new_coded) { -#if MYNEWT_VAL(BLE_PHY_NRF52840_ERRATA_164) - /* [164] */ - *(volatile uint32_t *)0x4000173C |= 0x80000000; - *(volatile uint32_t *)0x4000173C = - ((*(volatile uint32_t *)0x4000173C & 0xFFFFFF00) | 0x5C); -#endif -#if MYNEWT_VAL(BLE_PHY_NRF52840_ERRATA_191) - /* [191] */ - *(volatile uint32_t *) 0x40001740 = - ((*((volatile uint32_t *) 0x40001740)) & 0x7FFF00FF) | - 0x80000000 | (((uint32_t)(196)) << 8); -#endif - } else { -#if MYNEWT_VAL(BLE_PHY_NRF52840_ERRATA_164) - /* [164] */ - *(volatile uint32_t *)0x4000173C &= ~0x80000000; -#endif -#if MYNEWT_VAL(BLE_PHY_NRF52840_ERRATA_191) - /* [191] */ - *(volatile uint32_t *) 0x40001740 = - ((*((volatile uint32_t *) 0x40001740)) & 0x7FFFFFFF); -#endif - } -} -#endif - -static void -ble_phy_mode_apply(uint8_t phy_mode) -{ - if (phy_mode == g_ble_phy_data.phy_cur_phy_mode) { - return; - } - -#if NRF52840_XXAA - ble_phy_apply_nrf52840_errata(phy_mode); -#endif - - switch (phy_mode) { - case BLE_PHY_MODE_1M: - NRF_RADIO->MODE = RADIO_MODE_MODE_Ble_1Mbit; - NRF_RADIO->PCNF0 = NRF_PCNF0_1M; - break; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY) - case BLE_PHY_MODE_2M: - NRF_RADIO->MODE = RADIO_MODE_MODE_Ble_2Mbit; - NRF_RADIO->PCNF0 = NRF_PCNF0_2M; - break; -#endif -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - case BLE_PHY_MODE_CODED_125KBPS: - NRF_RADIO->MODE = RADIO_MODE_MODE_Ble_LR125Kbit; - NRF_RADIO->PCNF0 = NRF_PCNF0_CODED; - break; - case BLE_PHY_MODE_CODED_500KBPS: - NRF_RADIO->MODE = RADIO_MODE_MODE_Ble_LR500Kbit; - NRF_RADIO->PCNF0 = NRF_PCNF0_CODED; - break; -#endif - default: - assert(0); - } - - g_ble_phy_data.phy_cur_phy_mode = phy_mode; -} - -void -ble_phy_mode_set(uint8_t tx_phy_mode, uint8_t rx_phy_mode) -{ - g_ble_phy_data.phy_tx_phy_mode = tx_phy_mode; - g_ble_phy_data.phy_rx_phy_mode = rx_phy_mode; -} -#endif - -int -ble_phy_get_cur_phy(void) -{ -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - switch (g_ble_phy_data.phy_cur_phy_mode) { - case BLE_PHY_MODE_1M: - return BLE_PHY_1M; - case BLE_PHY_MODE_2M: - return BLE_PHY_2M; - case BLE_PHY_MODE_CODED_125KBPS: - case BLE_PHY_MODE_CODED_500KBPS: - return BLE_PHY_CODED; - default: - assert(0); - return -1; - } -#else - return BLE_PHY_1M; -#endif -} - -/** - * Copies the data from the phy receive buffer into a mbuf chain. - * - * @param dptr Pointer to receive buffer - * @param rxpdu Pointer to already allocated mbuf chain - * - * NOTE: the packet header already has the total mbuf length in it. The - * lengths of the individual mbufs are not set prior to calling. - * - */ -void -ble_phy_rxpdu_copy(uint8_t *dptr, struct os_mbuf *rxpdu) -{ - uint32_t rem_len; - uint32_t copy_len; - uint32_t block_len; - uint32_t block_rem_len; - void *dst; - void *src; - struct os_mbuf * om; - - /* Better be aligned */ - assert(((uint32_t)dptr & 3) == 0); - - block_len = rxpdu->om_omp->omp_databuf_len; - rem_len = OS_MBUF_PKTHDR(rxpdu)->omp_len; - src = dptr; - - /* - * Setup for copying from first mbuf which is shorter due to packet header - * and extra leading space - */ - copy_len = block_len - rxpdu->om_pkthdr_len - 4; - om = rxpdu; - dst = om->om_data; - - while (true) { - /* - * Always copy blocks of length aligned to word size, only last mbuf - * will have remaining non-word size bytes appended. - */ - block_rem_len = copy_len; - copy_len = min(copy_len, rem_len); - copy_len &= ~3; - - dst = om->om_data; - om->om_len = copy_len; - rem_len -= copy_len; - block_rem_len -= copy_len; - - __asm__ volatile (".syntax unified \n" - " mov r4, %[len] \n" - " b 2f \n" - "1: ldr r3, [%[src], %[len]] \n" - " str r3, [%[dst], %[len]] \n" - "2: subs %[len], #4 \n" - " bpl 1b \n" - " adds %[src], %[src], r4 \n" - " adds %[dst], %[dst], r4 \n" - : [dst] "+r" (dst), [src] "+r" (src), - [len] "+r" (copy_len) - : - : "r3", "r4", "memory" - ); - - if ((rem_len < 4) && (block_rem_len >= rem_len)) { - break; - } - - /* Move to next mbuf */ - om = SLIST_NEXT(om, om_next); - copy_len = block_len; - } - - /* Copy remaining bytes, if any, to last mbuf */ - om->om_len += rem_len; - __asm__ volatile (".syntax unified \n" - " b 2f \n" - "1: ldrb r3, [%[src], %[len]] \n" - " strb r3, [%[dst], %[len]] \n" - "2: subs %[len], #1 \n" - " bpl 1b \n" - : [len] "+r" (rem_len) - : [dst] "r" (dst), [src] "r" (src) - : "r3", "memory" - ); - - /* Copy header */ - memcpy(BLE_MBUF_HDR_PTR(rxpdu), &g_ble_phy_data.rxhdr, - sizeof(struct ble_mbuf_hdr)); -} - -/** - * Called when we want to wait if the radio is in either the rx or tx - * disable states. We want to wait until that state is over before doing - * anything to the radio - */ -static void -nrf_wait_disabled(void) -{ - uint32_t state; - - state = NRF_RADIO->STATE; - if (state != RADIO_STATE_STATE_Disabled) { - if ((state == RADIO_STATE_STATE_RxDisable) || - (state == RADIO_STATE_STATE_TxDisable)) { - /* This will end within a short time (6 usecs). Just poll */ - while (NRF_RADIO->STATE == state) { - /* If this fails, something is really wrong. Should last - * no more than 6 usecs */ - } - } - } -} - -/** - * - * - */ -static int -ble_phy_set_start_time(uint32_t cputime, uint8_t rem_usecs, bool tx) -{ - uint32_t next_cc; - uint32_t cur_cc; - uint32_t cntr; - uint32_t delta; - - /* - * We need to adjust start time to include radio ramp-up and TX pipeline - * delay (the latter only if applicable, so only for TX). - * - * Radio ramp-up time is 40 usecs and TX delay is 3 or 5 usecs depending on - * phy, thus we'll offset RTC by 2 full ticks (61 usecs) and then compensate - * using TIMER0 with 1 usec precision. - */ - - cputime -= 2; - rem_usecs += 61; - if (tx) { - rem_usecs -= BLE_PHY_T_TXENFAST; - rem_usecs -= g_ble_phy_t_txdelay[g_ble_phy_data.phy_cur_phy_mode]; - } else { - rem_usecs -= BLE_PHY_T_RXENFAST; - } - - /* - * rem_usecs will be no more than 2 ticks, but if it is more than single - * tick then we should better count one more low-power tick rather than - * 30 high-power usecs. Also make sure we don't set TIMER0 CC to 0 as the - * compare won't occur. - */ - - if (rem_usecs > 30) { - cputime++; - rem_usecs -= 30; - } - - /* - * Can we set the RTC compare to start TIMER0? We can do it if: - * a) Current compare value is not N+1 or N+2 ticks from current - * counter. - * b) The value we want to set is not at least N+2 from current - * counter. - * - * NOTE: since the counter can tick 1 while we do these calculations we - * need to account for it. - */ - next_cc = cputime & 0xffffff; - cur_cc = NRF_RTC0->CC[0]; - cntr = NRF_RTC0->COUNTER; - - delta = (cur_cc - cntr) & 0xffffff; - if ((delta <= 3) && (delta != 0)) { - return -1; - } - delta = (next_cc - cntr) & 0xffffff; - if ((delta & 0x800000) || (delta < 3)) { - return -1; - } - - /* Clear and set TIMER0 to fire off at proper time */ - NRF_TIMER0->TASKS_CLEAR = 1; - NRF_TIMER0->CC[0] = rem_usecs; - NRF_TIMER0->EVENTS_COMPARE[0] = 0; - - /* Set RTC compare to start TIMER0 */ - NRF_RTC0->EVENTS_COMPARE[0] = 0; - NRF_RTC0->CC[0] = next_cc; - NRF_RTC0->EVTENSET = RTC_EVTENSET_COMPARE0_Msk; - - /* Enable PPI */ - NRF_PPI->CHENSET = PPI_CHEN_CH31_Msk; - - /* Store the cputime at which we set the RTC */ - g_ble_phy_data.phy_start_cputime = cputime; - - return 0; -} - -static int -ble_phy_set_start_now(void) -{ - os_sr_t sr; - uint32_t now; - - OS_ENTER_CRITICAL(sr); - - /* - * Set TIMER0 to fire immediately. We can't set CC to 0 as compare will not - * occur in such case. - */ - NRF_TIMER0->TASKS_CLEAR = 1; - NRF_TIMER0->CC[0] = 1; - NRF_TIMER0->EVENTS_COMPARE[0] = 0; - - /* - * Set RTC compare to start TIMER0. We need to set it to at least N+2 ticks - * from current value to guarantee triggering compare event, but let's set - * it to N+3 to account for possible extra tick on RTC0 during these - * operations. - */ - now = os_cputime_get32(); - NRF_RTC0->EVENTS_COMPARE[0] = 0; - NRF_RTC0->CC[0] = now + 3; - NRF_RTC0->EVTENSET = RTC_EVTENSET_COMPARE0_Msk; - - /* Enable PPI */ - NRF_PPI->CHENSET = PPI_CHEN_CH31_Msk; - - /* - * Store the cputime at which we set the RTC - * - * XXX Compare event may be triggered on previous CC value (if it was set to - * less than N+2) so in rare cases actual start time may be 2 ticks earlier - * than what we expect. Since this is only used on RX, it may cause AUX scan - * to be scheduled 1 or 2 ticks too late so we'll miss it - it's acceptable - * for now. - */ - g_ble_phy_data.phy_start_cputime = now + 3; - - OS_EXIT_CRITICAL(sr); - - return 0; -} - -/** - * Function is used to set PPI so that we can time out waiting for a reception - * to occur. This happens for two reasons: we have sent a packet and we are - * waiting for a respons (txrx should be set to ENABLE_TXRX) or we are - * starting a connection event and we are a slave and we are waiting for the - * master to send us a packet (txrx should be set to ENABLE_RX). - * - * NOTE: when waiting for a txrx turn-around, wfr_usecs is not used as there - * is no additional time to wait; we know when we should receive the address of - * the received frame. - * - * @param txrx Flag denoting if this wfr is a txrx turn-around or not. - * @param tx_phy_mode phy mode for last TX (only valid for TX->RX) - * @param wfr_usecs Amount of usecs to wait. - */ -void -ble_phy_wfr_enable(int txrx, uint8_t tx_phy_mode, uint32_t wfr_usecs) -{ - uint32_t end_time; - uint8_t phy; - - phy = g_ble_phy_data.phy_cur_phy_mode; - - if (txrx == BLE_PHY_WFR_ENABLE_TXRX) { - /* RX shall start exactly T_IFS after TX end captured in CC[2] */ - end_time = NRF_TIMER0->CC[2] + BLE_LL_IFS; - /* Adjust for delay between EVENT_END and actual TX end time */ - end_time += g_ble_phy_t_txenddelay[tx_phy_mode]; - /* Wait a bit longer due to allowed active clock accuracy */ - end_time += 2; - /* - * It's possible that we'll capture PDU start time at the end of timer - * cycle and since wfr expires at the beginning of calculated timer - * cycle it can be almost 1 usec too early. Let's compensate for this - * by waiting 1 usec more. - */ - end_time += 1; -#if MYNEWT_VAL(BLE_PHY_CODED_RX_IFS_EXTRA_MARGIN) > 0 - if ((phy == BLE_PHY_MODE_CODED_125KBPS) || - (phy == BLE_PHY_MODE_CODED_500KBPS)) { - /* - * Some controllers exceed T_IFS when transmitting on coded phy - * so let's wait a bit longer to be able to talk to them if this - * workaround is enabled. - */ - end_time += MYNEWT_VAL(BLE_PHY_CODED_RX_IFS_EXTRA_MARGIN); - } -#endif - } else { - /* - * RX shall start no later than wfr_usecs after RX enabled. - * CC[0] is the time of RXEN so adjust for radio ram-up. - * Do not add jitter since this is already covered by LL. - */ - end_time = NRF_TIMER0->CC[0] + BLE_PHY_T_RXENFAST + wfr_usecs; - } - - /* - * Note: on LE Coded EVENT_ADDRESS is fired after TERM1 is received, so - * we are actually calculating relative to start of packet payload - * which is fine. - */ - - /* Adjust for receiving access address since this triggers EVENT_ADDRESS */ - end_time += ble_phy_mode_pdu_start_off(phy); - /* Adjust for delay between actual access address RX and EVENT_ADDRESS */ - end_time += g_ble_phy_t_rxaddrdelay[phy]; - - /* wfr_secs is the time from rxen until timeout */ - NRF_TIMER0->CC[3] = end_time; - NRF_TIMER0->EVENTS_COMPARE[3] = 0; - - /* Enable wait for response PPI */ - NRF_PPI->CHENSET = (PPI_CHEN_CH4_Msk | PPI_CHEN_CH5_Msk); - - /* Enable the disabled interrupt so we time out on events compare */ - NRF_RADIO->INTENSET = RADIO_INTENSET_DISABLED_Msk; - - /* - * It may happen that if CPU is halted for a brief moment (e.g. during flash - * erase or write), TIMER0 already counted past CC[3] and thus wfr will not - * fire as expected. In case this happened, let's just disable PPIs for wfr - * and trigger wfr manually (i.e. disable radio). - * - * Note that the same applies to RX start time set in CC[0] but since it - * should fire earlier than wfr, fixing wfr is enough. - * - * CC[1] is only used as a reference on RX start, we do not need it here so - * it can be used to read TIMER0 counter. - */ - NRF_TIMER0->TASKS_CAPTURE[1] = 1; - if (NRF_TIMER0->CC[1] > NRF_TIMER0->CC[3]) { - NRF_PPI->CHENCLR = PPI_CHEN_CH4_Msk | PPI_CHEN_CH5_Msk; - NRF_RADIO->TASKS_DISABLE = 1; - } -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) -static uint32_t -ble_phy_get_ccm_datarate(void) -{ -#if BLE_LL_BT5_PHY_SUPPORTED - switch (g_ble_phy_data.phy_cur_phy_mode) { - case BLE_PHY_MODE_1M: - return CCM_MODE_DATARATE_1Mbit << CCM_MODE_DATARATE_Pos; - case BLE_PHY_MODE_2M: - return CCM_MODE_DATARATE_2Mbit << CCM_MODE_DATARATE_Pos; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - case BLE_PHY_MODE_CODED_125KBPS: - return CCM_MODE_DATARATE_125Kbps << CCM_MODE_DATARATE_Pos; - case BLE_PHY_MODE_CODED_500KBPS: - return CCM_MODE_DATARATE_500Kbps << CCM_MODE_DATARATE_Pos; -#endif - } - - assert(0); - return 0; -#else - return CCM_MODE_DATARATE_1Mbit << CCM_MODE_DATARATE_Pos; -#endif -} -#endif - -/** - * Setup transceiver for receive. - */ -static void -ble_phy_rx_xcvr_setup(void) -{ - uint8_t *dptr; - - dptr = (uint8_t *)&g_ble_phy_rx_buf[0]; - dptr += 3; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (g_ble_phy_data.phy_encrypted) { - NRF_RADIO->PACKETPTR = (uint32_t)&g_ble_phy_enc_buf[0]; - NRF_CCM->INPTR = (uint32_t)&g_ble_phy_enc_buf[0]; - NRF_CCM->OUTPTR = (uint32_t)dptr; - NRF_CCM->SCRATCHPTR = (uint32_t)&g_nrf_encrypt_scratchpad[0]; - NRF_CCM->MODE = CCM_MODE_LENGTH_Msk | CCM_MODE_MODE_Decryption | - ble_phy_get_ccm_datarate(); - NRF_CCM->CNFPTR = (uint32_t)&g_nrf_ccm_data; - NRF_CCM->SHORTS = 0; - NRF_CCM->EVENTS_ERROR = 0; - NRF_CCM->EVENTS_ENDCRYPT = 0; - NRF_CCM->TASKS_KSGEN = 1; - NRF_PPI->CHENSET = PPI_CHEN_CH25_Msk; - } else { - NRF_RADIO->PACKETPTR = (uint32_t)dptr; - } -#else - NRF_RADIO->PACKETPTR = (uint32_t)dptr; -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - if (g_ble_phy_data.phy_privacy) { - NRF_AAR->ENABLE = AAR_ENABLE_ENABLE_Enabled; - NRF_AAR->IRKPTR = (uint32_t)&g_nrf_irk_list[0]; - NRF_AAR->SCRATCHPTR = (uint32_t)&g_ble_phy_data.phy_aar_scratch; - NRF_AAR->EVENTS_END = 0; - NRF_AAR->EVENTS_RESOLVED = 0; - NRF_AAR->EVENTS_NOTRESOLVED = 0; - } else { - if (g_ble_phy_data.phy_encrypted == 0) { - NRF_AAR->ENABLE = AAR_ENABLE_ENABLE_Disabled; - } - } -#endif - - /* Turn off trigger TXEN on output compare match and AAR on bcmatch */ - NRF_PPI->CHENCLR = PPI_CHEN_CH20_Msk | PPI_CHEN_CH23_Msk; - - /* Reset the rx started flag. Used for the wait for response */ - g_ble_phy_data.phy_rx_started = 0; - g_ble_phy_data.phy_state = BLE_PHY_STATE_RX; - -#if BLE_LL_BT5_PHY_SUPPORTED - /* - * On Coded PHY there are CI and TERM1 fields before PDU starts so we need - * to take this into account when setting up BCC. - */ - if (g_ble_phy_data.phy_cur_phy_mode == BLE_PHY_MODE_CODED_125KBPS || - g_ble_phy_data.phy_cur_phy_mode == BLE_PHY_MODE_CODED_500KBPS) { - g_ble_phy_data.phy_bcc_offset = 5; - } else { - g_ble_phy_data.phy_bcc_offset = 0; - } -#else - g_ble_phy_data.phy_bcc_offset = 0; -#endif - - /* I want to know when 1st byte received (after address) */ - NRF_RADIO->BCC = 8 + g_ble_phy_data.phy_bcc_offset; /* in bits */ - NRF_RADIO->EVENTS_ADDRESS = 0; - NRF_RADIO->EVENTS_DEVMATCH = 0; - NRF_RADIO->EVENTS_BCMATCH = 0; - NRF_RADIO->EVENTS_RSSIEND = 0; - NRF_RADIO->EVENTS_CRCOK = 0; - NRF_RADIO->SHORTS = RADIO_SHORTS_END_DISABLE_Msk | - RADIO_SHORTS_READY_START_Msk | - RADIO_SHORTS_ADDRESS_BCSTART_Msk | - RADIO_SHORTS_ADDRESS_RSSISTART_Msk | - RADIO_SHORTS_DISABLED_RSSISTOP_Msk; - - NRF_RADIO->INTENSET = RADIO_INTENSET_ADDRESS_Msk; -} - -/** - * Called from interrupt context when the transmit ends - * - */ -static void -ble_phy_tx_end_isr(void) -{ - uint8_t tx_phy_mode; - uint8_t was_encrypted; - uint8_t transition; - uint32_t rx_time; - uint32_t wfr_time; - - /* Store PHY on which we've just transmitted smth */ - tx_phy_mode = g_ble_phy_data.phy_cur_phy_mode; - - /* If this transmission was encrypted we need to remember it */ - was_encrypted = g_ble_phy_data.phy_encrypted; - (void)was_encrypted; - - /* Better be in TX state! */ - assert(g_ble_phy_data.phy_state == BLE_PHY_STATE_TX); - - /* Clear events and clear interrupt on disabled event */ - NRF_RADIO->EVENTS_DISABLED = 0; - NRF_RADIO->INTENCLR = RADIO_INTENCLR_DISABLED_Msk; - NRF_RADIO->EVENTS_END = 0; - wfr_time = NRF_RADIO->SHORTS; - (void)wfr_time; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - /* - * XXX: not sure what to do. We had a HW error during transmission. - * For now I just count a stat but continue on like all is good. - */ - if (was_encrypted) { - if (NRF_CCM->EVENTS_ERROR) { - STATS_INC(ble_phy_stats, tx_hw_err); - NRF_CCM->EVENTS_ERROR = 0; - } - } -#endif - - /* Call transmit end callback */ - if (g_ble_phy_data.txend_cb) { - g_ble_phy_data.txend_cb(g_ble_phy_data.txend_arg); - } - - transition = g_ble_phy_data.phy_transition; - if (transition == BLE_PHY_TRANSITION_TX_RX) { - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - ble_phy_mode_apply(g_ble_phy_data.phy_rx_phy_mode); -#endif - - /* Packet pointer needs to be reset. */ - ble_phy_rx_xcvr_setup(); - - ble_phy_wfr_enable(BLE_PHY_WFR_ENABLE_TXRX, tx_phy_mode, 0); - - /* Schedule RX exactly T_IFS after TX end captured in CC[2] */ - rx_time = NRF_TIMER0->CC[2] + BLE_LL_IFS; - /* Adjust for delay between EVENT_END and actual TX end time */ - rx_time += g_ble_phy_t_txenddelay[tx_phy_mode]; - /* Adjust for radio ramp-up */ - rx_time -= BLE_PHY_T_RXENFAST; - /* Start listening a bit earlier due to allowed active clock accuracy */ - rx_time -= 2; - - NRF_TIMER0->CC[0] = rx_time; - NRF_TIMER0->EVENTS_COMPARE[0] = 0; - NRF_PPI->CHENSET = PPI_CHEN_CH21_Msk; - } else { - /* - * XXX: not sure we need to stop the timer here all the time. Or that - * it should be stopped here. - */ - NRF_TIMER0->TASKS_STOP = 1; - NRF_TIMER0->TASKS_SHUTDOWN = 1; - NRF_PPI->CHENCLR = PPI_CHEN_CH4_Msk | PPI_CHEN_CH5_Msk | - PPI_CHEN_CH20_Msk | PPI_CHEN_CH31_Msk; - assert(transition == BLE_PHY_TRANSITION_NONE); - } -} - -static inline uint8_t -ble_phy_get_cur_rx_phy_mode(void) -{ - uint8_t phy; - - phy = g_ble_phy_data.phy_cur_phy_mode; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY) - /* - * For Coded PHY mode can be set to either codings since actual coding is - * set in packet header. However, here we need actual coding of received - * packet as this determines pipeline delays so need to figure this out - * using CI field. - */ - if ((phy == BLE_PHY_MODE_CODED_125KBPS) || - (phy == BLE_PHY_MODE_CODED_500KBPS)) { - phy = NRF_RADIO->PDUSTAT & RADIO_PDUSTAT_CISTAT_Msk ? - BLE_PHY_MODE_CODED_500KBPS : - BLE_PHY_MODE_CODED_125KBPS; - } -#endif - - return phy; -} - -static void -ble_phy_rx_end_isr(void) -{ - int rc; - uint8_t *dptr; - uint8_t crcok; - uint32_t tx_time; - struct ble_mbuf_hdr *ble_hdr; - - /* Clear events and clear interrupt */ - NRF_RADIO->EVENTS_END = 0; - NRF_RADIO->INTENCLR = RADIO_INTENCLR_END_Msk; - - /* Disable automatic RXEN */ - NRF_PPI->CHENCLR = PPI_CHEN_CH21_Msk; - - /* Set RSSI and CRC status flag in header */ - ble_hdr = &g_ble_phy_data.rxhdr; - assert(NRF_RADIO->EVENTS_RSSIEND != 0); - ble_hdr->rxinfo.rssi = (-1 * NRF_RADIO->RSSISAMPLE) + - g_ble_phy_data.rx_pwr_compensation; - - dptr = (uint8_t *)&g_ble_phy_rx_buf[0]; - dptr += 3; - - /* Count PHY crc errors and valid packets */ - crcok = NRF_RADIO->EVENTS_CRCOK; - if (!crcok) { - STATS_INC(ble_phy_stats, rx_crc_err); - } else { - STATS_INC(ble_phy_stats, rx_valid); - ble_hdr->rxinfo.flags |= BLE_MBUF_HDR_F_CRC_OK; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (g_ble_phy_data.phy_encrypted) { - /* Only set MIC failure flag if frame is not zero length */ - if ((dptr[1] != 0) && (NRF_CCM->MICSTATUS == 0)) { - ble_hdr->rxinfo.flags |= BLE_MBUF_HDR_F_MIC_FAILURE; - } - - /* - * XXX: not sure how to deal with this. This should not - * be a MIC failure but we should not hand it up. I guess - * this is just some form of rx error and that is how we - * handle it? For now, just set CRC error flags - */ - if (NRF_CCM->EVENTS_ERROR) { - STATS_INC(ble_phy_stats, rx_hw_err); - ble_hdr->rxinfo.flags &= ~BLE_MBUF_HDR_F_CRC_OK; - } - - /* - * XXX: This is a total hack work-around for now but I dont - * know what else to do. If ENDCRYPT is not set and we are - * encrypted we need to not trust this frame and drop it. - */ - if (NRF_CCM->EVENTS_ENDCRYPT == 0) { - STATS_INC(ble_phy_stats, rx_hw_err); - ble_hdr->rxinfo.flags &= ~BLE_MBUF_HDR_F_CRC_OK; - } - } -#endif - } - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - ble_phy_mode_apply(g_ble_phy_data.phy_tx_phy_mode); -#endif - - /* - * Let's schedule TX now and we will just cancel it after processing RXed - * packet if we don't need TX. - * - * We need this to initiate connection in case AUX_CONNECT_REQ was sent on - * LE Coded S8. In this case the time we process RXed packet is roughly the - * same as the limit when we need to have TX scheduled (i.e. TIMER0 and PPI - * armed) so we may simply miss the slot and set the timer in the past. - * - * When TX is scheduled in advance, we may event process packet a bit longer - * during radio ramp-up - this gives us extra 40 usecs which is more than - * enough. - */ - - /* Schedule TX exactly T_IFS after RX end captured in CC[2] */ - tx_time = NRF_TIMER0->CC[2] + BLE_LL_IFS; - /* Adjust for delay between actual RX end time and EVENT_END */ - tx_time -= g_ble_phy_t_rxenddelay[ble_hdr->rxinfo.phy_mode]; - /* Adjust for radio ramp-up */ - tx_time -= BLE_PHY_T_TXENFAST; - /* Adjust for delay between EVENT_READY and actual TX start time */ - tx_time -= g_ble_phy_t_txdelay[g_ble_phy_data.phy_cur_phy_mode]; - - NRF_TIMER0->CC[0] = tx_time; - NRF_TIMER0->EVENTS_COMPARE[0] = 0; - NRF_PPI->CHENSET = PPI_CHEN_CH20_Msk; - - /* - * XXX: Hack warning! - * - * It may happen (during flash erase) that CPU is stopped for a moment and - * TIMER0 already counted past CC[0]. In such case we will be stuck waiting - * for TX to start since EVENTS_COMPARE[0] will not happen any time soon. - * For now let's set a flag denoting that we are late in RX-TX transition so - * ble_phy_tx() will fail - this allows everything to cleanup nicely without - * the need for extra handling in many places. - * - * Note: CC[3] is used only for wfr which we do not need here. - */ - NRF_TIMER0->TASKS_CAPTURE[3] = 1; - if (NRF_TIMER0->CC[3] > NRF_TIMER0->CC[0]) { - NRF_PPI->CHENCLR = PPI_CHEN_CH20_Msk; - g_ble_phy_data.phy_transition_late = 1; - } - - /* - * XXX: This is a horrible ugly hack to deal with the RAM S1 byte - * that is not sent over the air but is present here. Simply move the - * data pointer to deal with it. Fix this later. - */ - dptr[2] = dptr[1]; - dptr[1] = dptr[0]; - rc = ble_ll_rx_end(dptr + 1, ble_hdr); - if (rc < 0) { - ble_phy_disable(); - } -} - -static bool -ble_phy_rx_start_isr(void) -{ - int rc; - uint32_t state; - uint32_t usecs; - uint32_t pdu_usecs; - uint32_t ticks; - struct ble_mbuf_hdr *ble_hdr; - uint8_t *dptr; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - int adva_offset; -#endif - - dptr = (uint8_t *)&g_ble_phy_rx_buf[0]; - - /* Clear events and clear interrupt */ - NRF_RADIO->EVENTS_ADDRESS = 0; - - /* Clear wfr timer channels and DISABLED interrupt */ - NRF_RADIO->INTENCLR = RADIO_INTENCLR_DISABLED_Msk | RADIO_INTENCLR_ADDRESS_Msk; - NRF_PPI->CHENCLR = PPI_CHEN_CH4_Msk | PPI_CHEN_CH5_Msk; - - /* Initialize the ble mbuf header */ - ble_hdr = &g_ble_phy_data.rxhdr; - ble_hdr->rxinfo.flags = ble_ll_state_get(); - ble_hdr->rxinfo.channel = g_ble_phy_data.phy_chan; - ble_hdr->rxinfo.handle = 0; - ble_hdr->rxinfo.phy = ble_phy_get_cur_phy(); - ble_hdr->rxinfo.phy_mode = ble_phy_get_cur_rx_phy_mode(); -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - ble_hdr->rxinfo.user_data = NULL; -#endif - - /* - * Calculate accurate packets start time (with remainder) - * - * We may start receiving packet somewhere during preamble in which case - * it is possible that actual transmission started before TIMER0 was - * running - need to take this into account. - */ - ble_hdr->beg_cputime = g_ble_phy_data.phy_start_cputime; - - usecs = NRF_TIMER0->CC[1]; - pdu_usecs = ble_phy_mode_pdu_start_off(ble_hdr->rxinfo.phy_mode) + - g_ble_phy_t_rxaddrdelay[ble_hdr->rxinfo.phy_mode]; - if (usecs < pdu_usecs) { - g_ble_phy_data.phy_start_cputime--; - usecs += 30; - } - usecs -= pdu_usecs; - - ticks = os_cputime_usecs_to_ticks(usecs); - usecs -= os_cputime_ticks_to_usecs(ticks); - if (usecs == 31) { - usecs = 0; - ++ticks; - } - - ble_hdr->beg_cputime += ticks; - ble_hdr->rem_usecs = usecs; - - /* XXX: I wonder if we always have the 1st byte. If we need to wait for - * rx chain delay, it could be 18 usecs from address interrupt. The - nrf52 may be able to get here early. */ - /* Wait to get 1st byte of frame */ - while (1) { - state = NRF_RADIO->STATE; - if (NRF_RADIO->EVENTS_BCMATCH != 0) { - break; - } - - /* - * If state is disabled, we should have the BCMATCH. If not, - * something is wrong! - */ - if (state == RADIO_STATE_STATE_Disabled) { - NRF_RADIO->INTENCLR = NRF_RADIO_IRQ_MASK_ALL; - NRF_RADIO->SHORTS = 0; - return false; - } - } - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - /* - * If privacy is enabled and received PDU has TxAdd bit set (i.e. random - * address) we try to resolve address using AAR. - */ - if (g_ble_phy_data.phy_privacy && (dptr[3] & 0x40)) { - /* - * AdvA is located at 4th octet in RX buffer (after S0, length an S1 - * fields). In case of extended advertising PDU we need to add 2 more - * octets for extended header. - */ - adva_offset = (dptr[3] & 0x0f) == 0x07 ? 2 : 0; - NRF_AAR->ADDRPTR = (uint32_t)(dptr + 3 + adva_offset); - - /* Trigger AAR after last bit of AdvA is received */ - NRF_RADIO->EVENTS_BCMATCH = 0; - NRF_PPI->CHENSET = PPI_CHEN_CH23_Msk; - NRF_RADIO->BCC = (BLE_LL_PDU_HDR_LEN + adva_offset + BLE_DEV_ADDR_LEN) * 8 + - g_ble_phy_data.phy_bcc_offset; - } -#endif - - /* Call Link Layer receive start function */ - rc = ble_ll_rx_start(dptr + 3, - g_ble_phy_data.phy_chan, - &g_ble_phy_data.rxhdr); - if (rc >= 0) { - /* Set rx started flag and enable rx end ISR */ - g_ble_phy_data.phy_rx_started = 1; - NRF_RADIO->INTENSET = RADIO_INTENSET_END_Msk; - } else { - /* Disable PHY */ - ble_phy_disable(); - STATS_INC(ble_phy_stats, rx_aborts); - } - - /* Count rx starts */ - STATS_INC(ble_phy_stats, rx_starts); - - return true; -} - -static void -ble_phy_isr(void) -{ - uint32_t irq_en; - - os_trace_isr_enter(); - - /* Read irq register to determine which interrupts are enabled */ - irq_en = NRF_RADIO->INTENCLR; - - /* - * NOTE: order of checking is important! Possible, if things get delayed, - * we have both an ADDRESS and DISABLED interrupt in rx state. If we get - * an address, we disable the DISABLED interrupt. - */ - - /* We get this if we have started to receive a frame */ - if ((irq_en & RADIO_INTENCLR_ADDRESS_Msk) && NRF_RADIO->EVENTS_ADDRESS) { - /* - * wfr timer is calculated to expire at the exact time we should start - * receiving a packet (with 1 usec precision) so it is possible it will - * fire at the same time as EVENT_ADDRESS. If this happens, radio will - * be disabled while we are waiting for EVENT_BCCMATCH after 1st byte - * of payload is received and ble_phy_rx_start_isr() will fail. In this - * case we should not clear DISABLED irq mask so it will be handled as - * regular radio disabled event below. In other case radio was disabled - * on purpose and there's nothing more to handle so we can clear mask. - */ - if (ble_phy_rx_start_isr()) { - irq_en &= ~RADIO_INTENCLR_DISABLED_Msk; - } - } - - /* Check for disabled event. This only happens for transmits now */ - if ((irq_en & RADIO_INTENCLR_DISABLED_Msk) && NRF_RADIO->EVENTS_DISABLED) { - if (g_ble_phy_data.phy_state == BLE_PHY_STATE_RX) { - NRF_RADIO->EVENTS_DISABLED = 0; - ble_ll_wfr_timer_exp(NULL); - } else if (g_ble_phy_data.phy_state == BLE_PHY_STATE_IDLE) { - assert(0); - } else { - ble_phy_tx_end_isr(); - } - } - - /* Receive packet end (we dont enable this for transmit) */ - if ((irq_en & RADIO_INTENCLR_END_Msk) && NRF_RADIO->EVENTS_END) { - ble_phy_rx_end_isr(); - } - - g_ble_phy_data.phy_transition_late = 0; - - /* Ensures IRQ is cleared */ - irq_en = NRF_RADIO->SHORTS; - - /* Count # of interrupts */ - STATS_INC(ble_phy_stats, phy_isrs); - - os_trace_isr_exit(); -} - -#if MYNEWT_VAL(BLE_PHY_DBG_TIME_TXRXEN_READY_PIN) >= 0 || \ - MYNEWT_VAL(BLE_PHY_DBG_TIME_ADDRESS_END_PIN) >= 0 || \ - MYNEWT_VAL(BLE_PHY_DBG_TIME_WFR_PIN) >= 0 -static inline void -ble_phy_dbg_time_setup_gpiote(int index, int pin) -{ - NRF_GPIO_Type *port; - -#if NRF52840_XXAA - port = pin > 31 ? NRF_P1 : NRF_P0; - pin &= 0x1f; -#else - port = NRF_P0; -#endif - - /* Configure GPIO directly to avoid dependency to hal_gpio (for porting) */ - port->DIRSET = (1 << pin); - port->OUTCLR = (1 << pin); - - NRF_GPIOTE->CONFIG[index] = - (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) | - ((pin & 0x1F) << GPIOTE_CONFIG_PSEL_Pos) | -#if NRF52840_XXAA - ((port == NRF_P1) << GPIOTE_CONFIG_PORT_Pos); -#else - 0; -#endif -} -#endif - -static void -ble_phy_dbg_time_setup(void) -{ - int gpiote_idx __attribute__((unused)) = 8; - - /* - * We setup GPIOTE starting from last configuration index to minimize risk - * of conflict with GPIO setup via hal. It's not great solution, but since - * this is just debugging code we can live with this. - */ - -#if MYNEWT_VAL(BLE_PHY_DBG_TIME_TXRXEN_READY_PIN) >= 0 - ble_phy_dbg_time_setup_gpiote(--gpiote_idx, - MYNEWT_VAL(BLE_PHY_DBG_TIME_TXRXEN_READY_PIN)); - - NRF_PPI->CH[17].EEP = (uint32_t)&(NRF_RADIO->EVENTS_READY); - NRF_PPI->CH[17].TEP = (uint32_t)&(NRF_GPIOTE->TASKS_CLR[gpiote_idx]); - NRF_PPI->CHENSET = PPI_CHEN_CH17_Msk; - - /* CH[20] and PPI CH[21] are on to trigger TASKS_TXEN or TASKS_RXEN */ - NRF_PPI->FORK[20].TEP = (uint32_t)&(NRF_GPIOTE->TASKS_SET[gpiote_idx]); - NRF_PPI->FORK[21].TEP = (uint32_t)&(NRF_GPIOTE->TASKS_SET[gpiote_idx]); -#endif - -#if MYNEWT_VAL(BLE_PHY_DBG_TIME_ADDRESS_END_PIN) >= 0 - ble_phy_dbg_time_setup_gpiote(--gpiote_idx, - MYNEWT_VAL(BLE_PHY_DBG_TIME_ADDRESS_END_PIN)); - - /* CH[26] and CH[27] are always on for EVENT_ADDRESS and EVENT_END */ - NRF_PPI->FORK[26].TEP = (uint32_t)&(NRF_GPIOTE->TASKS_SET[gpiote_idx]); - NRF_PPI->FORK[27].TEP = (uint32_t)&(NRF_GPIOTE->TASKS_CLR[gpiote_idx]); -#endif - -#if MYNEWT_VAL(BLE_PHY_DBG_TIME_WFR_PIN) >= 0 - ble_phy_dbg_time_setup_gpiote(--gpiote_idx, - MYNEWT_VAL(BLE_PHY_DBG_TIME_WFR_PIN)); - -#if NRF52840_XXAA - NRF_PPI->CH[18].EEP = (uint32_t)&(NRF_RADIO->EVENTS_RXREADY); -#else - NRF_PPI->CH[18].EEP = (uint32_t)&(NRF_RADIO->EVENTS_READY); -#endif - NRF_PPI->CH[18].TEP = (uint32_t)&(NRF_GPIOTE->TASKS_SET[gpiote_idx]); - NRF_PPI->CH[19].EEP = (uint32_t)&(NRF_RADIO->EVENTS_DISABLED); - NRF_PPI->CH[19].TEP = (uint32_t)&(NRF_GPIOTE->TASKS_CLR[gpiote_idx]); - NRF_PPI->CHENSET = PPI_CHEN_CH18_Msk | PPI_CHEN_CH19_Msk; - - /* CH[4] and CH[5] are always on for wfr */ - NRF_PPI->FORK[4].TEP = (uint32_t)&(NRF_GPIOTE->TASKS_CLR[gpiote_idx]); - NRF_PPI->FORK[5].TEP = (uint32_t)&(NRF_GPIOTE->TASKS_CLR[gpiote_idx]); -#endif -} - -/** - * ble phy init - * - * Initialize the PHY. - * - * @return int 0: success; PHY error code otherwise - */ -int -ble_phy_init(void) -{ - int rc; - - /* Default phy to use is 1M */ - g_ble_phy_data.phy_cur_phy_mode = BLE_PHY_MODE_1M; - g_ble_phy_data.phy_tx_phy_mode = BLE_PHY_MODE_1M; - g_ble_phy_data.phy_rx_phy_mode = BLE_PHY_MODE_1M; - - g_ble_phy_data.rx_pwr_compensation = 0; - - /* Set phy channel to an invalid channel so first set channel works */ - g_ble_phy_data.phy_chan = BLE_PHY_NUM_CHANS; - - /* Toggle peripheral power to reset (just in case) */ - NRF_RADIO->POWER = 0; - NRF_RADIO->POWER = 1; - - /* Disable all interrupts */ - NRF_RADIO->INTENCLR = NRF_RADIO_IRQ_MASK_ALL; - - /* Set configuration registers */ - NRF_RADIO->MODE = RADIO_MODE_MODE_Ble_1Mbit; - NRF_RADIO->PCNF0 = NRF_PCNF0; - - /* XXX: should maxlen be 251 for encryption? */ - NRF_RADIO->PCNF1 = NRF_MAXLEN | - (RADIO_PCNF1_ENDIAN_Little << RADIO_PCNF1_ENDIAN_Pos) | - (NRF_BALEN << RADIO_PCNF1_BALEN_Pos) | - RADIO_PCNF1_WHITEEN_Msk; - - /* Enable radio fast ramp-up */ - NRF_RADIO->MODECNF0 |= (RADIO_MODECNF0_RU_Fast << RADIO_MODECNF0_RU_Pos) & - RADIO_MODECNF0_RU_Msk; - - /* Set logical address 1 for TX and RX */ - NRF_RADIO->TXADDRESS = 0; - NRF_RADIO->RXADDRESSES = (1 << 0); - - /* Configure the CRC registers */ - NRF_RADIO->CRCCNF = (RADIO_CRCCNF_SKIPADDR_Skip << RADIO_CRCCNF_SKIPADDR_Pos) | RADIO_CRCCNF_LEN_Three; - - /* Configure BLE poly */ - NRF_RADIO->CRCPOLY = 0x0000065B; - - /* Configure IFS */ - NRF_RADIO->TIFS = BLE_LL_IFS; - - /* Captures tx/rx start in timer0 cc 1 and tx/rx end in timer0 cc 2 */ - NRF_PPI->CHENSET = PPI_CHEN_CH26_Msk | PPI_CHEN_CH27_Msk; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - NRF_CCM->INTENCLR = 0xffffffff; - NRF_CCM->SHORTS = CCM_SHORTS_ENDKSGEN_CRYPT_Msk; - NRF_CCM->EVENTS_ERROR = 0; - memset(g_nrf_encrypt_scratchpad, 0, sizeof(g_nrf_encrypt_scratchpad)); -#endif - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - g_ble_phy_data.phy_aar_scratch = 0; - NRF_AAR->IRKPTR = (uint32_t)&g_nrf_irk_list[0]; - NRF_AAR->INTENCLR = 0xffffffff; - NRF_AAR->EVENTS_END = 0; - NRF_AAR->EVENTS_RESOLVED = 0; - NRF_AAR->EVENTS_NOTRESOLVED = 0; - NRF_AAR->NIRK = 0; -#endif - - /* TIMER0 setup for PHY when using RTC */ - NRF_TIMER0->TASKS_STOP = 1; - NRF_TIMER0->TASKS_SHUTDOWN = 1; - NRF_TIMER0->BITMODE = 3; /* 32-bit timer */ - NRF_TIMER0->MODE = 0; /* Timer mode */ - NRF_TIMER0->PRESCALER = 4; /* gives us 1 MHz */ - - /* - * PPI setup. - * Channel 4: Captures TIMER0 in CC[3] when EVENTS_ADDRESS occurs. Used - * to cancel the wait for response timer. - * Channel 5: TIMER0 CC[3] to TASKS_DISABLE on radio. This is the wait - * for response timer. - */ - NRF_PPI->CH[4].EEP = (uint32_t)&(NRF_RADIO->EVENTS_ADDRESS); - NRF_PPI->CH[4].TEP = (uint32_t)&(NRF_TIMER0->TASKS_CAPTURE[3]); - NRF_PPI->CH[5].EEP = (uint32_t)&(NRF_TIMER0->EVENTS_COMPARE[3]); - NRF_PPI->CH[5].TEP = (uint32_t)&(NRF_RADIO->TASKS_DISABLE); - - /* Set isr in vector table and enable interrupt */ -#ifndef RIOT_VERSION - NVIC_SetPriority(RADIO_IRQn, 0); -#endif -#if MYNEWT - NVIC_SetVector(RADIO_IRQn, (uint32_t)ble_phy_isr); -#else - ble_npl_hw_set_isr(RADIO_IRQn, ble_phy_isr); -#endif - NVIC_EnableIRQ(RADIO_IRQn); - - /* Register phy statistics */ - if (!g_ble_phy_data.phy_stats_initialized) { - rc = stats_init_and_reg(STATS_HDR(ble_phy_stats), - STATS_SIZE_INIT_PARMS(ble_phy_stats, - STATS_SIZE_32), - STATS_NAME_INIT_PARMS(ble_phy_stats), - "ble_phy"); - assert(rc == 0); - - g_ble_phy_data.phy_stats_initialized = 1; - } - - ble_phy_dbg_time_setup(); - - return 0; -} - -/** - * Puts the phy into receive mode. - * - * @return int 0: success; BLE Phy error code otherwise - */ -int -ble_phy_rx(void) -{ - /* - * Check radio state. - * - * In case radio is now disabling we'll wait for it to finish, but if for - * any reason it's just in idle state we proceed with RX as usual since - * nRF52 radio can ramp-up from idle state as well. - * - * Note that TX and RX states values are the same except for 3rd bit so we - * can make a shortcut here when checking for idle state. - */ - nrf_wait_disabled(); - if ((NRF_RADIO->STATE != RADIO_STATE_STATE_Disabled) && - ((NRF_RADIO->STATE & 0x07) != RADIO_STATE_STATE_RxIdle)) { - ble_phy_disable(); - STATS_INC(ble_phy_stats, radio_state_errs); - return BLE_PHY_ERR_RADIO_STATE; - } - - /* Make sure all interrupts are disabled */ - NRF_RADIO->INTENCLR = NRF_RADIO_IRQ_MASK_ALL; - - /* Clear events prior to enabling receive */ - NRF_RADIO->EVENTS_END = 0; - NRF_RADIO->EVENTS_DISABLED = 0; - - /* Setup for rx */ - ble_phy_rx_xcvr_setup(); - - /* PPI to start radio automatically shall be set here */ - assert(NRF_PPI->CHEN & PPI_CHEN_CH21_Msk); - - return 0; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) -/** - * Called to enable encryption at the PHY. Note that this state will persist - * in the PHY; in other words, if you call this function you have to call - * disable so that future PHY transmits/receives will not be encrypted. - * - * @param pkt_counter - * @param iv - * @param key - * @param is_master - */ -void -ble_phy_encrypt_enable(uint64_t pkt_counter, uint8_t *iv, uint8_t *key, - uint8_t is_master) -{ - memcpy(g_nrf_ccm_data.key, key, 16); - g_nrf_ccm_data.pkt_counter = pkt_counter; - memcpy(g_nrf_ccm_data.iv, iv, 8); - g_nrf_ccm_data.dir_bit = is_master; - g_ble_phy_data.phy_encrypted = 1; - /* Enable the module (AAR cannot be on while CCM on) */ - NRF_AAR->ENABLE = AAR_ENABLE_ENABLE_Disabled; - NRF_CCM->ENABLE = CCM_ENABLE_ENABLE_Enabled; -} - -void -ble_phy_encrypt_set_pkt_cntr(uint64_t pkt_counter, int dir) -{ - g_nrf_ccm_data.pkt_counter = pkt_counter; - g_nrf_ccm_data.dir_bit = dir; -} - -void -ble_phy_encrypt_disable(void) -{ - NRF_PPI->CHENCLR = PPI_CHEN_CH25_Msk; - NRF_CCM->TASKS_STOP = 1; - NRF_CCM->EVENTS_ERROR = 0; - NRF_CCM->ENABLE = CCM_ENABLE_ENABLE_Disabled; - - g_ble_phy_data.phy_encrypted = 0; -} -#endif - -void -ble_phy_set_txend_cb(ble_phy_tx_end_func txend_cb, void *arg) -{ - /* Set transmit end callback and arg */ - g_ble_phy_data.txend_cb = txend_cb; - g_ble_phy_data.txend_arg = arg; -} - -/** - * Called to set the start time of a transmission. - * - * This function is called to set the start time when we are not going from - * rx to tx automatically. - * - * NOTE: care must be taken when calling this function. The channel should - * already be set. - * - * @param cputime This is the tick at which the 1st bit of the preamble - * should be transmitted - * @param rem_usecs This is used only when the underlying timing uses a 32.768 - * kHz crystal. It is the # of usecs from the cputime tick - * at which the first bit of the preamble should be - * transmitted. - * @return int - */ -int -ble_phy_tx_set_start_time(uint32_t cputime, uint8_t rem_usecs) -{ - int rc; - - ble_phy_trace_u32x2(BLE_PHY_TRACE_ID_START_TX, cputime, rem_usecs); - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - ble_phy_mode_apply(g_ble_phy_data.phy_tx_phy_mode); -#endif - - /* XXX: This should not be necessary, but paranoia is good! */ - /* Clear timer0 compare to RXEN since we are transmitting */ - NRF_PPI->CHENCLR = PPI_CHEN_CH21_Msk; - - if (ble_phy_set_start_time(cputime, rem_usecs, true) != 0) { - STATS_INC(ble_phy_stats, tx_late); - ble_phy_disable(); - rc = BLE_PHY_ERR_TX_LATE; - } else { - /* Enable PPI to automatically start TXEN */ - NRF_PPI->CHENSET = PPI_CHEN_CH20_Msk; - rc = 0; - } - return rc; -} - -/** - * Called to set the start time of a reception - * - * This function acts a bit differently than transmit. If we are late getting - * here we will still attempt to receive. - * - * NOTE: care must be taken when calling this function. The channel should - * already be set. - * - * @param cputime - * - * @return int - */ -int -ble_phy_rx_set_start_time(uint32_t cputime, uint8_t rem_usecs) -{ - bool late = false; - int rc = 0; - - ble_phy_trace_u32x2(BLE_PHY_TRACE_ID_START_RX, cputime, rem_usecs); - -#if (BLE_LL_BT5_PHY_SUPPORTED == 1) - ble_phy_mode_apply(g_ble_phy_data.phy_rx_phy_mode); -#endif - - /* XXX: This should not be necessary, but paranoia is good! */ - /* Clear timer0 compare to TXEN since we are transmitting */ - NRF_PPI->CHENCLR = PPI_CHEN_CH20_Msk; - - if (ble_phy_set_start_time(cputime, rem_usecs, false) != 0) { - STATS_INC(ble_phy_stats, rx_late); - - /* We're late so let's just try to start RX as soon as possible */ - ble_phy_set_start_now(); - - late = true; - } - - /* Enable PPI to automatically start RXEN */ - NRF_PPI->CHENSET = PPI_CHEN_CH21_Msk; - - /* Start rx */ - rc = ble_phy_rx(); - - /* - * If we enabled receiver but were late, let's return proper error code so - * caller can handle this. - */ - if (!rc && late) { - rc = BLE_PHY_ERR_RX_LATE; - } - - return rc; -} - -int -ble_phy_tx(ble_phy_tx_pducb_t pducb, void *pducb_arg, uint8_t end_trans) -{ - int rc; - uint8_t *dptr; - uint8_t *pktptr; - uint8_t payload_len; - uint8_t hdr_byte; - uint32_t state; - uint32_t shortcuts; - - if (g_ble_phy_data.phy_transition_late) { - ble_phy_disable(); - STATS_INC(ble_phy_stats, tx_late); - return BLE_PHY_ERR_TX_LATE; - } - - /* - * This check is to make sure that the radio is not in a state where - * it is moving to disabled state. If so, let it get there. - */ - nrf_wait_disabled(); - - /* - * XXX: Although we may not have to do this here, I clear all the PPI - * that should not be used when transmitting. Some of them are only enabled - * if encryption and/or privacy is on, but I dont care. Better to be - * paranoid, and if you are going to clear one, might as well clear them - * all. - */ - NRF_PPI->CHENCLR = PPI_CHEN_CH4_Msk | PPI_CHEN_CH5_Msk | PPI_CHEN_CH23_Msk | - PPI_CHEN_CH25_Msk; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - if (g_ble_phy_data.phy_encrypted) { - dptr = (uint8_t *)&g_ble_phy_enc_buf[0]; - pktptr = (uint8_t *)&g_ble_phy_tx_buf[0]; - NRF_CCM->SHORTS = CCM_SHORTS_ENDKSGEN_CRYPT_Msk; - NRF_CCM->INPTR = (uint32_t)dptr; - NRF_CCM->OUTPTR = (uint32_t)pktptr; - NRF_CCM->SCRATCHPTR = (uint32_t)&g_nrf_encrypt_scratchpad[0]; - NRF_CCM->EVENTS_ERROR = 0; - NRF_CCM->MODE = CCM_MODE_LENGTH_Msk | ble_phy_get_ccm_datarate(); - NRF_CCM->CNFPTR = (uint32_t)&g_nrf_ccm_data; - } else { -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) - NRF_AAR->IRKPTR = (uint32_t)&g_nrf_irk_list[0]; -#endif - dptr = (uint8_t *)&g_ble_phy_tx_buf[0]; - pktptr = dptr; - } -#else - dptr = (uint8_t *)&g_ble_phy_tx_buf[0]; - pktptr = dptr; -#endif - - /* Set PDU payload */ - payload_len = pducb(&dptr[3], pducb_arg, &hdr_byte); - - /* RAM representation has S0, LENGTH and S1 fields. (3 bytes) */ - dptr[0] = hdr_byte; - dptr[1] = payload_len; - dptr[2] = 0; - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) - /* Start key-stream generation and encryption (via short) */ - if (g_ble_phy_data.phy_encrypted) { - NRF_CCM->TASKS_KSGEN = 1; - } -#endif - - NRF_RADIO->PACKETPTR = (uint32_t)pktptr; - - /* Clear the ready, end and disabled events */ - NRF_RADIO->EVENTS_READY = 0; - NRF_RADIO->EVENTS_END = 0; - NRF_RADIO->EVENTS_DISABLED = 0; - - /* Enable shortcuts for transmit start/end. */ - shortcuts = RADIO_SHORTS_END_DISABLE_Msk | RADIO_SHORTS_READY_START_Msk; - NRF_RADIO->SHORTS = shortcuts; - NRF_RADIO->INTENSET = RADIO_INTENSET_DISABLED_Msk; - - /* Set the PHY transition */ - g_ble_phy_data.phy_transition = end_trans; - - /* Set transmitted payload length */ - g_ble_phy_data.phy_tx_pyld_len = payload_len; - - /* If we already started transmitting, abort it! */ - state = NRF_RADIO->STATE; - if (state != RADIO_STATE_STATE_Tx) { - /* Set phy state to transmitting and count packet statistics */ - g_ble_phy_data.phy_state = BLE_PHY_STATE_TX; - STATS_INC(ble_phy_stats, tx_good); - STATS_INCN(ble_phy_stats, tx_bytes, payload_len + BLE_LL_PDU_HDR_LEN); - rc = BLE_ERR_SUCCESS; - } else { - ble_phy_disable(); - STATS_INC(ble_phy_stats, tx_late); - rc = BLE_PHY_ERR_RADIO_STATE; - } - - return rc; -} - -/** - * ble phy txpwr set - * - * Set the transmit output power (in dBm). - * - * NOTE: If the output power specified is within the BLE limits but outside - * the chip limits, we "rail" the power level so we dont exceed the min/max - * chip values. - * - * @param dbm Power output in dBm. - * - * @return int 0: success; anything else is an error - */ -int -ble_phy_txpwr_set(int dbm) -{ - /* "Rail" power level if outside supported range */ - dbm = ble_phy_txpower_round(dbm); - - NRF_RADIO->TXPOWER = dbm; - g_ble_phy_data.phy_txpwr_dbm = dbm; - - return 0; -} - -/** - * ble phy txpwr round - * - * Get the rounded transmit output power (in dBm). - * - * @param dbm Power output in dBm. - * - * @return int Rounded power in dBm - */ -int ble_phy_txpower_round(int dbm) -{ - /* TODO this should be per nRF52XXX */ - - /* "Rail" power level if outside supported range */ - if (dbm >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) { - return (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm; - } - - if (dbm >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) { - return (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm; - } - - if (dbm >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) { - return (int8_t)RADIO_TXPOWER_TXPOWER_0dBm; - } - - if (dbm >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) { - return (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm; - } - - if (dbm >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) { - return (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm; - } - - if (dbm >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) { - return (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm; - } - - if (dbm >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) { - return (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm; - } - - return (int8_t)RADIO_TXPOWER_TXPOWER_Neg40dBm; -} - -/** - * ble phy set access addr - * - * Set access address. - * - * @param access_addr Access address - * - * @return int 0: success; PHY error code otherwise - */ -static int -ble_phy_set_access_addr(uint32_t access_addr) -{ - NRF_RADIO->BASE0 = (access_addr << 8); - NRF_RADIO->PREFIX0 = (NRF_RADIO->PREFIX0 & 0xFFFFFF00) | (access_addr >> 24); - - g_ble_phy_data.phy_access_address = access_addr; - - ble_phy_apply_errata_102_106_107(); - - return 0; -} - -/** - * ble phy txpwr get - * - * Get the transmit power. - * - * @return int The current PHY transmit power, in dBm - */ -int -ble_phy_txpwr_get(void) -{ - return g_ble_phy_data.phy_txpwr_dbm; -} - -void -ble_phy_set_rx_pwr_compensation(int8_t compensation) -{ - g_ble_phy_data.rx_pwr_compensation = compensation; -} - -/** - * ble phy setchan - * - * Sets the logical frequency of the transceiver. The input parameter is the - * BLE channel index (0 to 39, inclusive). The NRF frequency register works like - * this: logical frequency = 2400 + FREQ (MHz). - * - * Thus, to get a logical frequency of 2402 MHz, you would program the - * FREQUENCY register to 2. - * - * @param chan This is the Data Channel Index or Advertising Channel index - * - * @return int 0: success; PHY error code otherwise - */ -int -ble_phy_setchan(uint8_t chan, uint32_t access_addr, uint32_t crcinit) -{ - assert(chan < BLE_PHY_NUM_CHANS); - - /* Check for valid channel range */ - if (chan >= BLE_PHY_NUM_CHANS) { - return BLE_PHY_ERR_INV_PARAM; - } - - /* Set current access address */ - ble_phy_set_access_addr(access_addr); - - /* Configure crcinit */ - NRF_RADIO->CRCINIT = crcinit; - - /* Set the frequency and the data whitening initial value */ - g_ble_phy_data.phy_chan = chan; - NRF_RADIO->FREQUENCY = g_ble_phy_chan_freq[chan]; - NRF_RADIO->DATAWHITEIV = chan; - - return 0; -} - -/** - * Stop the timer used to count microseconds when using RTC for cputime - */ -static void -ble_phy_stop_usec_timer(void) -{ - NRF_TIMER0->TASKS_STOP = 1; - NRF_TIMER0->TASKS_SHUTDOWN = 1; - NRF_RTC0->EVTENCLR = RTC_EVTENSET_COMPARE0_Msk; -} - -/** - * ble phy disable irq and ppi - * - * This routine is to be called when reception was stopped due to either a - * wait for response timeout or a packet being received and the phy is to be - * restarted in receive mode. Generally, the disable routine is called to stop - * the phy. - */ -static void -ble_phy_disable_irq_and_ppi(void) -{ - NRF_RADIO->INTENCLR = NRF_RADIO_IRQ_MASK_ALL; - NRF_RADIO->SHORTS = 0; - NRF_RADIO->TASKS_DISABLE = 1; - NRF_PPI->CHENCLR = PPI_CHEN_CH4_Msk | PPI_CHEN_CH5_Msk | PPI_CHEN_CH20_Msk | - PPI_CHEN_CH21_Msk | PPI_CHEN_CH23_Msk | - PPI_CHEN_CH25_Msk | PPI_CHEN_CH31_Msk; - NVIC_ClearPendingIRQ(RADIO_IRQn); - g_ble_phy_data.phy_state = BLE_PHY_STATE_IDLE; -} - -void -ble_phy_restart_rx(void) -{ - ble_phy_stop_usec_timer(); - ble_phy_disable_irq_and_ppi(); - - ble_phy_set_start_now(); - /* Enable PPI to automatically start RXEN */ - NRF_PPI->CHENSET = PPI_CHEN_CH21_Msk; - - ble_phy_rx(); -} - -/** - * ble phy disable - * - * Disables the PHY. This should be called when an event is over. It stops - * the usec timer (if used), disables interrupts, disables the RADIO, disables - * PPI and sets state to idle. - */ -void -ble_phy_disable(void) -{ - ble_phy_trace_void(BLE_PHY_TRACE_ID_DISABLE); - - ble_phy_stop_usec_timer(); - ble_phy_disable_irq_and_ppi(); -} - -/* Gets the current access address */ -uint32_t ble_phy_access_addr_get(void) -{ - return g_ble_phy_data.phy_access_address; -} - -/** - * Return the phy state - * - * @return int The current PHY state. - */ -int -ble_phy_state_get(void) -{ - return g_ble_phy_data.phy_state; -} - -/** - * Called to see if a reception has started - * - * @return int - */ -int -ble_phy_rx_started(void) -{ - return g_ble_phy_data.phy_rx_started; -} - -/** - * Return the transceiver state - * - * @return int transceiver state. - */ -uint8_t -ble_phy_xcvr_state_get(void) -{ - uint32_t state; - state = NRF_RADIO->STATE; - return (uint8_t)state; -} - -/** - * Called to return the maximum data pdu payload length supported by the - * phy. For this chip, if encryption is enabled, the maximum payload is 27 - * bytes. - * - * @return uint8_t Maximum data channel PDU payload size supported - */ -uint8_t -ble_phy_max_data_pdu_pyld(void) -{ - return BLE_LL_DATA_PDU_MAX_PYLD; -} - -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) -void -ble_phy_resolv_list_enable(void) -{ - NRF_AAR->NIRK = (uint32_t)g_nrf_num_irks; - g_ble_phy_data.phy_privacy = 1; -} - -void -ble_phy_resolv_list_disable(void) -{ - g_ble_phy_data.phy_privacy = 0; -} -#endif - -#if MYNEWT_VAL(BLE_LL_DTM) -void ble_phy_enable_dtm(void) -{ - /* When DTM is enabled we need to disable whitening as per - * Bluetooth v5.0 Vol 6. Part F. 4.1.1 - */ - NRF_RADIO->PCNF1 &= ~RADIO_PCNF1_WHITEEN_Msk; -} - -void ble_phy_disable_dtm(void) -{ - /* Enable whitening */ - NRF_RADIO->PCNF1 |= RADIO_PCNF1_WHITEEN_Msk; -} -#endif - -void -ble_phy_rfclk_enable(void) -{ -#if MYNEWT - nrf52_clock_hfxo_request(); -#else - NRF_CLOCK->TASKS_HFCLKSTART = 1; -#endif -} - -void -ble_phy_rfclk_disable(void) -{ -#if MYNEWT - nrf52_clock_hfxo_release(); -#else - NRF_CLOCK->TASKS_HFCLKSTOP = 1; -#endif -} - -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/src/ble_phy_trace.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/src/ble_phy_trace.c deleted file mode 100644 index 84dbf4def..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/src/ble_phy_trace.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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. - */ - -#if defined(ARDUINO_ARCH_NRF5) && defined(NRF52_SERIES) - -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/os/os_trace_api.h" - -#if MYNEWT_VAL(BLE_PHY_SYSVIEW) - -static os_trace_module_t g_ble_phy_trace_mod; -uint32_t ble_phy_trace_off; - -static void -ble_phy_trace_module_send_desc(void) -{ - os_trace_module_desc(&g_ble_phy_trace_mod, "0 phy_set_tx cputime=%u usecs=%u"); - os_trace_module_desc(&g_ble_phy_trace_mod, "1 phy_set_rx cputime=%u usecs=%u"); - os_trace_module_desc(&g_ble_phy_trace_mod, "2 phy_disable"); -} - -void -ble_phy_trace_init(void) -{ - ble_phy_trace_off = - os_trace_module_register(&g_ble_phy_trace_mod, "ble_phy", 3, - ble_phy_trace_module_send_desc); -} -#endif -#endif \ No newline at end of file diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/syscfg.yml deleted file mode 100644 index ce5123721..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/drivers/nrf52/syscfg.yml +++ /dev/null @@ -1,75 +0,0 @@ -# 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. -# - -syscfg.defs: - BLE_PHY_SYSVIEW: - description: > - Enable SystemView tracing module for radio driver. - value: 0 - - BLE_PHY_CODED_RX_IFS_EXTRA_MARGIN: - description: > - This defines additional margin for T_IFS tolerance while in - RX on coded phy to allow maintaining connections with some - controllers that exceed proper T_IFS (150 usecs) by more - than allowed 2 usecs. - This value shall be only used for debugging purposes. It is - strongly recommended to keep this settings at default value - to ensure compliance with specification. - value: 0 - BLE_PHY_DBG_TIME_TXRXEN_READY_PIN: - description: > - When set to proper GPIO pin number, this pin will be set - to high state when radio is enabled using PPI channels - 20 or 21 and back to low state on radio EVENTS_READY. - This can be used to measure radio ram-up time. - value: -1 - - BLE_PHY_DBG_TIME_ADDRESS_END_PIN: - description: > - When set to proper GPIO pin number, this pin will be set - to high state on radio EVENTS_ADDRESS and back to low state - on radio EVENTS_END. - This can be used to measure radio pipeline delays. - value: -1 - - BLE_PHY_DBG_TIME_WFR_PIN: - description: > - When set to proper GPIO pin number, this pin will be set - to high state on radio EVENTS_RXREADY and back to low - state when wfr timer expires. - This can be used to check if wfr is calculated properly. - value: -1 - - BLE_PHY_NRF52840_ERRATA_164: - description: > - Enable workaround for anomaly 164 found in nRF52840. - "[164] RADIO: Low selectivity in long range mode" - This shall be only enabled for: - - nRF52840 Engineering A - value: 0 - - BLE_PHY_NRF52840_ERRATA_191: - description: > - Enable workaround for anomaly 191 found in nRF52840. - "[191] RADIO: High packet error rate in BLE Long Range mode" - This shall be only enabled for: - - nRF52840 Engineering B - - nRF52840 Engineering C - - nRF52840 Rev 1 (final silicon) - value: 1 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/pkg.yml deleted file mode 100644 index 44cc0c732..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/pkg.yml +++ /dev/null @@ -1,49 +0,0 @@ -# -# 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. -# - -pkg.name: nimble/host/mesh -pkg.description: Bluetooth Mesh -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - - mesh - -pkg.deps: - - "@apache-mynewt-core/kernel/os" - - "@apache-mynewt-core/util/mem" - - "@apache-mynewt-core/crypto/tinycrypt" - - nimble - - nimble/host - -pkg.deps.BLE_MESH_SHELL: - - "@apache-mynewt-core/sys/shell" - -pkg.deps.BLE_MESH_SETTINGS: - - "@apache-mynewt-core/encoding/base64" - - "@apache-mynewt-core/sys/config" - -pkg.req_apis: - - log - - stats - -pkg.init: - bt_mesh_register_gatt: 'MYNEWT_VAL(BLE_MESH_SYSINIT_STAGE)' - ble_mesh_shell_init: 'MYNEWT_VAL(BLE_MESH_SYSINIT_STAGE_SHELL)' diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/syscfg.yml deleted file mode 100644 index 98632232b..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/mesh/syscfg.yml +++ /dev/null @@ -1,661 +0,0 @@ -# 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. -# - -syscfg.defs: - BLE_MESH_PROV: - description: > - Enable provisioning. It is automatically enabled whenever - BLE_MESH_PB_ADV or BLE_MESH_PB_GATT is set. - value: 1 - - BLE_MESH_PB_ADV: - description: > - Enable this option to allow the device to be provisioned over - the advertising bearer. - value: 1 - - BLE_MESH_PROVISIONER: - description: > - Enable this option to have support for provisioning remote devices. - value: 0 - restrictions: - - (BLE_MESH_PROV) - - BLE_MESH_NODE_COUNT: - description: > - This option specifies how many nodes each network can at most - save in the provisioning database. Range 1-4096 - value: 1 - - BLE_MESH_PROXY: - description: > - Enable proxy. This is automatically set whenever BLE_MESH_PB_GATT or - BLE_MESH_GATT_PROXY is set. - value: 0 - - BLE_MESH_PB_GATT: - description: > - Enable this option to allow the device to be provisioned over - the GATT bearer. - value: 1 - - BLE_MESH_GATT_PROXY: - description: > - This option enables support for the Mesh GATT Proxy Service, - i.e. the ability to act as a proxy between a Mesh GATT Client - and a Mesh network. - value: 1 - - BLE_MESH_NODE_ID_TIMEOUT: - description: > - This option determines for how long the local node advertises - using Node Identity. The given value is in seconds. The - specification limits this to 60 seconds, and implies that to - be the appropriate value as well, so just leaving this as the - default is the safest option. - value: 60 - - BLE_MESH_PROXY_FILTER_SIZE: - descryption: > - This option specifies how many Proxy Filter entries the local - node supports. - value: 1 - - BLE_MESH_SUBNET_COUNT: - description: > - This option specifies how many subnets a Mesh network can - participate in at the same time. - value: 1 - - BLE_MESH_APP_KEY_COUNT: - description: > - This option specifies how many application keys the device can - store per network. - value: 1 - - BLE_MESH_MODEL_KEY_COUNT: - description: > - This option specifies how many application keys each model can - at most be bound to. - value: 1 - - BLE_MESH_MODEL_GROUP_COUNT: - description: > - This option specifies how many group addresses each model can - at most be subscribed to. - value: 1 - - BLE_MESH_LABEL_COUNT: - description: > - This option specifies how many Label UUIDs can be stored. - value: 1 - - BLE_MESH_CRPL: - description: > - This options specifies the maximum capacity of the replay - protection list. This option is similar to the network message - cache size, but has a different purpose. - value: 10 - - BLE_MESH_ADV_TASK_PRIO: - description: > - Advertising task prio (FIXME) - type: task_priority - value: 9 - - BLE_MESH_MSG_CACHE_SIZE: - description: > - Number of messages that are cached for the network. This description - prevent unnecessary decryption operations and unnecessary - relays. This option is similar to the replay protection list, - but has a different purpose. - value: 10 - - BLE_MESH_ADV_BUF_COUNT: - description: > - Number of advertising buffers available. This should be chosen - based on what kind of features the local node shoule have. E.g. - a relay will perform better the more buffers it has. Another - thing to consider is outgoing segmented messages. There must - be at least three more advertising buffers than the maximum - supported outgoing segment count (BT_MESH_TX_SEG_MAX). - value: 6 - - BLE_MESH_IVU_DIVIDER: - description: > - When the IV Update state enters Normal operation or IV Update - in Progress, we need to keep track of how many hours has passed - in the state, since the specification requires us to remain in - the state at least for 96 hours (Update in Progress has an - additional upper limit of 144 hours). - - In order to fulfil the above requirement, even if the node might - be powered off once in a while, we need to store persistently - how many hours the node has been in the state. This doesn't - necessarily need to happen every hour (thanks to the flexible - duration range). The exact cadence will depend a lot on the - ways that the node will be used and what kind of power source it - has. - - Since there is no single optimal answer, this configuration - option allows specifying a divider, i.e. how many intervals - the 96 hour minimum gets split into. After each interval the - duration that the node has been in the current state gets - stored to flash. E.g. the default value of 4 means that the - state is saved every 24 hours (96 / 4). - value: 4 - - BLE_MESH_TX_SEG_MSG_COUNT: - description: > - Maximum number of simultaneous outgoing multi-segment and/or - reliable messages. - value: 4 - - BLE_MESH_RX_SEG_MSG_COUNT: - description: > - Maximum number of simultaneous incoming multi-segment and/or - reliable messages. - value: 2 - - BLE_MESH_RX_SDU_MAX: - description: > - Maximum incoming Upper Transport Access PDU length. This - determines also how many segments incoming segmented messages - can have. Each segment can contain 12 bytes, so this value should - be set to a multiple of 12 to avoid wasted memory. The minimum - requirement is 2 segments (24 bytes) whereas the maximum supported - by the Mesh specification is 32 segments (384 bytes). - value: 72 - - BLE_MESH_TX_SEG_MAX: - description: > - Maximum number of segments supported for outgoing messages. - This value should typically be fine-tuned based on what - models the local node supports, i.e. what's the largest - message payload that the node needs to be able to send. - This value affects memory and call stack consumption, which - is why the default is lower than the maximum that the - specification would allow (32 segments). - - The maximum outgoing SDU size is 12 times this number (out of - which 4 or 8 bytes is used for the Transport Layer MIC). For - example, 5 segments means the maximum SDU size is 60 bytes, - which leaves 56 bytes for application layer data using a - 4-byte MIC and 52 bytes using an 8-byte MIC. - - Be sure to specify a sufficient number of advertising buffers - when setting this option to a higher value. There must be at - least three more advertising buffers (BT_MESH_ADV_BUF_COUNT) - as there are outgoing segments. - value: 3 - - BLE_MESH_SEG_RETRANSMIT_ATTEMPTS: - description: > - Number of retransmit attempts (after the initial transmit) per segment - value: 4 - retrictions: 'BLE_MESH_SEG_RETRANSMIT_ATTEMPTS > 1' - - BLE_MESH_RELAY: - description: > - Support for acting as a Mesh Relay Node. - value: 0 - - BLE_MESH_LOW_POWER: - description: > - Enable this option to be able to act as a Low Power Node. - value: 0 - - BLE_MESH_LPN_ESTABLISHMENT: - description: > - Perform the Friendship establishment using low power, with - the help of a reduced scan duty cycle. The downside of this - is that the node may miss out on messages intended for it - until it has successfully set up Friendship with a Friend - node. - value: 1 - - BLE_MESH_LPN_AUTO: - description: > - Automatically enable LPN functionality once provisioned and start - looking for Friend nodes. If this option is disabled LPN mode - needs to be manually enabled by calling bt_mesh_lpn_set(true). - node. - value: 1 - - BLE_MESH_LPN_AUTO_TIMEOUT: - description: > - Time in seconds from the last received message, that the node - will wait before starting to look for Friend nodes. - value: 15 - - BLE_MESH_LPN_RETRY_TIMEOUT: - description: > - Time in seconds between Friend Requests, if a previous Friend - Request did not receive any acceptable Friend Offers. - value: 8 - - BLE_MESH_LPN_RSSI_FACTOR: - description: > - The contribution of the RSSI measured by the Friend node used - in Friend Offer Delay calculations. 0 = 1, 1 = 1.5, 2 = 2, 3 = 2.5. - value: 0 - - BLE_MESH_LPN_RECV_WIN_FACTOR: - description: > - The contribution of the supported Receive Window used in - Friend Offer Delay calculations. 0 = 1, 1 = 1.5, 2 = 2, 3 = 2.5. - value: 0 - - BLE_MESH_LPN_MIN_QUEUE_SIZE: - description: > - The MinQueueSizeLog field is defined as log_2(N), where N is - the minimum number of maximum size Lower Transport PDUs that - the Friend node can store in its Friend Queue. As an example, - MinQueueSizeLog value 1 gives N = 2, and value 7 gives N = 128. - value: 1 - - BLE_MESH_LPN_RECV_DELAY: - description: > - The ReceiveDelay is the time between the Low Power node - sending a request and listening for a response. This delay - allows the Friend node time to prepare the response. The value - is in units of milliseconds. - value: 100 - - BLE_MESH_LPN_POLL_TIMEOUT: - description: > - PollTimeout timer is used to measure time between two - consecutive requests sent by the Low Power node. If no - requests are received by the Friend node before the - PollTimeout timer expires, then the friendship is considered - terminated. The value is in units of 100 milliseconds, so e.g. - a value of 300 means 30 seconds. - value: 300 - - BLE_MESH_LPN_INIT_POLL_TIMEOUT: - description: > - The initial value of the PollTimeout timer when Friendship - gets established for the first time. After this the timeout - will gradually grow toward the actual PollTimeout, doubling - in value for each iteration. The value is in units of 100 - milliseconds, so e.g. a value of 300 means 3 seconds. - value: MYNEWT_VAL_BLE_MESH_LPN_POLL_TIMEOUT - - BLE_MESH_LPN_SCAN_LATENCY: - description: > - Latency in milliseconds that it takes to enable scanning. This - is in practice how much time in advance before the Receive Window - that scanning is requested to be enabled. - value: 10 - - BLE_MESH_LPN_GROUPS: - description: > - Maximum number of groups that the LPN can subscribe to. - value: 10 - - BLE_MESH_FRIEND: - description: > - Enable this option to be able to act as a Friend Node. - value: 0 - - BLE_MESH_FRIEND_RECV_WIN: - description: > - Receive Window in milliseconds supported by the Friend node. - value: 255 - - BLE_MESH_FRIEND_QUEUE_SIZE: - description: > - Minimum number of buffers available to be stored for each - local Friend Queue. - value: 16 - - BLE_MESH_FRIEND_SUB_LIST_SIZE: - description: > - Size of the Subscription List that can be supported by a - Friend node for a Low Power node. - value: 3 - - BLE_MESH_FRIEND_LPN_COUNT: - description: > - Number of Low Power Nodes the Friend can have a Friendship - with simultaneously. - value: 2 - - BLE_MESH_FRIEND_SEG_RX: - description: > - Number of incomplete segment lists that we track for each LPN - that we are Friends for. In other words, this determines how - many elements we can simultaneously be receiving segmented - messages from when the messages are going into the Friend queue. - value: 1 - - BLE_MESH_CFG_CLI: - description: > - Enable support for the configuration client model. - value: 0 - - BLE_MESH_HEALTH_CLI: - description: > - Enable support for the health client model. - value: 0 - - BLE_MESH_SHELL: - description: > - Activate shell module that provides Bluetooth Mesh commands to - the console. - value: 0 - - BLE_MESH_MODEL_EXTENSIONS: - description: > - Enable support for the model extension concept, allowing the Access - layer to know about Mesh model relationships. - value: 0 - - BLE_MESH_IV_UPDATE_TEST: - description: > - This option removes the 96 hour limit of the IV Update - Procedure and lets the state be changed at any time. - value: 0 - - BLE_MESH_TESTING: - description: > - This option enables testing API. - value: 0 - - BLE_MESH_DEV_UUID: - description: > - Device UUID - value: ((uint8_t[16]){0x11, 0x22, 0}) - - BLE_MESH_SHELL_MODELS: - description: > - Include implementation of some demo models. - value: 0 - - BLE_MESH_OOB_OUTPUT_ACTIONS: - description: > - Supported Output OOB Actions - BT_MESH_NO_OUTPUT = 0, - BT_MESH_BLINK = BIT(0) - BT_MESH_BEEP = BIT(1) - BT_MESH_VIBRATE = BIT(2) - BT_MESH_DISPLAY_NUMBER = BIT(3) - BT_MESH_DISPLAY_STRING = BIT(4) - value: ((BT_MESH_DISPLAY_NUMBER)) - - BLE_MESH_OOB_OUTPUT_SIZE: - description: > - Output OOB size - value: 4 - - BLE_MESH_OOB_INPUT_ACTIONS: - description: > - Supported Input OOB Actions - BT_MESH_NO_INPUT = 0, - BT_MESH_PUSH = BIT(0) - BT_MESH_TWIST = BIT(1) - BT_MESH_ENTER_NUMBER = BIT(2) - BT_MESH_ENTER_STRING = BIT(3) - value: ((BT_MESH_NO_INPUT)) - - BLE_MESH_OOB_INPUT_SIZE: - description: > - Input OOB size - value: 4 - - BLE_MESH_SETTINGS: - description: > - This option enables Mesh settings storage. - value: 1 - - BLE_MESH_STORE_TIMEOUT: - description: > - This value defines in seconds how soon any pending changes - are actually written into persistent storage (flash) after - a change occurs. - value: 2 - - BLE_MESH_SEQ_STORE_RATE: - description: > - This value defines how often the local sequence number gets - updated in persistent storage (i.e. flash). E.g. a value of 100 - means that the sequence number will be stored to flash on every - 100th increment. If the node sends messages very frequently a - higher value makes more sense, whereas if the node sends - infrequently a value as low as 0 (update storage for every - increment) can make sense. When the stack gets initialized it - will add this number to the last stored one, so that it starts - off with a value that's guaranteed to be larger than the last - one used before power off. - value: 128 - - BLE_MESH_RPL_STORE_TIMEOUT: - description: > - This value defines in seconds how soon the RPL gets written to - persistent storage after a change occurs. If the node receives - messages frequently it may make sense to have this set to a - large value, whereas if the RPL gets updated infrequently a - value as low as 0 (write immediately) may make sense. Note that - if the node operates a security sensitive use case, and there's - a risk of sudden power loss, it may be a security vulnerability - to set this value to anything else than 0 (a power loss before - writing to storage exposes the node to potential message - replay attacks). - value: 5 - - BLE_MESH_DEVICE_NAME: - description: > - This value defines BLE Mesh device/node name. - value: '"nimble-mesh-node"' - - BLE_MESH_SYSINIT_STAGE: - description: > - Primary sysinit stage for BLE mesh functionality. - value: 500 - - BLE_MESH_SYSINIT_STAGE_SHELL: - description: > - Secondary sysinit stage for BLE mesh functionality. - value: 1000 - - ### Log settings. - - BLE_MESH_LOG_MOD: - description: > - Numeric module ID to use for BLE Mesh log messages. - value: 9 - BLE_MESH_LOG_LVL: - description: > - Minimum level for the BLE Mesh log. - value: 1 - - BLE_MESH_ACCESS_LOG_MOD: - description: > - Numeric module ID to use for BLE Mesh Access-related log messages. - value: 10 - BLE_MESH_ACCESS_LOG_LVL: - description: > - Minimum level for the BLE Mesh Access-related log. - value: 1 - - BLE_MESH_ADV_LOG_MOD: - description: > - Numeric module ID to use for BLE Mesh advertising log messages. - value: 11 - BLE_MESH_ADV_LOG_LVL: - description: > - Minimum level for the BLE Mesh log. - value: 1 - - BLE_MESH_BEACON_LOG_MOD: - description: > - Numeric module ID to use for BLE Mesh Beacon-related log messages. - value: 12 - BLE_MESH_BEACON_LOG_LVL: - description: > - Minimum level for the BLE Mesh Beacon-related log. - value: 1 - - BLE_MESH_CRYPTO_LOG_MOD: - description: > - Numeric module ID to use for BLE Mesh cryptographic log messages. - value: 13 - BLE_MESH_CRYPTO_LOG_LVL: - description: > - Minimum level for the BLE Mesh cryptographic log. - value: 1 - - BLE_MESH_FRIEND_LOG_MOD: - description: > - Numeric module ID to use for BLE Mesh Friend log messages. - value: 14 - BLE_MESH_FRIEND_LOG_LVL: - description: > - Minimum level for the BLE Mesh Friend log. - value: 1 - - BLE_MESH_LOW_POWER_LOG_MOD: - description: > - Numeric module ID to use for BLE Mesh Low Power log messages. - value: 15 - BLE_MESH_LOW_POWER_LOG_LVL: - description: > - Minimum level for the BLE Mesh Low Power log. - value: 1 - - BLE_MESH_MODEL_LOG_MOD: - description: > - Numeric module ID to use for BLE Mesh Foundation Models log messages. - value: 16 - BLE_MESH_MODEL_LOG_LVL: - description: > - Minimum level for the BLE Mesh Foundation Models log. - value: 1 - - BLE_MESH_NET_LOG_MOD: - description: > - Numeric module ID to use for BLE Mesh Network layer log messages. - value: 17 - BLE_MESH_NET_LOG_LVL: - description: > - Minimum level for the BLE Mesh Network layer log. - value: 1 - - BLE_MESH_PROV_LOG_MOD: - description: > - Numeric module ID to use for BLE Mesh Provisioning log messages. - value: 18 - BLE_MESH_PROV_LOG_LVL: - description: > - Minimum level for the BLE Mesh Provisioning log. - value: 1 - - BLE_MESH_PROXY_LOG_MOD: - description: > - Numeric module ID to use for BLE Mesh Proxy protocol log messages. - value: 19 - BLE_MESH_PROXY_LOG_LVL: - description: > - Minimum level for the BLE Mesh Proxy protocol log. - value: 1 - - BLE_MESH_SETTINGS_LOG_MOD: - description: > - Numeric module ID to use for BLE Mesh persistent settings log messages. - value: 20 - BLE_MESH_SETTINGS_LOG_LVL: - description: > - Minimum level for the BLE Mesh persistent settings log. - value: 1 - - BLE_MESH_TRANS_LOG_MOD: - description: > - Numeric module ID to use for BLE Mesh Transport Layer log messages. - value: 21 - BLE_MESH_TRANS_LOG_LVL: - description: > - Minimum level for the BLE Mesh Transport Layer log. - value: 1 - -syscfg.logs: - BLE_MESH_LOG: - module: MYNEWT_VAL(BLE_MESH_LOG_MOD) - level: MYNEWT_VAL(BLE_MESH_LOG_LVL) - - BLE_MESH_ACCESS_LOG: - module: MYNEWT_VAL(BLE_MESH_ACCESS_LOG_MOD) - level: MYNEWT_VAL(BLE_MESH_ACCESS_LOG_LVL) - - BLE_MESH_ADV_LOG: - module: MYNEWT_VAL(BLE_MESH_ADV_LOG_MOD) - level: MYNEWT_VAL(BLE_MESH_ADV_LOG_LVL) - - BLE_MESH_BEACON_LOG: - module: MYNEWT_VAL(BLE_MESH_BEACON_LOG_MOD) - level: MYNEWT_VAL(BLE_MESH_BEACON_LOG_LVL) - - BLE_MESH_CRYPTO_LOG: - module: MYNEWT_VAL(BLE_MESH_CRYPTO_LOG_MOD) - level: MYNEWT_VAL(BLE_MESH_CRYPTO_LOG_LVL) - - BLE_MESH_FRIEND_LOG: - module: MYNEWT_VAL(BLE_MESH_FRIEND_LOG_MOD) - level: MYNEWT_VAL(BLE_MESH_FRIEND_LOG_LVL) - - BLE_MESH_LOW_POWER_LOG: - module: MYNEWT_VAL(BLE_MESH_LOW_POWER_LOG_MOD) - level: MYNEWT_VAL(BLE_MESH_LOW_POWER_LOG_LVL) - - BLE_MESH_MODEL_LOG: - module: MYNEWT_VAL(BLE_MESH_MODEL_LOG_MOD) - level: MYNEWT_VAL(BLE_MESH_MODEL_LOG_LVL) - - BLE_MESH_NET_LOG: - module: MYNEWT_VAL(BLE_MESH_NET_LOG_MOD) - level: MYNEWT_VAL(BLE_MESH_NET_LOG_LVL) - - BLE_MESH_PROV_LOG: - module: MYNEWT_VAL(BLE_MESH_PROV_LOG_MOD) - level: MYNEWT_VAL(BLE_MESH_PROV_LOG_LVL) - - BLE_MESH_PROXY_LOG: - module: MYNEWT_VAL(BLE_MESH_PROXY_LOG_MOD) - level: MYNEWT_VAL(BLE_MESH_PROXY_LOG_LVL) - - BLE_MESH_SETTINGS_LOG: - module: MYNEWT_VAL(BLE_MESH_SETTINGS_LOG_MOD) - level: MYNEWT_VAL(BLE_MESH_SETTINGS_LOG_LVL) - - BLE_MESH_TRANS_LOG: - module: MYNEWT_VAL(BLE_MESH_TRANS_LOG_MOD) - level: MYNEWT_VAL(BLE_MESH_TRANS_LOG_LVL) - -syscfg.vals.BLE_MESH_SHELL: - BLE_MESH_CFG_CLI: 1 - BLE_MESH_HEALTH_CLI: 1 - BLE_MESH_IV_UPDATE_TEST: 1 - -syscfg.vals.BLE_MESH_GATT_PROXY: - BLE_MESH_PROXY: 1 - -syscfg.vals.BLE_MESH_PB_GATT: - BLE_MESH_PROXY: 1 - BLE_MESH_PROV: 1 - -syscfg.vals.BLE_MESH_PB_ADV: - BLE_MESH_PROV: 1 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pkg.yml deleted file mode 100644 index a063a0b63..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pkg.yml +++ /dev/null @@ -1,55 +0,0 @@ -# -# 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. -# - -pkg.name: nimble/host -pkg.description: Host side of the nimble Bluetooth Smart stack. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - -pkg.deps: - - "@apache-mynewt-core/kernel/os" - - "@apache-mynewt-core/sys/log/modlog" - - "@apache-mynewt-core/util/mem" - - nimble - -pkg.deps.BLE_SM_LEGACY: - - "@apache-mynewt-core/crypto/tinycrypt" - -pkg.deps.BLE_SM_SC: - - "@apache-mynewt-core/crypto/tinycrypt" - -pkg.deps.BLE_MONITOR_RTT: - - "@apache-mynewt-core/hw/drivers/rtt" - -pkg.deps.BLE_MESH: - - nimble/host/mesh - -pkg.req_apis: - - ble_transport - - console - - stats - -pkg.init: - ble_hs_init: 'MYNEWT_VAL(BLE_HS_SYSINIT_STAGE)' - -pkg.down.BLE_HS_STOP_ON_SHUTDOWN: - ble_hs_shutdown: 200 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/README.txt b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/README.txt deleted file mode 100644 index bb03b18ca..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/README.txt +++ /dev/null @@ -1,8 +0,0 @@ -This folder contains qualification tests results against BT SIG Profile Test -Suite. - -pts-FOO.txt files contain result for specific profiles or protocols. This -includes PTS version, test date, enabled tests, results etc. - -In addition to tests results 'tpg' folder constains Test Plang Generator -configuration files that can be imported by PTS for tests configuration. diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-gap.txt b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-gap.txt deleted file mode 100644 index 29ed2446e..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-gap.txt +++ /dev/null @@ -1,367 +0,0 @@ -PTS test results for GAP - -PTS version: 7.5.0 -Tested: 27-Sept-2019 - -Results: -PASS test passed -FAIL test failed -INC test is inconclusive -N/A test is disabled due to PICS setup - -------------------------------------------------------------------------------- -Test Name Result Notes -------------------------------------------------------------------------------- - -GAP/BROB/BCST/BV-01-C PASS advertise-configure legacy=1 connectable=0 scannable=0 -GAP/BROB/BCST/BV-02-C PASS advertise-configure legacy=1 connectable=0 scannable=0 - -GAP/BROB/BCST/BV-03-C PASS set irk= e.g: 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:11 - Note: in PTS IXIT please set: - TSPX_iut_device_IRK_for_resolvable_privacy_address_generation_procedure=11000000000000000000000000000000 - set advertise-set-adv-data name= flags=4 - advertise-configure connectable=0 scannable=0 own_addr_type=rpa_pub -GAP/BROB/BCST/BV-04-C PASS TSPX_advertising_data=07086E696D626C65 - advertise-set-adv-data name=nimble - set addr_type=random addr=01:3e:56:f7:46:21 - advertise-configure connectable=0 scannable=0 own_addr_type=random -GAP/BROB/BCST/BV-05-C N/A -GAP/BROB/OBSV/BV-01-C PASS scan passive -GAP/BROB/OBSV/BV-02-C PASS scan -GAP/BROB/OBSV/BV-03-C PASS scan -GAP/BROB/OBSV/BV-04-C PASS connect peer_addr= - security-set-data bonding=1 - security-pair conn= - - -GAP/BROB/OBSV/BV-05-C PASS scan own_addr_type=rpa_pub -GAP/BROB/OBSV/BV-06-C PASS scan own_addr_type=rpa_pub -------------------------------------------------------------------------------- - -GAP/DISC/NONM/BV-01-C PASS advertise-configure connectable=0 legacy=1 adverdise=non -GAP/DISC/NONM/BV-02-C PASS advertise-configure connectable=0 - -GAP/DISC/LIMM/BV-01-C N/A -GAP/DISC/LIMM/BV-02-C N/A -GAP/DISC/LIMM/BV-03-C PASS advertise-configure legacy=1 connectable=0 - advertise-set-adv-data flags=5 - advertise-start duration= e.g.3000 -GAP/DISC/LIMM/BV-04-C PASS advertise-configure legacy=1 connectable=0 - advertise-set-adv-data flags=5 - advertising-start duration= -GAP/DISC/GENM/BV-01-C N/A -GAP/DISC/GENM/BV-02-C N/A -GAP/DISC/GENM/BV-03-C PASS advertise-configure legacy=1 connectable=0 - advertise-set-adv-data flags=6 - advertise-start -GAP/DISC/GENM/BV-04-C PASS advertise-configure legacy=1 connectable=0 - advertise-set-adv-data flags=6 - advertising-start - -GAP/DISC/LIMP/BV-01-C PASS scan limited=1 nodups=1 -GAP/DISC/LIMP/BV-02-C PASS scan limited=1 nodups=1 -GAP/DISC/LIMP/BV-03-C PASS scan limited=1 nodups=1 -GAP/DISC/LIMP/BV-04-C PASS scan limited=1 nodups=1 -GAP/DISC/LIMP/BV-05-C PASS scan limited=1 nodups=1 - -GAP/DISC/GENP/BV-01-C PASS scan nodups=1 -GAP/DISC/GENP/BV-02-C PASS scan nodups=1 -GAP/DISC/GENP/BV-03-C PASS scan nodups=1 - -GAP/DISC/GENP/BV-04-C PASS scan nodups=1 - -GAP/DISC/GENP/BV-05-C PASS scan nodups=1 - -GAP/DISC/RPA/BV-01-C N/A scan nodups=1 -------------------------------------------------------------------------------- - -GAP/IDLE/GIN/BV-01-C N/A -GAP/IDLE/GIN/BV-02-C N/A -GAP/IDLE/NAMP/BV-01-C PASS advertise-configure connectable=1 legacy=1 - advertising-start - gatt-discover-full conn= - gatt-show - - gatt-read conn= uuid=0x2a00 start= end= - disconnect conn= -GAP/IDLE/NAMP/BV-02-C PASS - advertise-configure connectable=1 legacy=1 - advertising-start -GAP/IDLE/DED/BV-01-C N/A -GAP/IDLE/DED/BV-02-C N/A -------------------------------------------------------------------------------- - -GAP/CONN/NCON/BV-01-C PASS advertise-configure connectable=0 legacy=1 - advertising-start -GAP/CONN/NCON/BV-02-C PASS advertise-configure connectable=0 legacy=1 - advertise-set-adv-data flags=6 - advertise-start -GAP/CONN/NCON/BV-03-C PASS advertise-configure connectable=0 legacy=1 - advertise-set-adv-data flags=5 - advertise-start - -GAP/CONN/DCON/BV-01-C PASS advertise-configure connectable=0 directed=1 peer_addr= - advertise-start -GAP/CONN/DCON/BV-02-C N/A -GAP/CONN/DCON/BV-03-C N/A - -GAP/CONN/UCON/BV-01-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=4 - advertise-start -GAP/CONN/UCON/BV-02_C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=5 - advertise-start -GAP/CONN/UCON/BV-03_C PASS adbertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 -GAP/CONN/UCON/BV-04_C N/A -GAP/CONN/UCON/BV-05_C N/A -GAP/CONN/UCON/BV-06_C N/A - -GAP/CONN/ACEP/BV-01-C PASS white-list addr_type=public addr= - connect - disconnect conn= -GAP/CONN/ACEP/BV-02-C N/A - -GAP/CONN/GCEP/BV-01-C PASS connect peer_addr= - disconnect conn= -GAP/CONN/GCEP/BV-02-C PASS connect peer_addr= -GAP/CONN/GCEP/BV-03-C PASS set irk= - connect peer_addr= own_addr_type=rpa_pub - security-set-data bonding=1 our_key_dist=7 their_key_dist=7 - security-pair conn= - connect peer_addr= - disconnect conn=1 -GAP/CONN/GCEP/BV-04-C N/A -GAP/CONN/SCEP/BV-01-C PASS white-list addr_type=public addr= - connect - disconnect conn= -GAP/CONN/SCEP/BV-02-C INC -GAP/CONN/DCEP/BV-01-C PASS connect peer_addr= - disconnect conn= -GAP/CONN/DCEP/BV-02-C INC -GAP/CONN/DCEP/BV-03-C PASS connect peer_addr= - disconnect conn= -GAP/CONN/DCEP/BV-04-C PASS connect peer_addr= - disconnect conn= - -GAP/CONN/CPUP/BV-01-C PASS advertise-start - conn-update-params conn= -GAP/CONN/CPUP/BV-02-C PASS advertise-start - conn-update-params conn= -GAP/CONN/CPUP/BV-03-C PASS advertise-start - conn-update-params conn= -GAP/CONN/CPUP/BV-04-C PASS connect peer_addr= - disconnect conn= -GAP/CONN/CPUP/BV-05-C PASS connect peer_addr= - disconnect conn= -GAP/CONN/CPUP/BV-06-C PASS conect peer_addr= - conn-update-params conn= eg.latency=20 - disconnect conn= -GAP/CONN/CPUP/BV-08-C PASS advertise-configure legacy=1 connectable=1 - advertise-set-data name= - advertise-start - -GAP/CONN/TERM/BV-01-C PASS connect peer_addr= - disconnect conn= -GAP/CONN/PRDA/BV-01-C N/A -GAP/CONN/PRDA/BV-02-C N/A -------------------------------------------------------------------------------- -GAP/BOND/NBON/BV-01-C PASS security-set-data bonding=0 - connect peer_addr= - - connect peer_addr= - -GAP/BOND/NBON/BV-02-C PASS security-set-data bonding=0 - connect peer_addr= - security-pair conn= - - connect peer_addr= - security-pair conn= - -GAP/BOND/NBON/BV-03-C PASS security-set-data bonding=0 - advertise-configure legacy=1 connectable=1 - advertise-set-data name= - advertise-start - - -GAP/BOND/BON/BV-01-C PASS security-set-data bonding=1 sc=1 our_key_dist=7 their_key_dist=7 - advertise-configure legacy=1 connectable=1 - advertise-start - security-start conn= - - advertise-start - -GAP/BOND/BON/BV-02-C PASS security-set-data bonding=1 - connect peer_addr= - security-pair conn= - - connect peer_addr= - seccurity-pair conn= - -GAP/BOND/BON/BV-03-C PASS security-set-sm-data bonding=1 our_key_dist=7 their_key_dist=7 - advertise-configure legacy=1 connectable=1 - advertise-start - - advertise-start - -GAP/BOND/BON/BV-04-C PASS security-set-data bonding=1 - connect-peer_addr= - disconnect conn= - connect peer_addr= - security-pair conn= - disconnect conn= -------------------------------------------------------------------------------- - -GAP/SEC/AUT/BV-11-C PASS security-set-data io_capabilities=1 sc=1 - advertise-configure legacy=1 connectable=1 - advertising-start - Note: in PTS enter handle for characteristics - value which requires encryption for read (gatt-show-local) - auth-passkey conn= action=3 key=123456 - Note: enter '123456' passkey in PTS -GAP/SEC/AUT/BV-12-C PASS security-set-data io_capabilities=1 bonding=1 mitm_flag=1 sc=1 our_key_dist=7 their_key_dist=7 - connect peer_addr= - gatt-show-local - Note: in PTS enter handle for characteristics - value which requires encryption for read - auth-passkey conn= action=3 key=123456 - Note: enter '123456' passkey in PTS -GAP/SEC/AUT/BV-13-C PASS Note: in PTS confirm that IUT supports GATT Server - security-set-data io_capabilities=1 bonding=1 mitm_flag=1 sc=1 our_key_dist=7 their_key_dist=7 - connect peer_addr= - gatt-show-local - Note: in PTS enter handle for characteristics - value which requires authenticated pairing for read - auth-passkey conn= action=3 key=123456 - Note: enter '123456' passkey in PTS -GAP/SEC/AUT/BV-14-C PASS security-set-data io_capabilities=1 - advertise-configure legacy=1 connectable=1 - advertise-start - gatt-show-local - Note: in PTS enter handle for characteristics - value which requires authenticated pairing for read - auth-passkey conn= action=3 key=123456 - Note: enter '123456' passkey in PTS -GAP/SEC/AUT/BV-15-C N/A security-set-data bonding=1 io_capabilities=4 mitm_flag=1 sc=1 our_key_dist=7 their_key_dist=7 - advertise-configure legacy=1 connectable=1 - advertise-start - auth-passkey conn= action=2 key= - advertise-start - gatt-show-local - Note: in PTS enter handle for characteristics - value which requires authenticated pairing for read -GAP/SEC/AUT/BV-16-C N/A security-set-data io_capabilities=1 bonding=1 mitm_flag=1 sc=1 our_key_dist=7 their_key_dist=7 - connect peer_addr= - auth-passkey conn= action=3 key=123456 - Note: enter '123456' passkey in PTS - connect peer_addr= - gatt-show-local - Note: in PTS enter handle for characteristics - value which requires authenticated pairing for read -GAP/SEC/AUT/BV-17-C N/A -GAP/SEC/AUT/BV-18-C N/A -GAP/SEC/AUT/BV-19-C N/A -GAP/SEC/AUT/BV-20-C N/A -GAP/SEC/AUT/BV-21-C N/A -GAP/SEC/AUT/BV-22-C N/A -GAP/SEC/AUT/BV-23-C N/A -GAP/SEC/AUT/BV-24-C N/A - -GAP/SEC/CSIGN/BV-01-C N/A -GAP/SEC/CSIGN/BV-02-C N/A - -GAP/SEC/CSIGN/BI-01-C N/A -GAP/SEC/CSIGN/BI-02-C N/A -GAP/SEC/CSIGN/BI-03-C N/A -GAP/SEC/CSIGN/BI-04-C N/A -------------------------------------------------------------------------------- - -GAP/PRIV/CONN/BV-01-C N/A -GAP/PRIV/CONN/BV-02-C N/A -GAP/PRIV/CONN/BV-03-C N/A -GAP/PRIV/CONN/BV-04-C INC -GAP/PRIV/CONN/BV-05-C N/A -GAP/PRIV/CONN/BV-06-C N/A -GAP/PRIV/CONN/BV-07-C N/A -GAP/PRIV/CONN/BV-08-C N/A -GAP/PRIV/CONN/BV-09-C N/A -GAP/PRIV/CONN/BV-10-C N/A -GAP/PRIV/CONN/BV-11-C N/A -------------------------------------------------------------------------------- - -GAP/ADV/BV-01-C PASS advertise-set-adv_data uuid16=0x1802 - advertise-start - advertise-stop -GAP/ADV/BV-02-C PASS advertise-set-adv_data name= - advertise-start - advertise-stop -GAP/ADV/BV-03-C PASS advertise-set-adv_data flags=6 - advertise-start - advertise-stop -GAP/ADV/BV-04-C PASS advertise-set-adv_data mfg_data=ff:ff - advertise-start - advertise-stop -GAP/ADV/BV-05-C PASS advertise-set-adv_data tx_pwr_lvl=10 - advertise-start - advertise-stop -GAP/ADV/BV-08-C N/A -GAP/ADV/BV-09-C N/A -GAP/ADV/BV-10-C PASS advetrise-set-adv_data service_data_uuid16=18:02:ff:ff - advertise-start - advertise-stop -GAP/ADV/BV-11-C PASS advertise-set -dv_data appearance=12 - advertise-start - advertise-stop -GAP/ADV/BV-12-C N/A -GAP/ADV/BV-13-C N/A -GAP/ADV/BV-14-C N/A -GAP/ADV/BV-15-C N/A -GAP/ADV/BV-16-C N/A -GAP/ADV/BV-17-C PASS In PTS: TSPX_URI= - set-adv-data uri= - advertise-start - advertise-stop -------------------------------------------------------------------------------- - -GAP/GAT/BV-01-C PASS - advertising-start - - connect peer_addr= -GAP/GAT/BV-02-C N/A -GAP/GAT/BV-03-C N/A -GAP/GAT/BV-04-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GAP/GAT/BV-05-C N/A -GAP/GAT/BV-06-C N/A -GAP/GAT/BV-07-C N/A -GAP/GAT/BV-08-C N/A ----------------------------------------------------------------------------- - -GAP/DM/NCON/BV-01-C N/A -GAP/DM/CON/BV-01-C N/A -GAP/DM/NBON/BV-01-C N/A -GAP/DM/BON/BV-01-C N/A -GAP/DM/GIN/BV-01-C N/A -GAP/DM/LIN/BV-01-C N/A -GAP/DM/NAD/BV-01-C N/A -GAP/DM/NAD/BV-02-C N/A -GAP/DM/LEP/BV-01-C N/A -GAP/DM/LEP/BV-02-C N/A -GAP/DM/LEP/BV-04-C N/A -GAP/DM/LEP/BV-05-C N/A -GAP/DM/LEP/BV-06-C N/A -GAP/DM/LEP/BV-07-C N/A -GAP/DM/LEP/BV-08-C N/A -GAP/DM/LEP/BV-09-C N/A -GAP/DM/LEP/BV-10-C N/A -GAP/DM/LEP/BV-11-C N/A -------------------------------------------------------------------------------- - -GAP/MOD/NDIS/BV-01-C N/A -GAP/MOD/LDIS/BV-01-C N/A -GAP/MOD/LDIS/BV-02-C N/A -GAP/MOD/LDIS/BV-03-C N/A -GAP/MOD/GDIS/BV-01-C N/A -GAP/MOD/GDIS/BV-02-C N/A -GAP/MOD/NCON/BV-01-C N/A -GAP/MOD/CON/BV-01-C N/A \ No newline at end of file diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-gatt.txt b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-gatt.txt deleted file mode 100644 index 74c0a2e01..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-gatt.txt +++ /dev/null @@ -1,508 +0,0 @@ -PTS test results for GATT - -PTS version: 7.5.0 -Tested: 27-Sept-2019 - -Results: -PASS test passed -FAIL test failed -INC test is inconclusive -N/A test is disabled due to PICS setup - -------------------------------------------------------------------------------- -Test Name Result Notes -------------------------------------------------------------------------------- -GATT/CL/GAC/BV-01-C PASS connect peer_addr= - gatt-exchanche-mtu conn= - gatt-write conn= long=1 attr= value= - disconnect conn= -------------------------------------------------------------------------------- - -GATT/CL/GAD/BV-01-C PASS connect peer_addr= - gatt-discover-service conn= - gatt-show - - disconnect conn= - -GATT/CL/GAD/BV-02-C PASS connect peer_addr= - gatt-discover-service conn= uuid= - gatt-show - - disconnect conn= - -GATT/CL/GAD/BV-03-C PASS connect peer_addr= - gatt-find-included-services conn= start=1 end=0xffff - - disconnect conn= - -GATT/CL/GAD/BV-04-C PASS connect peer_addr= - gatt-discover-service conn= uuid= - gatt-discover-characteristic conn= start= end= - gatt-show - - disconnect conn= - -GATT/CL/GAD/BV-05-C PASS connect peer_addr= - gatt-discover-service conn= - gatt-discover-characteristic conn= uuid= start= end= - gatt-show - - disconnect conn= - -GATT/CL/GAD/BV-06-C PASS connect peer_addr= - gatt-discover-service conn= - gatt-discover-characteristic conn= start= end= - gatt-discover-descriptor conn= start= end= - - disconnect conn= - -GATT/CL/GAD/BV-07-C N/A -GATT/CL/GAD/BV-08-C N/A -------------------------------------------------------------------------------- - -GATT/CL/GAR/BV-01-C PASS connect peer_addr= - gatt-read conn= attr= - - disconnect conn= -GATT/CL/GAR/BI-01-C PASS connect peer_addr= - gatt-read conn= attr= - - disconnect conn= -GATT/CL/GAR/BI-02-C PASS connect peer_addr= - gatt-read conn= attr= - - disconnect conn= -GATT/CL/GAR/BI-03-C N/A - -GATT/CL/GAR/BI-04-C PASS connect peer_addr= - gatt-read conn= attr= - disconnect conn= - -GATT/CL/GAR/BI-05-C PASS connect peer_addr= - gatt-read conn= attr= - - disconnect conn= -GATT/CL/GAR/BV-03-C PASS connect peer_addr= - gatt-read conn= uuid= start=1 end=0xffff - - - disconnect conn= -GATT/CL/GAR/BI-06-C PASS connect peer_addr= - gatt-read conn= uuid= start= end= - disconnect conn= - -GATT/CL/GAR/BI-07-C PASS connect peer_addr= - gatt-read conn= uuid= start= end= - disconnect conn= - -GATT/CL/GAR/BI-09-C N/A -GATT/CL/GAR/BI-10-C PASS connect peer_addr= - gatt-read conn= uuid= start= end= - disconnect conn= - -GATT/CL/GAR/BI-11-C PASS connect perr_addr= - gatt-read conn= start= end= - disconnect conn= - -GATT/CL/GAR/BV-04-C PASS connect peer_addr= - gatt-read conn= long=1 attr= - - - disconnect conn= -GATT/CL/GAR/BI-12-C PASS connect peer_addr= - gatt-read conn= long=1 attr= - - disconnect conn= -GATT/CL/GAR/BI-13-C PASS connect peer_addr= - gatt-read conn= long=1 attr= offset= - - disconnect conn= -GATT/CL/GAR/BI-14-C PASS connect peer_addr= - gatt-read conn= long=1 attr= - disconnect conn= - -GATT/CL/GAR/BI-15-C N/A - -GATT/CL/GAR/BI-16-C PASS connect peer_addr= - gatt-read conn= long=1 attr= - disconnect conn= - -GATT/CL/GAR/BI-17-C PASS connect peer_addr= - gatt-read conn= long=1 attr= - - disconnect conn= -GATT/CL/GAR/BV-05-C PASS connect peer_addr= - gatt-read conn= attr= attr= - disconnect conn= -GATT/CL/GAR/BI-18-C PASS connect peer_addr= - gatt-read conn= attr= attr= - - disconnect conn= -GATT/CL/GAR/BI-19-C PASS connect peer_addr= - gatt-read conn= attr= attr= - disconnect conn= - -GATT/CL/GAR/BI-20-C N/A - -GATT/CL/GAR/BI-21-C PASS connect peer_addr= - gatt-read conn= attr= attr= - disconnect conn= - -GATT/CL/GAR/BI-22-C PASS connect peer_addr= - gatt-read conn= attr= attr= - - disconnect conn= -GATT/CL/GAR/BV-06-C PASS connect peer_addr= - gatt-read conn= attr= - - disconnect conn= -GATT/CL/GAR/BV-07-C PASS connect peer_addr= - gatt-read conn= long=1 attr= - - - disconnect conn= -GATT/CL/GAR/BI-34-C N/A -GATT/CL/GAR/BI-35-C PASS connect peer_addr= - gatt-read conn= long=1 attr= - - disconnect conn= -------------------------------------------------------------------------------- - -GATT/CL/GAW/BV-01-C PASS connect peer_addr= - gatt-write no_rsp=1 conn= attr= value= - disconnect conn= -GATT/CL/GAW/BV-02-C N/A - -GATT/CL/GAW/BV-03-C PASS connect peer_addr= - gatt-write conn= attr= value= - disconnect conn= -GATT/CL/GAW/BI-02-C PASS connect peer_addr= - gatt-write conn= attr= value= - disconnect conn= -GATT/CL/GAW/BI-03-C PASS connect peer_addr= - gatt-write conn= attr= value= - disconnect conn= -GATT/CL/GAW/BI-04-C N/A - -GATT/CL/GAW/BI-05-C PASS connect peer_addr= - gatt-write conn= attr= value= - disconnect conn= -GATT/CL/GAW/BI-06-C PASS connect peer_addr= - gatt-write conn= attr= value= - disconnect conn= -GATT/CL/GAW/BV-05-C PASS connect peer_addr= - gatt-write long=1 conn= attr= value= - disconnect conn= -GATT/CL/GAW/BI-07-C PASS connect peer_addr= - gatt-write long=1 conn= attr= value= - disocnnect conn= -GATT/CL/GAW/BI-08-C PASS connect peer_addr= - gatt-write long=1 conn= attr= value= - diconnect conn= -GATT/CL/GAW/BI-09-C PASS connect peer_addr= - gatt-write long=1 conn= attr= value= offset= - diconnect conn=1 -GATT/CL/GAW/BI-11-C N/A - -GATT/CL/GAW/BI-12-C PASS connect peer_addr= - gatt-write long=1 conn= attr= value= - disconnect conn= -GATT/CL/GAW/BI-13-C PASS connect peer_addr= - gatt-write long=1 conn= attr= value= - diconnect conn= -GATT/CL/GAW/BV-06-C PASS connect peer_addr= - gatt-write long=1 conn= attr= value= - -GAAT/CL/GAW/BV-08-C PASS connect peer_addr= - gat-write conn= attr= value= - -GATT/CL/GAW/BV-09-C PASS connect peer_addr= - gatt-write long=1 conn= attr= value= - -GATT/CL/GAW/BI-32-C PASS connect peer_addr= - gatt-write conn= attr= value= attr= value= - disconnect conn= -GATT/CL/GAW/BI-33-C PASS connect peer_addr= - gatt-write conn= attr= value= - disconnect conn= -GATT/CL/GAW/BI-34-C PASS connect peer_addr= - gatt-write long=1 conn= attr= value= - disconnect conn= - -------------------------------------------------------------------------------- - -GATT/CL/GAN/BV-01-C PASS connect peer_addr= - gatt-write conn= attr= value=01:00 - Note: verify that the notification was received - disconnect conn= -------------------------------------------------------------------------------- - -GATT/CL/GAI/BV-01-C PASS connect peer_addr= - gatt-write conn= attr= value=01:00 - Note: verify that the notification was received - disconnect conn= -------------------------------------------------------------------------------- - -GATT/CL/GAS/BV-01-C PASS connect peer_addr= - disconnect conn= -------------------------------------------------------------------------------- - -GATT/CL/GAT/BV-01-C PASS connect peer_addr= - gatt-read conn= attr= -GATT/CL/GAT/BV-02-C PASS connect peer_addr= - gatt-write conn= attr= value= -------------------------------------------------------------------------------- - -GATT/CL/GPA/BV-01-C N/A -GATT/CL/GPA/BV-02-C N/A -GATT/CL/GPA/BV-03-C N/A -GATT/CL/GPA/BV-04-C N/A -GATT/CL/GPA/BV-05-C N/A -GATT/CL/GPA/BV-06-C N/A -GATT/CL/GPA/BV-07-C N/A -GATT/CL/GPA/BV-08-C N/A -GATT/CL/GPA/BV-11-C N/A -GATT/CL/GPA/BV-12-C N/A -------------------------------------------------------------------------------- - -GATT/SR/GAC/BV-01-C PASS set mtu=25 - advertise-configure connectable=1 legacy=1 - advertise-start - advertise-start -------------------------------------------------------------------------------- - -GATT/SR/GAD/BV-01-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - gatt-show-local - -GATT/SR/GAD/BV-02-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - gatt-show-local - -GATT/SR/GAD/BV-03-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - gatt-show-local - -GATT/SR/GAD/BV-04-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAD/BV-05-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAD/BV-06-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAD/BV-07-C N/A -GATT/SR/GAD/BV-08-C N/A -------------------------------------------------------------------------------- - -GATT/SR/GAR/BV-01-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BI-01-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BI-02-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAR/BI-03-C N/A -GATT/SR/GAR/BI-04-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BI-05-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BV-03-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BI-06-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - gatt-show-local - - -GATT/SR/GAR/BI-07-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAR/BI-08-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BI-09-C N/A -GATT/SR/GAR/BI-10-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BI-11-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAR/BV-04-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BI-12-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAR/BI-13-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BI-14-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAR/BI-15-C N/A -GATT/SR/GAR/BI-16-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BI-17-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BV-05-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BI-18-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAR/BI-19-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAR/BI-20-C N/A -GATT/SR/GAR/BI-21-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BI-22-C PASS advertise-configure connectable=1 legacy=1 - advertise-startt -GATT/SR/GAR/BV-06-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BI-23-C N/A -GATT/SR/GAR/BI-24-C N/A -GATT/SR/GAR/BI-25-C N/A -GATT/SR/GAR/BI-26-C N/A -GATT/SR/GAR/BI-27-C N/A -GATT/SR/GAR/BV-07-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BV-08-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAR/BI-28-C N/A -GATT/SR/GAR/BI-29-C N/A -GATT/SR/GAR/BI-30-C N/A -GATT/SR/GAR/BI-31-C N/A -GATT/SR/GAR/BI-32-C N/A -GATT/SR/GAR/BI-33-C N/A -GATT/SR/GAR/BI-34-C N/A -GATT/SR/GAR/BI-35-C N/A -------------------------------------------------------------------------------- - -GATT/SR/GAW/BV-01-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BV-02-C N/A -GATT/SR/GAW/BI-01-C N/A -GATT/SR/GAW/BV-03-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-02-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAW/BI-03-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-04-C N/A -GATT/SR/GAW/BI-05-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-06-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BV-05-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-07-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAW/BI-08-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAW/BI-09-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-11-C N/A -GATT/SR/GAW/BI-12-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-13-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BV-06-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BV-10-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-14-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAW/BI-15-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAW/BI-17-C N/A -GATT/SR/GAW/BI-18-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-19-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BV-11-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BV-07-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BV-08-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-20-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAW/BI-21-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAW/BI-22-C N/A -GATT/SR/GAW/BI-23-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-24-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BV-09-C PASS advertise-configure connectable=1 legacy=1q - advertise-start -GATT/SR/GAW/BI-25-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAW/BI-26-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -GATT/SR/GAW/BI-27-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-29-C N/A -GATT/SR/GAW/BI-30-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-31-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-32-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-33-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-34-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/GAW/BI-35-C PASS advertise-configure connectable=1 legacy=1 - advertise-start ------------------------------------------------------------------------------- - -GATT/SR/GAN/BV-01-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - gatt-notify attr= ------------------------------------------------------------------------------- - -GATT/SR/GAI/BV-01-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - gatt-notify attr= -------------------------------------------------------------------------------- - -GATT/SR/GAS/BV-01-C PASS Note: set TSPX_security_enabled to TRUE - security-set-data bonding=1 our_key_dist=7 their_key_dist=7 - advertise-configure connectable=1 legacy=1 - advertise-start - - gatt-service-changed start=1 end=0xffff - advertise-start - security-start conn= -------------------------------------------------------------------------------- - -GATT/SR/GAT/BV-01-C PASS advertise-start - gatt-notify attr=0x0008 ------------------------------------------------------------------------------- - -GATT/SR/GPA/BV-01-C N/A -GATT/SR/GPA/BV-02-C N/A -GATT/SR/GPA/BV-03-C N/A -GATT/SR/GPA/BV-04-C N/A -GATT/SR/GPA/BV-05-C N/A -GATT/SR/GPA/BV-06-C N/A -GATT/SR/GPA/BV-07-C N/A -GATT/SR/GPA/BV-08-C N/A -GATT/SR/GPA/BV-11-C N/A -GATT/SR/GPA/BV-12-C N/A -------------------------------------------------------------------------------- - -GATT/SR/UNS/BI-01-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -GATT/SR/UNS/BI-02-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - --------------------------------------------------------------------------------- - -GATT/SR/GPM/BV-01-C N/A - diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-l2cap.txt b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-l2cap.txt deleted file mode 100644 index c09add916..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-l2cap.txt +++ /dev/null @@ -1,304 +0,0 @@ -PTS test results for L2CAP - -PTS version: 7.5.0 -Tested: 07-Oct-2019 - -syscfg.vals: - BLE_EXT_ADV: 1 - BLE_PUBLIC_DEV_ADDR: "((uint8_t[6]){0x01, 0xff, 0xff, 0xc0, 0xde, 0xc0})" - BLE_SM_LEGACY: 1 - BLE_SM_SC: 1 - BLE_L2CAP_COC_MAX_NUM: 5 - BLE_SVC_GAP_PPCP_MIN_CONN_INTERVAL: 9 - BLE_SVC_GAP_PPCP_MAX_CONN_INTERVAL: 30 - BLE_SVC_GAP_PPCP_SUPERVISION_TMO: 2000 - CONSOLE_HISTORY_SIZE: 10 - -Results: -PASS test passed -FAIL test failed -INC test is inconclusive -N/A test is disabled due to PICS setup - -------------------------------------------------------------------------------- -Test Name Result Notes -------------------------------------------------------------------------------- - -L2CAP/COS/CED/BV-01-C N/A -L2CAP/COS/CED/BV-03-C N/A -L2CAP/COS/CED/BV-04-C N/A -L2CAP/COS/CED/BV-05-C N/A -L2CAP/COS/CED/BV-07-C N/A -L2CAP/COS/CED/BV-08-C N/A -L2CAP/COS/CED/BV-09-C N/A -L2CAP/COS/CED/BV-10-C N/A -L2CAP/COS/CED/BV-11-C N/A -L2CAP/COS/CED/BI-01-C N/A -------------------------------------------------------------------------------- - -L2CAP/COS/CFD/BV-01-C N/A -L2CAP/COS/CFD/BV-02-C N/A -L2CAP/COS/CFD/BV-03-C N/A -L2CAP/COS/CFD/BV-08-C N/A -L2CAP/COS/CFD/BV-09-C N/A -L2CAP/COS/CFD/BV-10-C N/A -L2CAP/COS/CFD/BV-11-C N/A -L2CAP/COS/CFD/BV-12-C N/A -L2CAP/COS/CFD/BV-13-C N/A -------------------------------------------------------------------------------- - -L2CAP/COS/IEX/BV-01-C N/A -L2CAP/COS/IEX/BV-02-C N/A -------------------------------------------------------------------------------- - -L2CAP/COS/ECH/BV-01-C N/A -L2CAP/COS/ECH/BV-02-C N/A -------------------------------------------------------------------------------- - -L2CAP/COS/CFC/BV-01-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - l2cap-create-server psm= - advertise-start - l2cap-send conn= idx=0 bytes=15 - -L2CAP/COS/CFC/BV-02-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - l2cap-create-server psm= - advertise-start - l2cap-send conn= idx=0 bytes=15 - -L2CAP/COS/CFC/BV-03-C PASS NOTE: #define BTSHELL_COC_MTU = 512 - advertise-configure connectable=1 legacy=1 - l2cap-create-server psm= - advertise-start -L2CAP/COS/CFC/BV-04-C PASS advertise-configure connectable=1 legacy=1 - l2cap-create-server psm= - advertise-start -L2CAP/COS/CFC/BV-05-C PASS advertise-configure connectable=1 legacy=1 - l2cap-create-server psm= - advertise-start - l2cap-connect conn= psm= - l2cap-connect conn= psm=<2nd psm> -------------------------------------------------------------------------------- - -L2CAP/CLS/CLR/BV-01-C N/A -------------------------------------------------------------------------------- - -L2CAP/CLS/UCD/BV-01-C N/A -L2CAP/CLS/UCD/BV-02-C N/A -L2CAP/CLS/UCD/BV-03-C N/A -------------------------------------------------------------------------------- - -L2CAP/EXF/BV-01-C N/A -L2CAP/EXF/BV-02-C N/A -L2CAP/EXF/BV-03-C N/A -L2CAP/EXF/BV-04-C N/A -L2CAP/EXF/BV-05-C N/A -L2CAP/EXF/BV-06-C N/A -------------------------------------------------------------------------------- - -L2CAP/CMC/BV-01-C N/A -L2CAP/CMC/BV-02-C N/A -L2CAP/CMC/BV-03-C N/A -L2CAP/CMC/BV-04-C N/A -L2CAP/CMC/BV-05-C N/A -L2CAP/CMC/BV-06-C N/A -L2CAP/CMC/BV-07-C N/A -L2CAP/CMC/BV-08-C N/A -L2CAP/CMC/BV-09-C N/A -L2CAP/CMC/BV-10-C N/A -L2CAP/CMC/BV-11-C N/A -L2CAP/CMC/BV-12-C N/A -L2CAP/CMC/BV-13-C N/A -L2CAP/CMC/BV-14-C N/A -L2CAP/CMC/BV-15-C N/A -L2CAP/CMC/BI-01-C N/A -L2CAP/CMC/BI-02-C N/A -L2CAP/CMC/BI-03-C N/A -L2CAP/CMC/BI-04-C N/A -L2CAP/CMC/BI-05-C N/A -L2CAP/CMC/BI-06-C N/A -------------------------------------------------------------------------------- - -L2CAP/FOC/BV-01-C N/A -L2CAP/FOC/BV-02-C N/A -L2CAP/FOC/BV-03-C N/A -------------------------------------------------------------------------------- - -L2CAP/OFS/BV-01-C N/A -L2CAP/OFS/BV-02-C N/A -L2CAP/OFS/BV-03-C N/A -L2CAP/OFS/BV-04-C N/A -L2CAP/OFS/BV-05-C N/A -L2CAP/OFS/BV-06-C N/A -L2CAP/OFS/BV-07-C N/A -L2CAP/OFS/BV-08-C N/A -------------------------------------------------------------------------------- - -L2CAP/ERM/BV-01-C N/A -L2CAP/ERM/BV-02-C N/A -L2CAP/ERM/BV-03-C N/A -L2CAP/ERM/BV-05-C N/A -L2CAP/ERM/BV-06-C N/A -L2CAP/ERM/BV-07-C N/A -L2CAP/ERM/BV-08-C N/A -L2CAP/ERM/BV-09-C N/A -L2CAP/ERM/BV-10-C N/A -L2CAP/ERM/BV-11-C N/A -L2CAP/ERM/BV-12-C N/A -L2CAP/ERM/BV-13-C N/A -L2CAP/ERM/BV-14-C N/A -L2CAP/ERM/BV-15-C N/A -L2CAP/ERM/BV-16-C N/A -L2CAP/ERM/BV-17-C N/A -L2CAP/ERM/BV-18-C N/A -L2CAP/ERM/BV-19-C N/A -L2CAP/ERM/BV-20-C N/A -L2CAP/ERM/BV-21-C N/A -L2CAP/ERM/BV-22-C N/A -L2CAP/ERM/BV-23-C N/A -L2CAP/ERM/BI-01-C N/A -L2CAP/ERM/BI-02-C N/A -L2CAP/ERM/BI-03-C N/A -L2CAP/ERM/BI-04-C N/A -L2CAP/ERM/BI-05-C N/A -------------------------------------------------------------------------------- - -L2CAP/STM/BV-01-C N/A -L2CAP/STM/BV-02-C N/A -L2CAP/STM/BV-03-C N/A -L2CAP/STM/BV-11-C N/A -L2CAP/STM/BV-12-C N/A -L2CAP/STM/BV-13-C N/A -------------------------------------------------------------------------------- - -L2CAP/FIX/BV-01-C N/A -L2CAP/FIX/BV-02-C N/A -------------------------------------------------------------------------------- - -L2CAP/EWC/BV-01-C N/A -L2CAP/EWC/BV-02-C N/A -L2CAP/EWC/BV-03-C N/A -------------------------------------------------------------------------------- - -L2CAP/LSC/BV-01-C N/A -L2CAP/LSC/BV-02-C N/A -L2CAP/LSC/BV-03-C N/A -L2CAP/LSC/BI-04-C N/A -L2CAP/LSC/BI-05-C N/A -L2CAP/LSC/BV-06-C N/A -L2CAP/LSC/BV-07-C N/A -L2CAP/LSC/BV-08-C N/A -L2CAP/LSC/BV-09-C N/A -L2CAP/LSC/BI-10-C N/A -L2CAP/LSC/BI-11-C N/A -L2CAP/LSC/BV-12-C N/A -------------------------------------------------------------------------------- - -L2CAP/CCH/BV-01-C N/A -L2CAP/CCH/BV-02-C N/A -L2CAP/CCH/BV-03-C N/A -L2CAP/CCH/BV-04-C N/A -------------------------------------------------------------------------------- - -L2CAP/ECF/BV-01-C N/A -L2CAP/ECF/BV-02-C N/A -L2CAP/ECF/BV-03-C N/A -L2CAP/ECF/BV-04-C N/A -L2CAP/ECF/BV-05-C N/A -L2CAP/ECF/BV-06-C N/A -L2CAP/ECF/BV-07-C N/A -L2CAP/ECF/BV-08-C N/A -------------------------------------------------------------------------------- - -L2CAP/LE/CPU/BV-01-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - advertise-start - l2cap-update conn= -L2CAP/LE/CPU/BV-02-C PASS connect peer_addr= - disconnect conn= -L2CAP/LE/CPU/BI-01-C PASS connect peer_addr= - disconnect conn= -L2CAP/LE/CPU/BI-02-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - advertise-start -------------------------------------------------------------------------------- - -L2CAP/LE/REJ/BI-01-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - advertise-start -L2CAP/LE/REJ/BI-02-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - advertise-start - disconnect conn= -------------------------------------------------------------------------------- - -L2CAP/LE/CFC/BV-01-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - advertise-start -L2CAP/LE/CFC/BV-02-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - advertise-start - l2cap-connect conn= psm=90 -L2CAP/LE/CFC/BV-03-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - l2cap-create-server psm= - advertise-start - l2cap-send conn= idx=0 bytes=15 - -L2CAP/LE/CFC/BV-04-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - advertise-start - l2cap-connect conn= psm= -L2CAP/LE/CFC/BV-05-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - advertise-start -L2CAP/LE/CFC/BV-06-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - l2cap-create-server psm= - advertise-start - l2cap-send conn= idx=0 bytes=15 -L2CAP/LE/CFC/BV-07-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - l2cap-create-server psm= - advertise-start -L2CAP/LE/CFC/BI-01-C PASS advertise-configure connectable=1 legacy=1 - l2cap-create-server psm= - advertise-start -L2CAP/LE/CFC/BV-08-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - l2cap-create-server psm= - advertise-start - l2cap-disconnect conn= idx=0 -L2CAP/LE/CFC/BV-09-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - l2cap-create-server psm= - advertise-start -L2CAP/LE/CFC/BV-16-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - advertise-start - l2cap-connect conn= psm=90 -L2CAP/LE/CFC/BV-17-C N/A -L2CAP/LE/CFC/BV-18-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - advertise-start - l2cap-connect conn= psm=90 -L2CAP/LE/CFC/BV-19-C PASS NOTE: TSPC_L2CAP_3_16 (multiple channel support) must be checked - advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - advertise-start - l2cap-connect conn= psm=90 -L2CAP/LE/CFC/BV-20-C PASS NOTE: TSPC_L2CAP_3_16 (multiple channel support) must be checked - advertise-configure connectable=1 legacy=1 - l2cap-create-server psm= - advertise-start -L2CAP/LE/CFC/BV-21-C PASS advertise-configure connectable=1 legacy=1 - advertise-set-adv-data flags=6 - advertise-start - l2cap-connect conn= psm=90 -------------------------------------------------------------------------------- - -L2CAP/LE/CID/BV-01-C N/A -L2CAP/LE/CID/BV-02-C N/A -------------------------------------------------------------------------------- - diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-sm.txt b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-sm.txt deleted file mode 100644 index ac26db712..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/pts-sm.txt +++ /dev/null @@ -1,310 +0,0 @@ -PTS test results for SM - -PTS version: 7.5.0 -Tested: 07-Oct-2019 - -syscfg.vals: - BLE_EXT_ADV: 1 - BLE_PUBLIC_DEV_ADDR: "((uint8_t[6]){0x01, 0xff, 0xff, 0xc0, 0xde, 0xc0})" - BLE_SM_LEGACY: 1 - BLE_SM_SC: 1 - BLE_L2CAP_COC_MAX_NUM: 5 - BLE_SVC_GAP_PPCP_MIN_CONN_INTERVAL: 9 - BLE_SVC_GAP_PPCP_MAX_CONN_INTERVAL: 30 - BLE_SVC_GAP_PPCP_SUPERVISION_TMO: 2000 - CONSOLE_HISTORY_SIZE: 10 - -Results: -PASS test passed -FAIL test failed -INC test is inconclusive -N/A test is disabled due to PICS setup -NONE test result is none - -------------------------------------------------------------------------------- -Test Name Result Notes -------------------------------------------------------------------------------- - -SM/MAS/PROT/BV-01-C PASS connect peer_addr= - security-set-data bonding=1 sc=1 our_key_dist=7 their_key_dist=7 - security-pair conn= -------------------------------------------------------------------------------- - -SM/MAS/JW/BV-01-C N/A -SM/MAS/JW/BV-05-C PASS connect peer_addr= - security-pair conn= - disconnect conn= - -SM/MAS/JW/BI-01-C PASS connect peer_addr= - security-pair conn= -SM/MAS/JW/BI-04-C PASS connect peer_addr= - security-set-data bonding=1 sc=1 - security-pair conn= -------------------------------------------------------------------------------- - -SM/MAS/PKE/BV-01-C PASS security-set-data io_capabilities=1 - connect peer_addr= - b sec pair conn= - b passkey conn= action=3 key=123456 - Note: enter '123456' passkey in PTS -SM/MAS/PKE/BV-04-C PASS security-set-data bonding=1 oob_flag=0 - connect peer_addr= - security-pair conn= - disconnect conn= -SM/MAS/PKE/BI-01-C PASS ecurity-set-data io_capabilities=1 oob_flag=0 - connect peer_addr= - security-pair conn= - auth-passkey conn= action=3 key=123456 - Note: enter invalid passkey -SM/MAS/PKE/BI-02-C PASS security-set-data io_capabilities=1 oob_flag=0 - connect peer_addr= - security-pair conn= - auth-passkey conn= action=3 key=123456 - Note: enter '123456' passkey in PTS -------------------------------------------------------------------------------- - -SM/MAS/OOB/BV-01-C N/A -SM/MAS/OOB/BV-03-C N/A -SM/MAS/OOB/BV-05-C PASS security-set-data io_capabilities=1 oob_flag=0 - connect-peer_addr= - security-pair conn= - auth-passkey conn= action=3 key=123456 - Note: enter '123456' passkey in PTS - disconnect conn=1 -SM/MAS/OOB/BV-07-C PASS ecurity-set-data io_capabilities=1 oob_flag=0 - connect-peer_addr= - security-pair conn= - disconnect conn=1 -SM/MAS/OOB/BV-09-C N/A -SM/MAS/OOB/BI-01-C N/A -------------------------------------------------------------------------------- - -SM/MAS/EKS/BV-01-C PASS connect peer_addr= - security-pair conn= - disconnect conn=1 -SM/MAS/EKS/BI-01-C PASS connect peer_addr= - security-pair conn= - disconnect conn=1 -------------------------------------------------------------------------------- - -SM/MAS/SIGN/BV-01-C N/A -SM/MAS/SIGN/BV-03-C N/A -SM/MAS/SIGN/BI-01-C N/A -------------------------------------------------------------------------------- - -SM/MAS/KDU/BV-04-C PASS security-set-data our_key_dist=4 - connect peer_addr= - security-pair conn= - disconnect conn=1 -SM/MAS/KDU/BV-05-C PASS security-set-data our_key_dist=2 - connect peer_addr= - security-pair conn= - disconnect conn=1 -SM/MAS/KDU/BV-06-C PASS security-set-data our_key_dist=1 - connect peer_addr= - security-pair conn= - disconnect conn=1 -SM/MAS/KDU/BV-10-C PASS security-set-data our_key_dist=2 sc=1 - connect peer_addr= - security-pair conn= - disconnect conn=1 -SM/MAS/KDU/BV-11-C PASS security-set-data our_key_dist=2 sc=1 - connect peer_addr= - security-pair conn= - disconnect conn=1 -SM/MAS/KDU/BI-01-C PASS connect peer_addr= - disconnect conn=1 - reset device - - -------------------------------------------------------------------------------- - -SM/MAS/SIP/BV-02-C PASS security-set-data io_capabilities=4 - connect peer_addr= - disconnect conn=1 -------------------------------------------------------------------------------- -SM/MAS/SCJW/BV-01-C PASS security-set-data sc=1 - connect peer_addr= - security-pair conn= - disconnect conn=1 -SM/MAS/SCJW/BV-04-C PASS security-set-data sc=1 io_capabilities=1 our_key_dist=1 - connect peer_addr= - security-pair conn= - disconnect conn=1 -SM/MAS/SCJW/BI-01-C PASS security-set-data sc=1 io_capabilities=4 - connect peer_addr= - security-pair conn= - disconnect conn=1 - - -------------------------------------------------------------------------------- - -SM/MAS/SCPK/BV-01-C PASS security-set-data sc=1 io_capabilities=2 - connect peer_addr= - security-pair conn= - auth_passkey conn=1 action=2 key=123456 - Note: enter '123456' passkey in PTS - disconnect conn=1 -SM/MAS/SCPK/BV-04-C PASS security-set-data io_capabilities=4 oob_flag=0 our_key_dist=1 their_key_dist=1 - connect peer_addr= - security-pair conn= - auth_passkey conn=1 action=2 key=123456 - Note: enter '123456' passkey in PTS - disconnect conn=1 -SM/MAS/SCPK/BI-01-C PASS security-set-data io_capabilities=4 oob_flag=0 sc=1 - connect peer_addr= - security-pair conn= - disconnect conn=1 - - auth_passkey conn=1 action=2 key=123456 - Note: enter '123456' passkey in PTS - disconnect conn=1 -SM/MAS/SCPK/BI-02-C PASS security-set-data io_capabilities=2 oob_flag=0 bonding=1 sc=1 - connect peer_addr= - security-pair conn= - auth_passkey conn=1 action=2 key=123456 - Note: enter '123456' passkey in PTS - disconnect conn=1 -------------------------------------------------------------------------------- - -SM/MAS/SCOB/BV-01-C N/A -SM/MAS/SCOB/BI-04-C N/A -SM/MAS/SCOB/BV-01-C N/A -SM/MAS/SCOB/BI-04-C N/A -------------------------------------------------------------------------------- - -SM/MAS/SCCT/BV-01-C N/A -SM/MAS/SCCT/BV-03-C N/A -SM/MAS/SCCT/BV-05-C N/A -SM/MAS/SCCT/BV-07-C N/A -SM/MAS/SCCT/BV-09-C N/A -------------------------------------------------------------------------------- - -SM/SLA/PROT/BV-02-C PASS advertise-configure connectable=1 legacy=1 - advertise-start - -------------------------------------------------------------------------------- - -SM/MAS/JW/BV-02-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -SM/SLA/JW/BI-02-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -SM/SLA/JW/BI-03-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -------------------------------------------------------------------------------- - -SM/SLA/PKE/BV-02-C PASS security-set-data io_capabilities=4 - advertise-configure connectable=1 legacy=1 - advertise-start - auth-passkey conn= action=2 key= - -SM/SLA/PKE/BV-05-C PASS security-set-data io_capabilities=4 - advertise-configure connectable=1 legacy=1 - advertise-start -SM/SLA/PKE/BI-03-C PASS security-set-data io_capabilities=4 - advertise-configure connectable=1 legacy=1 - advertise-start - auth-passkey conn= action=3 key=123456 - Note: enter invalid passkey -------------------------------------------------------------------------------- - -SM/SLA/OOB/BV-02-C N/A -SM/SLA/OOB/BV-04-C N/A -SM/SLA/OOB/BV-06-C PASS security-set-data io_capabilities=1 - advertise-configure connectable=1 legacy=1 - advertise-start - auth-passkey conn= action=3 key= -SM/SLA/OOB/BV-08-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -SM/SLA/OOB/BV-10-C N/A -SM/SLA/OOB/BI-02-C N/A -------------------------------------------------------------------------------- - -SM/SLA/EKS/BV-02-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -SM/SLA/EKS/BI-02-C PASS advertise-configure connectable=1 legacy=1 - advertise-start -------------------------------------------------------------------------------- - -SM/SLA/KDU/BV-01-C PASS security-set-data io_capabilities=1 - advertise-configure connectable=1 legacy=1 - advertise-start -SM/SLA/KDU/BV-02-C PASS security-set-data io_capabilities=2 - advertise-configure connectable=1 legacy=1 - advertise-start -SM/SLA/KDU/BV-03-C PASS security-set-data io_capabilities=4 - advertise-configure connectable=1 legacy=1 - advertise-start -SM/SLA/KDU/BV-07-C PASS security-set-data our_key_dist=1 bonding=1 - advertise-configure connectable=1 legacy=1 - advertise-start -SM/SLA/KDU/BV-08-C PASS security-set-data our_key_dist=2 sc=1 - advertise-configure connectable=1 legacy=1 - advertise-start -SM/SLA/KDU/BV-09-C PASS security-set-data our_key_dist=4 bonding=0 - advertise-configure connectable=1 legacy=1 - advertise-start -SM/SLA/KDU/BI-01-C PASS advertise-configure connectable=1 legacy=1 - security-set-data sc=1 - advertise-start - - -------------------------------------------------------------------------------- - -SM/SLA/SIP/BV-01-C PASS security-set-data io_capabilities=4 - advertise-configure connectable=1 legacy=1 - advertise-start - security-start conn= -------------------------------------------------------------------------------- - -SM/SLA/SIE/BV-01-C PASS security-set-data io_capabilities=3 bonding=1 our_key_dist=1 their_key_dist=1 - advertise-configure connectable=1 legacy=1 - advertise-start - advertise-start - security-start conn= -------------------------------------------------------------------------------- - -SM/SLA/SCJW/BV-02-C PASS security-set-data io_capabilities=4 oob_flag=0 bonding=0 mitm_flag=0 sc=1 our_key_dist=1 - advertise-configure connectable=1 legacy=1 - advertise-start -SM/SLA/SCJW/BV-03-C PASS security-set-data io_capabilities=1 our_key_dist=1 oob_flag=0 - advertise-configure connectable=1 legacy=1 - advertise-start -SM/SLA/SCJW/BI-02-C PASS security-set-data io_capabilities=1 oob_flag=0 bonding=1 sc=1 - advertise-configure connectable=1 legacy=1 - advertise-start -------------------------------------------------------------------------------- - -SM/SLA/SCPK/BV-02-C PASS security-set-data io_capabilities=1 oob_flag=0 sc=1 - advertise-configure connectable=1 legacy=1 - advertise-start - auth-passkey conn=1 action=4 key=186900 yesno=yy -SM/SLA/SCPK/BV-03-C PASS security-set-data io_capabilities=2 oob_flag=0 our_key_dist=1 their_key_dist=1 sc=1 - advertise-configure connectable=1 legacy=1 - advertise-start - auth-passkey conn=1 action=2 key=123456 - Note: enter '123456' passkey in PTS -SM/SLA/SCPK/BI-03-C PASS security-set-data io_capabilities=2 oob_flag=0 sc=1 - advertise-configure connectable=1 legacy=1 - advertise-start - auth-passkey conn=1 action=2 key=123456 oob= - Note: enter '123456' passkey in PTS -SM/SLA/SCPK/BI-04-C PASS security-set-data io_capabilities=2 oob_flag=0 mitm_flag=1 sc=1 - advertise-configure connectable=1 legacy=1 - advertise-start - - auth-passkey conn=1 action=2 key=123456 - Note: enter '123456' passkey in PTS -------------------------------------------------------------------------------- - -SM/SLA/SCOB/BV-02-C N/A -SM/SLA/SCOB/BI-03-C N/A -SM/SLA/SCOB/BV-02-C N/A -SM/SLA/SCOB/BI-03-C N/A -------------------------------------------------------------------------------- - -SM/SLA/SCCT/BV-02-C N/A -SM/SLA/SCCT/BV-04-C N/A -SM/SLA/SCCT/BV-06-C N/A -SM/SLA/SCCT/BV-08-C N/A -SM/SLA/SCCT/BV-10-C N/A \ No newline at end of file diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/tpg/94654-20170317-085122560.tpg b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/tpg/94654-20170317-085122560.tpg deleted file mode 100644 index 3cc985fab..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/tpg/94654-20170317-085122560.tpg +++ /dev/null @@ -1,1026 +0,0 @@ - -M'&/JP\$+#X83?)"[ M2E=\N*7*U 5)JSKT(5#=>@^/#]IP*[GTZ0%0]$F(/$ -MEK[V7>349??;!JZJNFZ CK=QGD^FOYV^FU>"DK<@0U*##HV\H9&_%["5IK@1 -MA9F,FJO2P^3:4_]04%-0T%9=^XCMWKF"L$[)%)G>_I 0Q?@:H)&1HX)7VY&. -M3 *!JH;^YUJ1[_*7JN2'Z5^*0I&NP+[LAE:>S92BP^T:3+B>IKFJJ8A,4Y^L -MUX+P_C'Z#VN20)A!ANN2@J#!AYY4"KQ\5):1]+[B\TN+BI"AB8NJH ,NZ(() -MG>K?^A\-B,<@/IVC+$#XFXJ<65V*OE'"L]7*OEJ*C]CS^."A/) (K_@0 -ME"&)D)^IP]?+')Q(%NM&7:VL@*6#D!-TU,7.WG SERP(@*R+DH"MPH;@X:Y) -M]X6NG8^EC)N?AH+3[\3SG''R3(?WRGF0NZ#,_4%*E)&>&9R)5[F0OM$A0Y.; -MA8R7%EGBS&\IDPYNR%4ZV$FK^(F[P B/[TU86=H%S^ -MH[H^EYQB:MZ)A:2@IV)4O=//SXNP#%F]5N&<3KZL>(#6'H"D4\DST(O!(![@ -MUYZX#+:1G:V5BE&TGHK]+;@:^JF;;2-&@WD;Z8I9*SB5D+7 &/J8NI6GYGMDGK2(U+_)K!,I$6Q4R% -MAIE9AK#]!JAFCWWD:A8K.9O/I(;D(F2G*6A0YUCMIOQ5M*VD#1: -MG9^)MMZ GIK7,^R0^M"/\%^_B9Y7TLQ/^N?S1 DEF 6XUJU"V_3_U\44H9.; -M6C/PV(36QT(9B9^.C)*YUP?BN>#F%4ST/JM>\*Y;K)J:S+4[O%?G[S[L"^FPVC9/W+).O23U=;?;2EV+G5"5%KG(EED8SLB#Q["2.9YW6IB4DKT QL7P\,%# -MAY^ (+Y+V8GD:B'!S H%G*;=[-\ -M 0+QQ3;G\H21FY_P4-)38+ =K,/38[24B[6W\(N-L/(9[/_LY.X/OLZ%S;A> -MO0TN'._"@/.)DDZ*AGY.V1XW%G7:O+R67U"C@:L%+T\24!11KH^]@[UR\Y\T -M'G.5D/)=H)R"J6R470%+AO24DHF5L -2OV(60>3Z]/#0\HE4<(V%GXBM% 0- -M3X-@G;H%E[2$DL$P-?W&"JI0-EV0AUP(\>] XIW!BI6DO7I9T33VE._FJ(*_ -MKQ6$@E,QFO?! P_#OYFAJ_:"JEF6?]O2PM3:)3"+BYBAK :/H:SLBX.NPOA_3S>U9*&PG[SAU:$=KQR\M>?\!X3 -MZYZ?J;\8N0V1]JOBJ@3;9=L01YQ<:%>>U)-!GAL!T^"]VF8KB/^$EH.ENI:4 -M[(80V,)1T>^'[@;!KIZ5T4.RQW)2M,X;#;8LTO_GV8V[OD6F@JNK JO G$2Q -MH(=0E:GW!3:0E_/T4ZF!M!D-F1F7NI*^QP;A%%V8M*U:R59]QE^+$NONY](% -M28E"K!J#K5N5E8#B_OU9L819J(CL]20ZBF"L4*4D#JV,*& -MYJV<6(JKEZZ4+^NI?%8D<$.P^*4 Z#=7K>XM. -MU3'S/BX/AP [V4*K!EY0C-/CE//ME"./3?_H5OQM$R!7NN&@21#()=Q)MEIG -MU_Y)N7IZ .'V51 ]]L:;LEZ+DI"H^K R=CO:@D2&#^H,PQ!"EDZ>@'"*JK)I -MM9<-XF7"=^(HC+:D156UME\ U?+P=G >A(^3=EW1ZB[7^C_1CZ&R#Y!"F:FH -MHO_0SL+1D%1$55K!?)*MLC?(]!3G_A,(AXY&\M.G+@>5;>6Z]?^Z&KBV:9N< -MBRWP0KI!\#7P]MOC;Y)<5(NN%8*2GEL9'\7/SMD 1Q6PCZ]6;0T*&KK)-^4N -M-OV!3U6TE8(,B;9"K*0WH=?J*<_9J=-(NK)0LY:FO5R)P'*3V.;%;^Z6() 2 -MWEB>F*H-#0RERD0TG[]6I4)#T_26M/[GQ8V5MO]RIY&RN%W_S1G/L829DMR2 -M]('/K/92XJKUML7OR!,>P)J*"H>&-Q0-\]("+'L^-EO>=(036Y>P%.:V&"8V-7ZT139&:(YNN@Z VJQCV=M VOMJ:E/XOE(L[GZ4;QT"H -M$!AY7Y>2^:N K"-$'B0L[FEJN#[Q19:D[2;=9F*>)!$@X/4']#" -M!1&2G)8;"$M&=?M B=+DQ^YQ"-!FB)9'T\^32NDK[68N]-J[6Y^IR:Z(A[.. -M6RG95?0:6^K'2FAK[7\O>>+_9#G(I4O*2=3,_<+@R)UM-9DW*NL+I?DJA^ -M:X8+&-[1=O9MX:R#BIVVVL*?&,-#U928LBR6DI:OR/OQV_;Z"H13GEZ <)J[ -M^8(-)]\+U9V24@V?@HK_A'3=YS&MN]3U&:<&)%JJPHZ6H4 --!,T\L,(ICBY -M$XOXI)]-\^"U_CHZ!52.^"'OK$V=K;>;@,34R_HCW U3FB1#KKV/@Z#_S.'% -M9M 26;U3E76LAFN3DZG5@QO8R.G+!?N(V9N<2;,*E9E2@K&$0L$X+707X.^\ -MT*.^GE""6H$?\19Z=D.11X"6D]CR\RWCD_%?L8JF/FV$&X]!:4**[ -MIJ&85T .P5K[]>8?Q92+TN#S6X[[MHCH"/&KV'J%?' -MDXN2D@L"PEG3X\S?#I9!&(61@+:/6K0YEXK-.ODV/_?'<;&3^)J!2E##A^,3 -M^E;>K7N=]K<"P^$PWC05A%.T7+ 72YJ2?GKS[_#*?9/+D5I=DGF1MKNMU-:; -MTA'SN[>Q@KJ'7 >7QXCJY?#F JZBH%J*TH7WD[S#-.W&]"["KX^N/$.2E8- -M\'OI3>S9)=OP3U7$O"FNK.\J5(+0IC!.XWY;M$\. -M=$Z/KD^-C/1_0?_L_+W"8^N=B7="A8V64I)?G0DOR_KWS/WPQFUSE4C6DDBH -MPJ(PFL.YN.[W]D+^>+I&EEF\EPW'VQA<& I.AD"V5P+ .6_&1:%>-O&=E8%* -M4Z0_F\3GXHI]D-*1FG<:^(&&FQ$__=_Z\-!-I[N#]"^O-VP$ U1GN0\!K]*A/C9:4F99SFM+[ -M[/?CV\*/O(Z#ME:'OC&&?BVA3B31],CN[TF*EE6"FYY(_IXY];+QIY%OQ/?P -MO'*3\1.ABJKLSL+ 7[&CG)>!3%[%>BSWMCX#>%VV+I"SC'*XM%O%*Q$\F$3R -MFPZ16JEA@IM"\L/P^B,0TK:X6KG'%9"W[*C0N>76+Q%7H<_>PHYZHI3A)I%T -M'CJE1J;\5+\;VP%IFYWG(<')6(D;XR:/K)56#*O 5YC#VK;WD_H'2JC>IQI2 -M#Q)4X? :TPVM[5T "L<4HRZ>IZZGK_N#H)Z#!2#PQ>W&P5H#TE6?DII]0?_U -M&*Q64E:.A]I>Y.KMN_K%\W60 9M4G7>#89>?AQ=WP<6$M/BPF(@#DXY8H>HV -M_98"]E%UHB\\ASAPD.K1\^:UE\.K'Z!]6YL*DABNQ='FFM8U\J>$N;^)5E:; -M)HY7P\"EFN02YN[;E$Z.O[U&K 1"I3*7,,8PB6.?)NNE%"<+^?)R\BZB9Z6IC<;N)4W -MEY_GY\JLE%.13J-^"6Q2BLC7\M ,DGJQ)(E!VJ2>JL$T&>X]XL(MD$C9 KM8 -M%Y>>1_Z3H)?PNK"UEQY;MXY:G%GHQVX4[8_K5(P&CO(G'D&LVCKQRXG#YNWUT]23B'FSNANK -M@Z20C[BBQL4UU=+ND/(1D56Y OC->0^5A'RAD:0)&OZ$T.+\%E=K2E)F21L'SG5?CVIO&C8Z+K@7F\3[O\+J% -MK ,6OHYV"U3WZ=%^O_I*[+2LOFNZ'JB&3Z[%X$%9K\/(9II5A+\>CLV44)DG -MY"7V/;KFB)A=4].7@ZASJ'":Q?OL=UEIJBM)BH:'DOQRDJGTL!*[0>HY??Y= -MFH1(OYRWAUJ2T4S+"ZR@FZZRN4&HP\;T]IH2Q9F!DZV225N_C9);$_T!Y9J6 -MB?F&05X*DJ"#A3HS)L?'&@E>::Z$F&OD%;D[>K$/HNT2&C7!VF$ _$SYEG(;VM@7+&[?+^VI-.F;>X -M4$N*I)"B-MC^$ ;YV2@#T;JXA(JZ$ N3WQ-JL"%2M&J##F86WT/BL'P -MY.VZ(+&==J "\H:'QX.LP/#E[>8/BUZF'QI-5Y"0G*"V[S?D9O%'18Y.OQY. -MBN.WELSHV]K#\>(NUEP8;K>_4;:W^HE8]=?]M-" G)V?4[6AJYZ2EEO(SYH. -MTTO,P0*3G@V)GMG/YD6U,L<2Y XGUX) -M5_*33$# Y3?& [B;I:JP:89:E>KG^_6:7=8*G*!8[&^$;(Z@1KQ02XQR>D^[0?W8I/O-HL#UDI)0DZAU -MB0)0^(Z7S,)\T"?Z U#6N@25I]B*U0;.UH2"=%]>6:ZX\2'U/M(5U716I!UU -MAU>VX _/V?RJT)V2DA"&F9I3<(VJ\_9U\.#3L9.F9)JHII.?H+_E_M'N.AC' -MLJ26B+DMEGL&T.?A\O3"2VZZG P?TXM@[/:MS>W.P<\+W$D$U;_/>$NY>I>X -M@7(U+^;^3T^$B;-_E[M7GA&.60E*V?<3XZ;8V;L]]0J6EIF<%& -J5L2]SOF -M)..<4(JK6EB.FR?/*Y/*3^&/#W\G-)F'B? -M_I^'2E1MGHKG[)A4BPP,6SO'#EU2L@8-FX'XNKJJMD?P]A#56)N3GJ:]0(]# -MKQOCD)&4K4(9#][#/G_6O= #>+!255^7FJLR<%C8RX_1K[:$A7N@B;OC]X-8 -MD<#T'M<6O7NCD]Z'?G!;B/,JPSIMY8V7L!]:YYA>@(CT]#ETYC7;3**MC$LL -MGITZ!Y[MV@],Q_+DGQ6>J,^3K(EMA+=-(OW7L//1@8:QI5G:JH(>;!2"QRXJ -M+R[F!=L=DUCVD5J60+I_Q%R+1_*UQG;UV46@EY],D=";@:GC\)J8F)M;W8R; -M*.+3[O8_Q?!5A-&;R((_DEJ? LG"R$Q\%E20$:^YD96)27[S\]/WG8,";9:< -MB\;UOXW--C77[].KC!/_VJ;VMZ.4P+KM^M R]8]67@PGA[R'HA)=V0W=!13! -MY%:R5&I>GJT_;)R Q5/7[);$"[J:>U7SEY&\5B95RW<.4*_2T\;"V(-3OI]Y -M\@__\X:4/1J3QT3^-=.JL]O[I3=Q1GB=J]ISE]AB"MH2U.UFE?U7^,8K))8C=:WBEBA$ISUM_JO# !"7X>:K!ML#X,"_.J= -MG!R4+TY!FAEF5YO2PO$U[*- [4:L7U8]CA>_O)CFP<7;TQ"2IKGZN5>GGPAS -M.;5>5A ;3I:$O*=[#2@N0NZU'H$O7!BZB==5R7@K:4D->IP,'V\CHW@)Z40(>&U;>7 -M1P/+%KBF6Y]?D)!6\L'U->V;]1S=])[\45:#HI67Q LF:<'M@% 1!+V?BN4)3P"-F-18@GM^ -MB*CJ)3+6X,]04)Y;!?R;@V&PFM7.UT&$4!&III5*O9)WV=L2=^YN&LJ[%^V> -M^8,L'!J(D2(FN_1!#SIX%YN/5E^Q;BS"YO_$/\M-5H2=KYR&T+"@GN#,(?G! -M#\A+NYR\%)V%/7N.>R3Q[._&\]JK7Y"+2Y>*JA>IIZE)7I@*XWH6T32[6]6: -MDE";E_',D)?HU"T:YM[A4""1K*)S\ED S^+T6 O:>(>5&_W',OEWT#[C78"> -M&9/2N;T(C;VI#ML)O9.24?.8_!ULCY#%%\3&^]DT8IN UZJHKOWRJB$S^58O -MVTM:L8-\#__SHTK3:?&_L/#V[).5W*:>.9*3O%L"P*T-[H-"IR>MSFR?C*V, -M7@BBPF?DU' *@?*UWU>:HT);D=H.\9>.2TT$P_?4:TX,\+NFJZ@";%6XXS;N -M\O"]VI6&I%N&,+:S)2L3YC&CGJ]R")Y[PR@P[;/_R7I0,$)*=0Y7SNZ"6D_%]Q="M%!&:FJS7 -MEMDR]?W +_V8I>";BHB]UK.,S/(QE??CBZ9@20F__):6I('^/,;W]=B/6Y^, -M@IA>B[!3FPDMXWV\C 9CG6)O96G H-MEHO!3L#FE)82CY>(F8FACI^'F^\P\%K0YJ>( -ML\Z3DHZWO$DPP>+ TPT@28J,F+R&64#!QNR0/]!8CU::O8^>O6>AH$+!S/[- -MY]/4CY#_N8\NCTN@6[?1:OF6]?7%!U>?7UKPC5)"XY*;\,82 ^\%R\-)ZJR9 -M7UK0FZJFL%>MTR9W-<75I9A0@EOP6)^=4-4#Y@^CDZTT45I;R?XY9__P Y!2 -M7D2 ,)(7HJ8:T<,*_863^XETD)J;8I92Y_(E]B_3U(>2X)WV2]:"AIS''MS^ -M-/*(EZQ:@^W7PK6*(.)9Y/8PXI:"! Z?BZMI1I;91/[)R.7"MNN:D Q'^KU<\5$<:<8!WC4$,SLT-V_Z M$U=GJ"^3D?;FF.T@2?V -M/K0[HE"0G'@_UI2;]]COX1F<%%&5CISZ>\3'Y-_Z-/.JEI.MH-,7JJ9VE_%= -M,@YVK@V2V6]?*7-+JUMJ/6I"5IY^5"W.R$^'S^486[]%* -MKI$C6Z9.F*)@GKB'B %&2#&U3&8K:U9&J81DY*05ADDPG'6X$8+D/:8<+Z) -MN-DM1\'<6@O>?07UF%C),M,P]/X*^GR3AU99G .AEBG-[=NPF9+?A(Q=2]N$ -M3Y\"DKTZQN49B(YX&HF'3K:*FG,;O3KG\ZU6A/.I@RV&4(KP^C<\^\>E#*1% -MZ!F/CKJYCIO#QX&,RV;0CZ)=J :>#8N")MLI<]7V+._BGI)]FQ>WD5H(:))7 -M8*(+U0L(Y^-8N0X9$+RF0*I?K,Y7S=0YU/Y$\3CVHKREH,*!P0,*T;BFHXV. -M7;B-1='8T/OGR+F6O@Z65ZFWJ'^;052%R)&@$5_ 9[CIPQ1=7FHV9>NE*HH6="LC/ -M2-'6V$:D7!^]AX]O>HW]\3@9I^;U\Z:8G)M7LHJ*T'"@4L$-^E[3AL[ \8K= -MN;>LF@^KLZF0>MCPEI/0N\=:=C>(EEU*5N4,HN"4G(H=I8D2C -MMJ"?DX&;MP6R*N#-PW:/]WPO6PQ)%,%VJ:ZJ. -MJ*"2@0+#]^_N]@^JAX:?0J:-O'&1SE>@COOE".;#]^9)FKGW"?9##K:3L'JL -M].TPY]##+%);A/H'0EL'W(\0CY&TMU"G^KG"XG3:M";)+'G_E:!=@JNX7)F) -M3T4QOG0#F*7WDZED%C="PC/[_?%4KH^64UAKV%*U0=G'[/04B:N2N,F+GIA& -MB97"X^[TU_971:1]B:=6N)U&NMCPSXOY#\[9O:.=@$,.0:B25[L'/O;%TE+/ -M2:H9@YY7C2QT08^0S2VJQ\<*U4?B/]2=I5NEKPN2\+:+(O+'-^X^YWF@DYN/ -MHKR7)KXL-1;176O#6D!?FKJN&QW^?C\J;DNQV -MBZ'6$*'/'ACJTYYK!F]%LOM)X9&@F;F0,'![/]D:.- -M6@C^ N/$\2PMFL.8!!'UEA&8GN2FGL'#0<05D)X=FJ*[F(&6]PWST-7$\+2K -MCJ2=>EE?E=*\Z?IMU#)+2IK* IQMAX!:O\JJ=<3\]M"+1I'JJYZ]"*2:G5C< -MR*5C0/&/5I")E(RNJ_B5VLT^.6(ZED^'NX]3G_(MC'NZMIG,S_C5_2?9HM&> -MG'BS>O!FBY.LEYW6(OR_.$QA8H!T494B8K,]'35DI1& -MN@@1A)^2_@VAI9E2XLL05! 4W9(U69*P7E+1\/3[E]+@FX6AL]>-#8*!O**Z -M/:S$SS^ZQ!JKC87[B[@)X_R@QOP%N?>IO(*&A<\1LYLA#$S[(<=1CO8-K8,: -M;(J0]XCG'_F@8L2:HKQ]V7J<9T*4:%9;04[J"^.+T<, @5^[HIX7N[N4N_!V -MQ-[O$/_D<)R"D+VDR9Z7 -: AA"$B"R5G9A+!_#@_%;F3PJ<4XZ0E5>KL!(J -M],+:DH_"0]^D=((*H)I?V.@U;<9ET8%0HI>H@Y1T YCU_F?P\@-)L)!6UDM. -M#XLMI\ 3]]HP U[WA)Q/.$'/*%"!]]3!:I[U!@<2^@J$F V0ED19VOXSUN;V -MXKBMJWZLEAN:6*P6F<+"R ,/Q^'W2(C2"4N:$+N"@[B0F_+;Y28:,L"\H)I? -M]ET;B_7,YQVOL91TGE%:FU+K^>YOUE.?D_ %LY/^FTQ3FLW_J39\\EX4S**Z -MF:(&]MGKP/?5Q=C*G*B76&C=IEL:HL(NFB?AJ51RJQKO5C!)O '7T_?@[\*B -MCKR<0UQOBV"F \OL?)D/Y1:#Q/W.@]X.O9)7B4B0+MYR=1DYL)P\??[<[2 -MRU*47U>'#*6@O&5B$?I\V+^3H%=:4K9:GX0!5CCZ\_X/:S9<@:^&5I-PM_O9 -MBERO2_; 1PY?A(,/AJMKG?DG,?]^U"?3XY)5$*S/BOF!IC.XR,C0(J+DR\"< -MQ[(UDU>'AZGX(%:7YSYCYN;>SQ"0B]TV 8NHP0[ \_&6(ATF79>O 3#SKL9O -MSYJ;M/$>]UG^L%Y;&?KS')ZQMJ^FM)):AD87"JOC+/H+,D>4$9J?DUW&4HHG -MX#3:-\F-J0>LSC -ME\";IG1["//YML:23[M=KU5ZSN\6"&6VLR$,Z O'!\S9$"*V>YL C:J=K^=5G>?]\E6\S!0\Y2?DEV" PDYEM?E]CS]_#7391&JIG+ -M4E^5'<<4+3+N;O*.@ER>%(V^@I./NHG$Q,S5P/!'M]P=B_^!;SA63Q+K^3OE -MO\\^EIT?2I:/&DFF#[C!#,"G^\_^Q39JNERS6Y:;@Y^QAE>9__B;_=IK49CS -MK821OX*1 O;1F)&1O7*0F%# T^3"=L"C'8@)M8:S4M/&>YK:R0_!CIB;E7*@ -MJ;:ZD'L(U#EZ1L,1F2:@2UJ-6$WPC$CJ_3KURHN_AJNL1Y)&$HSRPM2ZUBS' -M#I2(3L=:;XUFXC -M.HNR(@->1T^:D(JBY_62- -#6C@!EIM/E:6*23IM?]>20:D&#>F,AI2[#$9^ -MZ,_@^,4#X ]V48P6EX\8H 9:Q_1#-/+N#P*-A8**1D">5BF&@0D"B<\##JW9 -M-=BN!+M65;CYDJ&.ET<^*$X.>LK.*'ZBB+2#*T(95U%2=#(&:@+*@>_,T.?;0(+!+%$&;K&J/CY#* -MHM+QTI(/1_ [O9Q(A)):NL#$^1)GYL6,GK&,5H>/:Q!>6SV/2725PU=[ U>MOEX]2N/^BCG(,M%:DSM'B^X);Q]:]F"RRDI>KL()C -MIE<#,KVWF^XB_[*7KH+QKE?E:X-ACY:1]+ZW6+/9(L7G[+_S"K*FG,>\G'*6 -M<#G'W<>05).VA)^%KE."EACQ/N;UQ"?;O5^P"5@;OY!35='"=O746TJ5E+%3 -MA_;F(" 6>WO#^1'T'((FMD6&\.WL_3B..1& -MQU:MGF&KFDM\3[*GR3+G\!K!8)9F*9F3?9J;O_&S[.6UQ -?5X> C-N>HJV. -M6/' I0"3T>96:O[58O*>HJEN5I)[!OD:2=N G'!!>=(*9KXW5Z0,0CM!SE4^9OI,*]\,Z -M=&?/AG&4G?69 %>QM_O7'JO;K?R^O:;97JFL'?L-T.$_^B+P2:>&.1/95X>B -MH%GT./;BZ9?;OV-D<)]E#M3YRU$YBY61 -M[$^.F)BAI(MQU/4WY_32HH^[VJ/; -MJ:-R_Z4 1;EVI#V&6.S_92M2&V;I'9*R-S!T,;VTYU>K,1)EI];N$>3))'5 -M$!3[\+TLFW*6I:B<0:.20N?B3@\K!F6OT^L/J8B#MX]+>,2/./%T.ZN -M6*1Q'I&^FL?<]M"?H)1WMH&:OUG^_)?F]<"=@#9>II%+^JRFOL46PY;^O<&- -M3I>;O6I:&_<3[=+FPQ"#A$KXEDN;E_&*&SIU^C7/$[:&>YPG)GH.EQEO,Y,$?POKPG-9QO(Z)UXNHPMKC -MK***N194FK<"Z#/ZW^;;K8N7K/>7XKM^^?F -MWB$269JXK1.14E;Q <#^9I+2:U*,AE^;FY)7@L?:PM,>^FS2O_"8A)^^/KF0 -M4AE#1<_(]=5T3(Y_KY2O60O(M%^9M-D2)U*!-/;RT)+C-?(;L9%2L-*;AS^4 -M=8?:P_E[YA6;=+3_$BC=C8#J31.19G#028S_OXY"N%RHI)0+0MZ7XMAS=_\^L;%;Q)( -M>IRG5Y>5O@3CDS[F/I""D%6*CMR52JSUEMD<1OT5V1Q&O[F4:7Z6BZ#RDM/B -M\3;RU\"2GBB3K%YOMYJLGI_-5@OO^0C$4D-7!@T8CUEI.#DT_>BKQ,\.S2 -MNCO6B;JMA>]R:X*J6DT(S\O3]L\1S[11J!:+X8-@1/W3\O/0+OK7 QZ>H9*$ -MSJFGH*>=#5?HP$:CY_]@JA,C992@Y>MV_#PY_ EVU06<+E?E8)3!WVE -M *W3H-"F2KI;9]'YOU -MQOH*UJM.1D.)C01P2.B-_M?FY<,^AFA0JZL&MJ<4<<34T#?6(QE2VFCOAFZ -ML(W]+?H,[UR@Y)>$C8J_FXNGP9I(TQ;WT[ L#Y&8G-JJI(B>T^!6^-'"49\K -MS(KE18J5D2$#CH,(LF!=PU'>U,+:]<-4$YN\D@$"EPS*T[65B8N4AAFJ&1?K -M[)?RP@MY]I:MCZ% DJ&,DJ?)SM*%G(.;F@*^5L)?U^5[T2?&SU1*G^V;@X>] -MU9;%P7)C>CHE2)9!NP&'6YO3*O$S_6XU^O+"A'Y 0JI;:4765Q',R0\' U6' -MEH6437W%1J"6K0=I[7OW]L-*CH2*WE(+F?&H5E*:[M *^(?1Q0B+5)Z@G!:[ -MNH)@7%^A4!6^)B+G** +E-")N9K+!M+DK_K+W7!0@H_G]C3P\K(%_Y&>L?+% -M4[T-NH+EZ440G)12*QH9FIJ5CK<5\O?W\\#)CY:A^U.-J%"EC,#Z-MSR6(>6 -MI:U6RUJ2 X_ UM$F-/?SAQZ,+>^S6@R#J&$;)APO!9DNOKW"?CJNJ6[JEW>CY^77P, "X49I;IZ"3BL#% -M)O11HDN$Q*5:K\+2K?#&QMM<5(.8LB&V2X9PJ2G_ZU&?H(&>GY._@J)/F8+ -M[3HW\N"ZC\&8\8]=OX.^(>'%GJ:A0!DC\^8WU\-71CC825X! -M*J8 D,3J>,7NSMQ)C\Z,'+X50)0WBN^+G*(DJ5VW@H/!V2.)CG 8"L0#T^P,:N+ -MAZ17B<"KM=8N*(G7H/NN37^"7Z#8\<,Z,'K*@XY=X(M22T>26K:CP-7?WI,8 -MBS>L'&FH;4\FLM-,WC?$/!?S!UAVDK86KU>#D*:QR,=J]+,)4PI(6"ZZ1\YFZ2(NHJ' -MF).=8Y>:R.+:P8^;D;ZPD5)W!8RXT/;Q)O;U0ZE>.%S]]!NI^Z&]DRQ -M=IJZBH&B#(W)@@7+QJY;ZT.[MZE;"*)=7Z+CUDNM(N?^P-3BA" 6NQITMBT* -MBO"+_B*0'8R'G'O@]O3N>OKS3$G2^0^(NE<#GGK#S\M02D/Q_W:4RGNBMXG! -M,C#V[%#EPY1F0UKKGJ;?3B7W]?0UD6-WIJN;AQ[%F*7A]#Z:\._5BY><3*O[ -MG3NMEDL- <;HR\?PEH!<5,3RGK^UH(M13\M"4&KJ8@I[[\6/!\^0GF%O[MH.2 -MB+WPLL#W]_4P-!L:D$Q=NX=6!KM!T=XY.G#OVIF:K(V#!ZD9N%K#PQWDR-[% -MY ^F#$SLM[MJN%ZHP4/TYA8P6LB_EK*"?E*:"^@PEV36 G4*_[GW-8 -MCY."H[G4^$BKB, -M5P#4V=/E[E.#>'M56@"Y5X*J@7(/PTF<6 -M[N6FC NQN/>0^9[$PJ75WJ6>65J=BA$A:[E3T/W%6EB G9>5JECAC%?!_0]) -M\* ZA9:AFD*!GYO8\O;V<]K0FI:4B*NY5I1'C%#V=3:V Y*[DML*N)>4DVH( -M].W&-,;PCU8)[9J%Z[BAUBW*S.L%3R+8EW:=C$M5A)"I^I[ NN$0XOK'S;^+ -MH:HFYJNQPEK#$L9)Q*OL!P\VAK);4*Z@K_;1H8X?<,/3.C_@(X1V?H>ZD+J3 -ME2IA^,:IRG\JP'GK;:Y!"#7FQ LY/=EEZ64O(]W^62SX^V>&W/ -M6XV I%^IX,:)R4]#FF,?J8Q##:4T1.FJW"+);'V]R*D$:K -MNJ:6\)<(D_GWQ'XBIIKBB1:=.O(0JJC$)-_V9D^GED3EC(9?3<"0O]G_J,D5 -M6]8I1@^-AYB.B[F0?77^"$HT<:+_=&' -M?@Y+G['&GXD*F<'W]<8*O)""B1X'DIO"_]J9S-02F[>BFA#C\O,_[N;)7[R2 -M'02(GHJFE[K(P_#=J$B;JZ8E>_M,%_T16_#"?O(FL1(FT<%+)S=;+(=B63WN.CXF:F;F0 -M5HL2N^3F)?S(DP>$IK>WDI8@99^;Q>QYT\'_C<\":7^9PRF6NX)0A* )\<#W -M1G'. -M03CN]L8W\X=>7#VO5:UOS .:S-P.S>O'X@J&1-1&CI2;,/#ZS/8M[AW^!Z], -M%5,;\JZV7B , QD(J,>*K#?><\)*;DI 4NO?B>>#WV]5-ED914*'Z -M"\SNP_91D]&-IEU:D\/6N-65_L\=O88?4]2:7;"0EW$'04F9D,I$IYTJ6_AV -M@PW &4?ORV2-6BR:DJJ*IM*IX=0LWI)/ Y*DDHI8BEN53?$Q_Q8N5\6LFE&Z -MAUH%4T9-S2' ZP#2AM"?SYV?BPMEGN%T3S%JO%I>IMHO: -MPX'$V'S)\]P;FK2%EZ9-ED.@6EOB]C]^W_Y!=8F*CO67OG/A(],5K]A*5))3 -M7X.)*B#N0!*+,!S;G*1QEY*CW#U)_X+<&-"6/(ZE_X%[EIW2T?ST=\/+A_PU -MU_N(OH^E;,&X93+0(PN4H9U!FWQVD4QEXY;5YO*!E[I0"9S^H2C!I9+2S(TI -MZ_'+KH2LOX:/O*J4$%/Q,><:WC7' SA0BKHW[KN"#):=T5[!XNH-S:[8D5Z% -M0YN60IBBK8^;I?;DQ=3OHZV6&'B:HJN=$_ZC&;&:4?R7^).1PI(L_>;$*5BQ -MF_"%\5J7::6^@7SQPIQ1HIZ.B/);\HZ9#/#@^A^GUKB'PI] CXN?ATX(PM5& -M-_.Y3A 76X?XU9>7T,'E+9HD"I]4#X'IEXWMQ89]PLP!Q5U%V[NPF!6-/D[- -MJ >8S9(Y,#J[Y6&(3-> GDN;FJP/N>+B"-[1W*7;=(AKLJOI9WJ/7_ -M[3?N%\^>E*>KFDB#D2W4RN"5D'Z,FM"9T,%^P<7$/E,?EEY>FA&(NN&V6Q3# -MP-NX64[FD0H/D^=?PS]!"AFJ/J-M2EE.X4.)LM!7#6Z:ZCZF0K%;7 -M:M+"+5/U]]57''F5BQ>=2[I^KRB**P_CQ]SNM%H-F1:EH(@WJT+P)NX6[/61 -M?:T1 "*"BX)IA*O P_H!Z^A= ]1(F@L@VD:K@@2!AIK'PD7[U]/CM=PCE=*7 -M I<9QO,54R@DBCB1Y'E^4]D'? WJ>9=IJF -MM9TKE^/N-_*;HI.@4H&/N)9)E$/S^,9V!]E08%&SBKW.G^_%T,5_\L/V@U1Z -M:FU&:VF@I+_3^-:OWO/9GU>6KHJ=CQJV_XE2\?F:U\8GXYK.OZARJH)0K Z> -MZ1@M]/Q_S.,3RYZ?MT*ZJ)J2IG")\Y \]O8T 4>\0I66D*B!P4TCT9GX4I". -M49H)V.+T_Y VP)2QDX^6<9Y0DHR=V>?/^:PCE%L0\:GY1!^# L#35A?BLDJ, -M-E/9NI)4'[R-ZM,7N]6? NC_6ZM.)J"_\.@1-_!NYHU/F=6;6%6[(Y>3R_[) -M+0L32@R&6KA#7 5*I%I!*/B3N]KMTXN.6P";CD&:0&RRN^S\V,;("A^CX:N- -MGH&*6H;^D('^7UDQ^4;%Q-NZ2%^6AE*?^L+_#[8&B9:[$'<*N -M_I &V5;(&=.9LI>3KZ4?\304]B>*ICWNOL:N@Y*GK5B,#H3! +0Y39Q.29H; -MBZ&7U^[U'"W>!M#+J#V74Z(;&%.@5OT! -M]"5N1B;BG*!QL3)S@8G#6L,:1Z&+C573EINHXFSWP-> K)*7D:9=2XM@!JC3 -M%P+ESI3T!O9\BIBF6@/-_NUN\"71BPY$]IZ-TA11J!":_)8UVU*^)I>2DP^/ -MH(^-*;SL[; #2869B$6'G;ESFHKPU FM!L/EA7>_P#F:P8^X%?DAXFSZQ>_U -MJ0Z(EKBZ@4NAH%>3".SIALF):P-"H[ROMUIR ZX?DG>"C>K6Q_ILP-_\N@Z% -MI8*ZS=G1UEP1LG:U\*F*S?G&YM(OVKI=MJM[MXG[>)>"T<\@M'Q6DY^46?#Q -M((*HP78W=C?/X$K=Z8/\CH7<%:C%(#/']L6Y>^Y\4&>KT]M26)\S6 -MCXP_+>^M+*:? ^K/$,%8\,*T18^+?HNK@IVZV6@5)\?@((QQ"0($FO -M5H-9D\W^->;U^]5<=O.=1HJ*F*@, _#,UU&_MI&;<'%7F+A>J]4R?; _HMP/ -MI&)"D[J&P%75PN+_[]+6D[7SDU:M59*:O\?$/T;Z)B:.FE2,EXALDRQ4N]C -MUH55#V OCE@4AIP/2*/;_V$0U/Y YL5*F];95Y"]G+.REILBABFBZ?G-PYV( -MK+V F):;7K>@7@O!8D:R[M)GO)*TG(^8BJU!!-O@4/9R_I90UD,G,_,_]^Y& -MD<@+E7+0@=V$A:_K+2\;D=Q4F170BA>[L%GPZGG;[@*6OP>,2*A*A+7>B 'Q -M^,?0 \]6H"J1BIH<0X[T^C:U[/7#1:1VR>/_G;O$G?_(B$]:Z\76B9Q*G$>& -MNY"[IH-U<'FTPD3.ZT>LH-&PQ[I3K(VWP>KZ"L>M_//3D7+57YY>F)HVIE6K -M0O#4]C3EX71TI%$&H[(MD-;;V+FXWE^PT5(ID/INVC)6H*V(?[M6FIF2N!XK -MQ8DI:-B:RI,\;%E_*''8!=5NN2 -M&O\!Q\ W/L>OSHO]D.V-3KZG,/ S"0[>H\OE$%Z?AYR'K$R#,[!XD>G5-#IF -MSQ":A0B,=>J6,[JCF0-*_/4H M_RP9%'C<.,I$:P0OA0BP*D]?XZ.Z:7\!*? -M4@F;JT+OPOR0D+"YMY&L>M?_[,>L=J*P")Z?=H&IDZ8U^^/%X4C\5J*HMG>H -M6*V,347V7)?_YU"=5G*9M@E_EY"\X4'Y.F[78H>0^HAM&J>#+S7!^",7D"\#!VQI)S@^EEUH4FX6'MP$4$SH>E\*[EI674G*XDY8L -M%YT(Q='2QBGJ#U&Z])]>L\:JG+ZLAIOS-CD^-# #F$&P'J" JYN'+0&P.G(* -MFUI94ZCQU/GPX"^#]YA?G/J")PM?G/:]^?9IHY*5^FNE5.&C[K! -MP'U2RR+8XQ:4Z)RR%-BDD%$H\O;%Y?8 JS*=TKF5Y[H>H$8 \0X$2OC+ .76 -MDJZONUKZ2]Q:;81XB>+%0/OR<:Z4AE$2U]J]\*W1BH9)B?T:6)>"Y_OU]?H^ -MUY>A@IU?DI)8ECV[S>L'29&PD)U:HP.;:/:= 7YS?C3OUKM/L%U2'0Y6(0K8 -MP!'D]^>;H&R:ELM?A(- 09^L\C 0VT,0C(KM7^2Y089+]/KNR.=:V$V41DJK -M3;ZYJI29\RO1]K*T0J^>'4#7GXV2DX"&F6<'[,7JK[);=EUV=V&D -MD^C' +)<"%^9#KU#N)*$2-$^9/8^)I!"C$!^F@ZY&-1?00JBWZ-7?GP.V0I%:0AJWP\HG ]#;Z]!): -MGK2'[:_8;-]L]X+8W.'JI\$)AI_>X%Z>K:JYL(,*]^W$V_7PS9*57ZI64)R^ -M,_6N]0+ITOZ'XL$QG8@>M7GTBU9&B*6S8*K&QM#GY7J+H)6F4I/SS,M2X?V( -M.H6UTT#S"1[4QCI]PP0R6_R>5UZXY9Q*]R+2U86BNE6,D8G#>*3]X\+Q_^X% -M$D+R(%/QQKA3GTP PC7V']*)5[.^FH*L3Z&< >+VT/;%B,>-G)Q/CHF-D(V_ -MP/S$S5S VZ_:F$B'TA[J[!?_$_?]PNXTSXJ,51]^!A-RE'(0<.W-Q!;.R\/" -MU$;:!:&7HHU>D\&:NP#S[S8R/>:X@Y^\E%BZGLD-HQ)0E).TP%R6"N?P-9WV -M\@%=D9J-=I*KEY;<7TC/ZH6%G!.,L)":FS > O?R)?;GVLIH]:.#FBV*\+%- -MK3+%DL8!0(>@&];FTX)2E@V6Q-;VE@.6FK:$H'(54W'&MB7D%0: -MZ9R!.L"F"QD2T]?0]"6O"(4UJ@^/0Z1%E9=Q&"A.TLI"6\!+7<6CFG^(D]ZY -MCM+!,>SNOA037(JD?50#O%DMPUNT#(*:$9_53KU%D&;BE:W/79F)K9V$@KBQ -MI)C([VO*=8F6E)H)7JB@A:M(^=DUK\/\3\3$F+N*GX!S'Z7VE1KSVYJ7I B" -M T2$,Z !WD&O]):BB7*$GIZZ#+K&FO?11>WJW=$9BJ7]BD,]ELJYCI*B\Z'Z -ME^7 IU(P0T>K!8ASI_SV8G0;I_+9)BP2!YCP -MD9":$0.(PRK#"9I4@!^.F8+3#70Y,#SZ2KIP6OBU]XB#:;>#!\U%/"^B I2B -M7+*]0):3V?+')G;%&HN%D+U:B(>:DT_9DO4[_ .&FGJ"FI/ZII68U\*L[B[O -MX8=%G[Y4OXNM1C>9)\P$S4OKG!>.E$0\OX22EK*0T.JPD3]?+V+G&X0_>=7IERJ,'?S^"5 -MB!X=A)D%)4M!-3K:.V6Q$)BN @_9SFB[1D/%P,F_:G8J;KYYWJYO1+L_6AZ&V!9."O$-SZ_7& -ML#)"A+&BKYW7?JB3GX]PW=#B7IQ2O( WUYE(LI+AZ\;^==D(JI;AUP(GEGI? -MJ-GT-3>2YTM0^)-[NUPR]I7LZF-F.D:G@Q8NK(*8J\^DO9+,U:L?)O+6NU^6 -MC(<854> #'K!WB[Z-"[BO9B>@SN$DUJFLD2J]_P*)T;2R?;)TH>8@(&0@WI* -M29* S93'5?_T6ZW<5(W?\JN7$8;NX8BV/JE679IXS3)4_<#VCK^D4GR/B8*= -MI9""Y,.EU%^ ]JV. JJJJEY102O?$,7IUCF.N+.^BIB2_[Z'_K;'YHJ=O_A6 -MN9*6=]"\R/'Y;AO$TS\4>DQ9C8U&L#JK@LK\R43S$\] %F@7NKR=0X:SQ\(P -MD#?%K[J<>(%:IXM>"Z&6JZH #J^#NT]2_B)8% -M==SZ@L9?NO>[U>;6Q=2 EZ&ZNH:'GE%, NHU\)X(Y]*2-PF*]EJ11>7R=3?5 -M\,-OE[V=EJYAB6"DN2S*CL%&U1Q?IX?!C*P-2Z&5_\%ZM-;EYD$9N/R1C%R3 -MJYF3IK;8POS1!@J+S_9C?+V;@9N2J'.20YT@YL;V?O8BF+96&9I=&G\55PMF -MA(B3D)>8J[,-]#UT']?.NJ**1[:*LOZT1X,!6<#6C)!>1*0=RD%@FO_:^^;G -M]<+VS="MLO*OCOH I:/R,1?N0XJRI$E+GIZ5FX##/GGVX-#'3X:$/(FLSH>Y -MDC_+ 8Z3SLNV382'BKM,2;MSCE^-<>'BF^?CU>"T#B; -MDL&DD,JS].[2YB&T4G);AAR#J4WCBT6828H%D$JH?W&6],?W]@N>B9.1-X"" -MD+0V4LD#KL#^$ JLH_T;F6RV0N*:]71FKO!GGJ K7$*3IA6DQ]Y6DM?50J:6 -M>]ZM6EZ:G&N4)T=^$ %JKA 10+7ER/YJR\AKFB5P'" -M]II0K *3WDVSK)2IC(.AAIW9Z'HA@X7^P)F3GJM;J ^;_%*DGJT!$'&6^C6% -ME'04J=ZS_ZC@S/"3VHO[KYN(^9[2U/74NM!'^*/2A-I7@EZ"IGOA^0[=WZ8Q -MK=ZQ0EVAI9_A(KG /J"?GIVMOIB S@-8XC,VFN8*KYH$B[F$ -M@MATJ:>HV-7KURX2_J+42\AY\MNPGKN*N).W3<;!;_/WPHFQFGW4L7Z7PJM; -M3Q+8[!;!S[S -M[?8%-HB/D%J#CY00N(6@X!$W]>]+592I5HB'GZ-8$_XU%CI_P,T>?YB7L@EH -MJ W6R0_NVO3U&<*6A[_75>V+HI>;\_[U\#9&X(B^G:""=M#>TJ $6(T-RXJJ -MR\%!F*O^F5&[OD&80LIV8E]3#Y].1D$&M5:?^LT?J -M)SK%L]JNAE^0LA=[NTV&DL<,RM:\T%.-4%RSJ7A'JJC!M?3'RQ.+5J!7";BK -MOI,\P7+U]/?+B\:@@)Q''J23C.6S]2_N]N4>M;S,3YR$@SBRB,'5Q(3U ,&) -MEE^!EYY+4,9^@(CT]V;U]@.M7HUSB)^*LE'!IIW0PO@G RP_(D72$I:N7F1FQH8Z):?[YU#K^ -M IQ3T[E&43.1PHL'T[CP6AZ 0O:0\,;%0KOV HB((927D7RMPMN2Q://M'HV -M%+BD01H]MI8.P?OMQCX#YDJ6K*JHN5^>=X^%*FRR[\5#5B1:NJC\OO4*67OQ -M1Y)RH)Z@1\"&FYZHS%*:]]W/R-_Q,)?R.M2_'8F-+)!8R)O$U_HFVUF.L??9 -M_NM#F9#W^(E&:N7&>M[G5D<$^WM^5A**"I2-F.$PQJ_^%=*L4Y_[5O2^0O+[ -M!V94PS(S8/K:C79DGJJ3J(^5K=KSRRB_\#V-.77W@5M1ICUEH2=*HJHC_J@R@A% -M2%&M\N)M7X6+6(_/?$*B]X+K:J:VML0:^I"PGI(0FH/ JL58?8B7G195+ZK- -M\>W@^CWCE;P1\5>PFJO@IEL#*V?;D9/47T:=EE= 5%W9TMU<$Z;V6- A@IJ" -MDA7RBG$R_336B,. 8)*#V1N&!:P!PO3ZU?(2O[Z<5\KX[5,ACIW*S=?Y7=J8 -MBQ>,[ZD5CHJH3ZK1,\3S\% #1])&9SXIUW3,ZA+W]CXP)52\VJN5 -MB/;SP%.+!=T#286<-E4]B;F)1O"/I_0M/C_#";J&)*FR"+6@(*?E>=-P5L.* -MI[F*_D"6EJ*4V//D\#;_\HR&5^#/Q$$)Z/?3.:JLA(*V,I"*@ZQ=U\,Z,2[M -MVJ:<$%).IO";LL?\RN"%HZ(=18"[@=J2Q)7P1>54MHJVAB":G_I:"PSM#]&* -MG%&[]J>2F:R.2UO^$78OTK@/AY/#>@*2%;J]Y?F5(."@BPX@>HH[+":BE=K@ -M.;0VYO5FGAI,9KB) ZP]JT7.%2CO@]1&MEV 'Q6,B,*Z_P+FE_OR) <-A?M* -MV@Q;DXI&%:O9!, E+@K* P*;>E"2C%O/JDHIFH$A_F3$Q;_&E+#+L:60K'D9 -M*\_D7HBB]7"A?(K7%[SRQ^Q+<;"3^3!;>@\AEI,;#\7P7[!+G7:;0G]LGJN1 -M^I>OP,5<2;9P HB*C]1!3=#RQ>P0 ,MUDD":0W[P@Z'!<>TF[F7+KZ)059]% -MG*DAFYL*W LA%L4^( -M)LH(#HG("H?=@:R>F4""N+>31-+LUA#MY5!85%&02(H#P<*O\9F+H=26F8(" -M\O+Y]BZET=>0E%VTUUA:H/*6VP,*V%2;WI&5V('_0*:JX1*=[Y9B^ K7D%B6 -MJ)H&5:GPT#"0.H"=0*9>D(MR&_.\\L)%-N[MSXT$""J&ADE+,II7 ,[[!*7: -M\LRWF@9/K;FG.;(O*1+EQG;@P6FJCIE*A8V\0::'FT$#JA?1CBLNVKL._55: -MGFJ GI/0>/';N47D8-'5M(J=!=&V?\W9PM.=AK*[U9""K\UB;/3 +\*$6!'\ -MFD&"KKFD5LT% -)_D)@&MA2OQ@*ZD$>7B89-TJR:&QD.?Q'+RO&'=':-B7V%7KI7 -MFR?3[\06/MNYFM"#.)^1B98PFO\E!^[A+@O$]WQ"KHF? B>+J8+#E)[,TOG -M=9/!6 &25I"Q7/T91,'!A;!;N9!;BG+8\_/V0C$^8 ;JV6YO8\G[2/?[!BIB= -M2)J<:ZF7[(Y[P\:IP\S-Z\,!ZHNQBI[&"8RAIE*^Y[CY;CYRCTI1@JR7@+XI -MP8VB]EJ+AJVR1/JW#;;'-]KURX>E^85:5YY8P!:74,M3580 DY\WE5>)<%:_ -M()Y=GNV"UEJ08X-;C9A:N(1(Z]$>)@'/6XB:W$B,L[&, >HYD!#DP5>5K*&I -MFX5JHYY[",0&VM[ FX6D#$&)5YR+$;N8@[&7+]8[PH=]MU$:=&>Z7C1:G2?+ -MZ:\*S^_OX$B5K94<6J]<-( 6 L>K[/00[,56 ";4J"^J\3,X0A4"G9=CG"_ -M@ZE8W78@+L??\%3TDI*:5S*T00+YT=:=HJ*579FKEJ 7M\ -MRM&KGG:EI9(!JR('J\>V.=Y4K<]+E_:?7%7"D[>HDOD+S]C7!LL0\P&(JYRQ -M^E92J+)CH C8\C%_QBX(G$A3\;*!7EK PJ'D+H9^6;"(^D'AWO:B,/K@M+:> -MCUH509.0?ZMBSZ?$6%R:?H^7NAZKMZT4].;>)-KE -MQ8JGJ8W9B(V0Q:H JD5$QA_/3([$%%2M@9*L) -3)@9N0 -MFECQ,?7OT/W"DU71$I.:NUP+L]:7TPV!ZL'+BPOQJX7=FI:T1ZJ4@-Y7:1OG -M\# 663R"DYU0=;J=QX]S/9 (,G7 <7F[<2HVYG9OZKKVH%[P2Y97H'!"YPRC -MV%P001;^O>$&YIIZ9P4#)!=70V8^#C$&NB*R'HY36QV'LU=WWT]*< -MK8>NGJG8^>&GBQC=G)'#K]^NV%N8&;::E::"GI&.>L'JXS?MP-"^$(N5CE%2 -MJ-'#H+&^<(I;@A%_C>?4UMOMU\>?LE1Q=I.NUZ1.*Q/.K_A=N%I_CI6)J4.< -MB/$J9:#G ZS3\T0N4:5^\5E_%7N -M29. DTR0>\35Z_K%!<@/GDQ%S*_%7J"@%^%ITQ8F[N-0LKV@EH^(V)"3E$"M -M"JP+XP''QT/O#G^?2OZ-FI[H!AW9$A'WOE0/+D:QG5?36D/%70/)O8A>K9Q1 -M6:[C*]#PYCY1F%":4;Y5>Y=@FXMQ:H];A\B"4+11G%U!EX'%-O4R/O#82)HP -MG5.]^(6%Q<+P[/(L&U-:D$M^:I:7HI0E.F5MD\;+9J.>6$.>[,?LFJO-SBS/ -M ^'' =\GD%^>7=6ZQ+MZBZ& 4L?V -M/,;2YF".O9^5^C58_H4*[MR0&?J/MX>?^P5 Y.)#\@?%DXN$II*OJ/BV4-C# -MP=)>@J)%&Y+ZJJQ:4?*K\^8UIO&K6CB_%Y&^I:-,0_1TT.WU4J9H0UZ3WY:3 -M;<3IV.S [\.ZH+B8Z:R]DZ6.N(NGSHDD\>9LWYJ 3RBOKTQ:6(KZUJ(P9 J3 -ME'];@?"C@[BH#GL!'<#!X>N@*_9C1I<75\?HC%.RM;O#/YW4T^R@G!N0B3*= -M6%=QXT_#_(*!G1ZTDKM8GA4^)? *_!&@DK+[3^CRE93F6UF:J)<9KOA3GT#3_I&:]Y3NGU". -M1==>0)BL!:[9S?O,U]+0AY>42(*%C8Q-JK -MX2S%YO71$:=2#OI="ZG>BIS0I:>30/(G$&_F*-85D)WUM9J#26_"XM>2/[R: -MD1^?P_.C=9*SPTRPBHTE_5F788Z)UP_*R# 448R5D).:LGY"Y/OU+F[NT>N/ -MJ!T#N890DIA+$N,_Y!NBE ?FU+"U6>D[O"XB(I1=;%3EZT,XPNWL9Z[4L.J]\S7UQ+$.X=] -MG!>^E:4;J,0G@=*NP-&=M;2-5;>V_Z:BCNTSU]3Z&MR.IGFNS!,J-J-$P>0Q -M^_Z3&Y>M@HA)JX23+\36X2;Z]_"NEEB(BQZA2H::/^G]S,KG(=1LC$2_E+B4 -MD*W;K=DW]-;']O-MA?N?JD1+G':3@%;8PM##XOE8[]9OB)BCC%^:GHI!D(K! -M.^?%[\)RV8:>D(V1<@-0R0+:_-0&U)I35@''(\3F$"_;JHAP6)^1"8-B=_F- -M6J,2!;:@NS>AG)UFE@,-^_G\E^_)F Y'UN,:_586&[F.(3TV? -MES_%EC4@-! /.O2IA9V;C8LD#K?HR*S/\?+ "[N,C$Z25)UR>IC!P-CV\'78 -MBI@EZ, 6,+U/O8R)TRD -MGX2/-YWHNZ:=4\PLWXKBT8F7O$ /KY43:+23@-[%;^Y:6H"6]K[3ODMR7D&F -M&\&H"NZA38[#R)E648B9EIVN%ZB/C\'^Q_)SY_$ND*![CX-<6RS/!4*>UIZ% -ME:">GIB3E-9_QHOY?J^!WVZ -MGC""J!C8EE]%A>/%_[;;B5YL6)N'FY92@*CQN7?Z\D;7%Y =HOX B,;/K^T -MU (!\P/.MA7L5?KLN*Q5NLCYYIY +87"EZNPV[:);NAN@SY<#PBT[[=:!4!6AO(81VBG'#O$V>I&QD8Y16H/PX.%%U[;7 -M][:^!9JCG(J@7XK'')/F5=#0"521JENHL%[''O4N5M#P.H[@$I:#]&J;JFE9OQ#M8#].$23WYX5&^> -MO^BLD@O,LNS3[]9W3_Z?2YN>6?ZZJ!8I6:9YQ0ZFJ0[<$TR,L9^2D7):;"13 -M25#VE_ON\)6)H(D0BJF3 M2CPH0+DZMR18*)]W#FEO7MT4J!@964(JJ=^8^X -MH)IZ?C^1,KJS)["6;&NW/XO;:T*^0GF"?K&&3LI1:PN2UE]8R -MTIV-K5Z7MZTKMC'46MGZ$-7)0JO6\IM:F3BIQKBJ=/OV3\'BE/X^U-N<"%ZW -M2OA45R==D(#T"Z(Q%CN6 -MN99V0]FR=J_M\UP FB9:FKJ'O8M H/Z=]<+%480V+WJ-FI"0[,%I]K/T=>., -MDM_HEWQ9B3JZ#4T%_(XA!3 7LIJ!C+CAJ+@&J8WJD1)21:<(N]4BD):*GD*$ -M>X,!SY#?P1;2P].#4JMRG(Z+C+^YG]E(\NT>D"W;3"&2A(8)D__RQ0/(BG61 -MFU^7&9C@\_CR\'"KW[:3A(13L[JEMGK,@]K$FEF4N;I14?JDGGU$\/D^>]?+ -MJH^VNPQM?X8?)N=^126O@-#62'^+GYA6LT_9=!$^-G[UO7()G(*.7NJL5IK! -M#HPMKL/1[HX%O!R2+8JL$%L#U//V;:Q+O08K5II6BOZB1I 7VLY-]P'GKN#0 -M*9)1,K:.4MNV+ Z6Q2OT\&80V_VCLEZUB)ROB-W2X89SN'M0$:NS&S/M]^?T -M+Y63@YU?@5B*JEVKV/]'7%&\4KU66JH#JA>#I^O6L/330$\5L=.,P[6D2I^D -M\.5F?L*8]K&XOD:'EO/L$NOVUM;LSHZ0?KV$F+R3,L) @MP &G4%0X^:1:B/ -MG\T+ME92P>/Q-L8V08N'](N,^EJJE*9SBR"L0O? #T\*X$-2MYM\=B^R0GCW -MO5#S\=1P,.6LH]0;6Z"KJ4T7HP!,G8FH4JFZ -M@D"6%Y.;DHCR/J)OP./'I:.8FHJ.F_<-\,+U'<8"K8_&FY:' -M4HZ#.HUR5VXR!/@%KJ7YY?TZR&0L7S[N8Z -MW?# '/C']ND_^G4(Q13K?F_DE>'2E:LIYD8P>W5K,0E=-!; -ML;N0GIK+QJ,VA'8"AK>:JE,BEO'F0_OG!_&FL82PG)NVGX+-!_48G';_B5N@ -MNGNJ?YO!>]'O]@,PB]N@ UIOBI;S3!L;\77ZP+L&()?(27)66IH!8?;&EM/* -MAX:L1*NN7IF[C;\2W8#B7L\9OX1QG$-2@*Z1TJO2\C3V$MI)BH91=9XF&QIT -M$%.7S*SX$]S6JX\4POI"7@6^<8*XQWG#'+V@ -M"G%:H5I]'C+J:.J^5BL_U%/?@W\5MAZ(3DY+_AG*J ^O%M]7B"QV3NIV^EZF.H9Z* -MU:G4UJ3K8;NZFJA"B)?-@Y[72/*]4E03T)E*?55:WHJV4GF?@P%"S-=-P]H@ -MF8BN!3*IMXF[D+AT4<<6QR[>4"E_]H*QD(*ZGT<74MA0-/*%3EW#OP'@-9W% -M[<*JE(*%I?2[G[C.5]?OQ1B&N &%7%%:$W %JQ,BR'/:AEY;)!O,3D9!PC*!4@E*%TB=OEKX77%W"O9*RNXNL -MWH':C,[*F$.2NW8"B=^039U2XC\4$/&02I )J_R"F$X*KL3B-\1U\UJ I),P -M/ZY;E4W#%[7_W9>!J[.:C$^5OU,2=/_-3(XNH<5$#(ZIE,V&F4UJAE+7(E3G -M]?_+O9_;BHX&8HFC@!(-]>C\T0'9"AL1IH>-F9:.1UZ)QEN;!2HG\!+^Q9&] -MGE_279I7H6M:X$6(D;"0B*Z7 )KXMG_6 IJ@%)5:H7HZLG(=)4;:G/K4$OO. -M 4)#>E"7&+34^M+8\+BGQ +3PI*.$HY;\O,N.B_:G+B;BF*OM?J'X?(YEY?N -M"X,4G,FYNF%(N#:>H:14 DJ(R(>F6@&"GD"+.'*H\-'M%I9WR)F'AWZ#D$T7 -MMF+0&^+8[/3>%NO#"9"5D?::L&N"FZQ: M'Q^>#R$,-YD:&M4L7ZE_%&VS10 -MH8N>W/21M]-VQ9>UM>/\4DH%#8JK@X1.60=+!THOG/ZTDJ/8OZ);@<<>,.^: -MX]*1L*0;@ZN'GDBDA?#Q[C/3CUIXG7F[5:*SED/[L7?E]--7!86J;Z@%4L.@ -MB<%(WE^BJM1O1%B(0IV^V, =@N$T-O[VUX_MEBZ9%Y:M&!I,5=T"S,!"G$G1 -M\/ 2K$6+3X/MJEN@=[W!\GSB,O 'E)"@#Y!9UZCQQR_RA%Q3V98@OZ\8\>3D -M\) +CY*+KO90J).FIZ_'_<>P3*._GY7#K(*LMYO3,_]5L!KUBT+&$XCCGE"% -M1 SC[/;EYPBF8D*RNMV^BQY"PI4E__YU1Q#:;$Z.2+N#I;[BU]1X!T*TCKR' -MX(NZO6NCEE?-Z]3\VO7S3861F,O4C?N_K,2[I]WX$JS4H,5@31R%EZK2Z,H7 -MDY./TIZ3%COFXPBRD'U0EY"_ Q4 PE 6"D7>E5.]Q\&_U>; Q^CMH[[HIR3 -MJ9J?T<[*])1"E%B6N)X3;9"K43+ETMQ%MN<0,+?<2QAZ7Z" _^SP\@^!IX)? -M*I]E,"U64$ ,CI7)MK"8ZK)E -M5<*OCX\NO5"KMAN*4*N/^*/=R@% OS)X^U3GX".^CB6>J.%^O#J[._>=NJ5 -MG;.=VY"6'O+^X]RLMO1'\J**@M?J1?_ZE8_>&$2MM?=3G89UMT=LJ]*)EA)? -MAA*;@JSWFO<3T7WWQ<92M*F:^XJ&7)+ X^I#M<9#D_!JKQ/'?::@G^&6[700 -M%.*O%X67OQ^KO3@GJ5G=W(YG"N OMX6 O)>!AJR?G?,6'T77_]M)+)"3B[*3 -M-HNPT)LG2-)![ @#P_ !7,2PJ99)4Z+F!H#-Y.TFQ\#;7XNCCUI8D[J- Z;# -MO;83CQN0BIC9XZ42QN?#4%B^&[6EMDNP\(+E5_,0';!+O/J7_'^(4+OEZO$N -M[\4V;49&PZI*C%Z3'ZOK[1HV\XD.NDBKDI^FD(C-_^[ZQ_1.@I67K\LHKKJL -M<$L(JBP+Y/$::XR/E+U?G8MFMA$)$+7P+9XIII)&PY:7NZF7H+: P8I: ^SB -MR^,".Y(I4UR"0_JB8!6NR>/%Q>WV#_RED:Z.L+N7K0[ X+I=@$4"LKG](OXP -M]#3%A5QV<9&F77NHJY[["R3O";@2BZN,L9J;)EI#663U]]+ P"L6H)B6GPCW -MLXS:VL7EK@.+7ZA_DH"NEG\%]^K9U_;RRHUZ5;_/F$N[8EN!B4RMAX2GT9\ -MGD2)6BVZD*:+030QY;(ZYQL,K*-8RGN]FCROVX\\FIG-*_9H2=NPW$ -M??;[M/-#7XZ3BO7/0\NX5)N-'=/'UZ_KQ?:&AIZ:G)7'5O^@VGCI_L5O@?V-^^P1P]>^IVL0]8/GX"A-Y75 -MT& FOJ.07$S(;8MXA9<)+-3.(>#:1590C%5:0+MX]GK!LCGPU_)&TY^%BUFC -MIU^2(9Y]"8[+X=K=Y\#FC_.1=Y["NY'2>:!7V.)!\N_VQ[^CFHW>0JJ= OS. -M\GZ)DYVUH5[RI7KL]\74"KF3MENF=SI^N9*]9?GSR(29T;N7U(NX@IRHX39S -MY="+6I.[D8#V1OA;FV0#%C7%]^.O3FJ[6X>'D)#MB<;3/\601\F:^*RCE)ZO -M:9VI&P_\0ES#R8^4^D#FG8U/H82=0_0TW_;6(T=2U5-:I9&II[I%@L<."Z3L -M^LS/&,==OI,2VA"\5K2[GIFA]>P2VH>,49*%\%V[]M*#]='0DCZ1UXD:>5G" -M%1_&$ ^0(%0;6IVL7Y#0?_#90+C]B?!1C#U8BI664R/R-Q 7DU*;6G"H^^J$ -MNE\-P]/E+,7##IN3ETFHKY.# />>_16N%?5E<+KL%JV)8J"7@NG\P.3#PYF, -MG9YDKJZ DJWWD^3J-9?<_]JHQKD2O(>/7A8LI[?JB/OTJ@W[\=:[MZZ@NB93 -MJ[B 7I>BT.Z6>_3S4+944)2*JA=GZ4=1M!)(GOVPJM<(T.4V+!_;7:#?GU07 -MFLBQAM^I#0,P<:6CR()=>K^0E'OMY#74+L7@S89A][J13G^C/?#PV?+UVY*= -MK%=7FP:,6Y7PTY:^>C?0K72/E+E[OH:XCY+RE9W.UL\23Y95C)J_H*J@FHO1 -MP/<2]]!#.WR6DZ^=V/E#R)RB&E%6H:Z;1<8S;L+'PT1&GER2UT.;+!>*R^L)TII" -M]@2PP9:6K/H+P12TQ00[#RIB\G5]8=HG"=$16EPS^M<60%O.Z<$@]5C";@R%? -MP<.YH!YQO%"KJ(G"7)66E@5Z4X>=#A"+K:.0?]'7<,F$UE"[&Z%V2?&,70TQ -M\3?<\/:.D^V"]I.VI@L,&>/%L.V*N*:X75.-!XZ3G C#]S_UPL,75E6$KU^- -MQK!WRUD$),@+T32#\EY*@X9!27GR4J#>^31NY,B+>@U0@Y"3").IFM+W_^X* -M^ASXE1"2^IV?^Z:KNG*@1%WQP?CT%O3%1;.+D=*1]MOG U4*-)2SW;:1FYL5 -M(G,6]O9CO(.PO9:7VX.FG_=!SR=AF+12O9;QOC_B6I[!Z?'T;]-8CZ80@Y)' -MLEJ2I=#V-)HZSXB7EKB"4W^.F8_8U!DUY!3S:8"\A[R:.)*6A@#!_.W.+]CT -MKXV%J*Z:E1.X&I?7(\3 U9)EAUR8@H!TBPA^D"!S -W('/C5 4,UA[Z-L+*V -M"7[^B+)=\O1YTGXPRPJBOXS\6)./0/D/4GA0GXZ2<9(; >)1)!;$$TR;T F2 -ME9.?J/*7F:GJQ%^AFO%UB5R;;'V_HSXNG:;%"DN]P)N6CYR7DHS"T^W"NO6+ -MDI&=JX]65I5J&M;'+]/ $XZ6F$R/GXV8H+6;P1S.[L[7T(G7JDR#F(V(S9J= -MPQ/%\O2Z][B.7;^L=8-X"&VVE_#*! K5S<[%2:,>_9%:UKE:GZ!TDL'JE>XV -MQ>L,G!F>Q)6ZY=J45@!1IA>+@7IR4\,K[P0% -MH))=CKU6FJ"06W%WQ? VPL#M<"Q#G,N+I$N>S?O9]/O/A].BF9P)AEJA0%D4 -M\W?F9>>\E?F 2[N4BK&5F0KY[.Z!'[UKNJZ64N-D_W-+WY!5GM9V9 -M6H_M&K:XE(NAWOA3S=4OR=6.LA6?TY"JJE+VCZKRO\4@<#8"K%B249H=KE;S -MU\?@68+:ET22R/;%(=4V%M8KKHH>7(;9?+Z05ZK#WL<]J)S+E-!]5[\AE?,, -MZBWV_L\4D)20&[:#1YX2UA'PET8]CZN5H+] DIY;DT3-_CCNL/I#%Z!<;:Z& -MZ4>1DJL2U(;7"?C2 -M"_C\J]C82-QTF_Y2XIX)S!J1!>A%P/8L6_QUHKE6L)H9 -M\=/6FI_&YS>=FX6PG9[#N86]=^G%$ZA1GEV5^KN_M!I*P<+C(]?.U%N-K)O# -M@UJ&]^3"]Z,0I@JO%^2;J)L>3:>OF?(W8_KWP1^VAFKD6NKMD9N >0QY/YV^9.E**VDPF2>?07K,%45@G[D+.>JQK^V^ %W!!17HO87\/")-+OP@%$E@'8 -MD+NL<^*7@TSO!=;PF9.0_J*\6H@:6)'!T_)WCN9ID*Q#6^UXEJ:%R>ID]D3" -MB5N!LH.;7H*RO%GF[,6U[>=-I[Y47I>]IWF@@ W1Q6 R$B+N>/)MFEK;1\>;$+_;S.)YY -M7RB2B+Z*I)N;14W%]MP$P<\6FZN;58O[Z(.+D9"Y*3YU(#?"[H664)&>\*J2 -MQ]3%, Q %IDE]Q.2R. L^O??D*_[PIOPD7J;H->_0(_#RY"$$ZV6D1RS)H7+ -MP?/FT)SO4&N5H'V#KQAVDVK'UAG5^L/ID#F-7+]%]I*J!_+L[_;6\Y:VO.R9 -MG;W+('*"P43=V-W W$F?JI86AY6XQEWZP33U+BRVT,KSFZ>3IHF"4L&R%_'* -M @^JW0P+&(>ZK55V]I*^<0U^Z&?F! MIZ%8.QC\A=Q%G".;IHJ( -M6/+^=*XGQ@:><%9\D%U>K6S0]PM[A3.UEEN.H)&7LTB>6\?RU:_U]5"CE&." -MJ(.?D)*?[<'5+OQSP7+DDQZ-CA8>H"T_MS>S]?&)5I0*OKR%JKB:/2<:_Z_F -MVV.O%IIMK7^MJSB6NL4;[/ PUL,=3=E7"E6]=I&@L('U5L##3,7MXM!;OYR* -MO$20F**-MGK1P?S%L/3%7["T5(V1 9C@QH[6G( 4NU^16%O%-!; /O+6E)Q -M'16Q&[VD3D, J>+@&+!*#YYQY):C%I#V7PL!?GHS\J00H>M2HB06QI219*:P7'X -M]9:6=ZZ9AY2:M:I[ ^DC":I8&]BP)U.+P6NTQ[;OU5RJ&3OC:2II>I)S^3C'.M>!8Q#6HD:AO>HQSOFOL(P6J]& -M!9-8NJ>;G[F6LJ#$T,,$RLP#'>JRA5%ZG(>)ENQ'@Z?!\;WZPAJJE"&OHXN\ -M0R7+0L.LF9.$E]N8F<5PQS+Z[<5=H_1-4A26^9&46,U6VV/Z.@J[A?% ?R"6 -MW1LR,_8VP]F3G[I[B8N?GJ=,0/;UT.#32/>SVY['7?>C $RV7O>+EE95DR* -MIXB^B^@7BM$ #LPBV=Q4L+I/UYB-NHB06PF2.?0F-N*JA(5SNXR-=\9QHDL0 -M@BG'S" 3H;2BUIU36\Q/&A*L$E_!*!W0]_X Q(B:K)8+?[L"CQ,<++">JZ>2 -M@YG+\C_B/.Q%F!:BC5Z(D[F67Y]-#U,3L9.0JWN8J?-@%XB-]M7P)A/R#9N& -MFQF9K%#?O-':;R(WYT]&<-*:DQY=WQ12ZO30%_?JEH^>7+_<3HNX59T#($ . -MW*?DOIKX'H^^U0;,6MOG$O%WY!K"N9;=5;>7BWN!J96RH,_XH^:H^\#\K[V] -M7ZG/BJFV; 73!7+%%\;LR,?4@(>GD7N#PJ/3"8>\BZ]&EY8"U?#M]G8O]X:@ -M]@6:4I.=N' =R:V768IQBY\2"+I(P)K_3=/Y\A8"PX\$;;>^1X2:@8S),\4T -MHV5%DV[C)":B87^SZ;;W8F2O(2^AZ4' -MAO +TNG%_A OVHV6/)#VD&"6H;.UB=FN"&'IS=L%]*V$E=B\IKBNP8&0>,,9 -MU/RZ8 5Z@*.%C@E"B,?[QP&:7+9B,AJ-%V?;LG^#/ PV2G7R-1[3( -M[-%IE77<$,^"FCQ)C9Y+:>R/MP5,ZJCA3_9/3;^,!+NM0I!5D/%K]?JV?]F# -MOY&8K)_+"8F,1EK-K_JOP$CDZO)ME[U>B:>-%D.YAXC'%$;&T#>9D9.*GJ77 -M@HK9%0/CW:(R>W)#EIG)$L;VYJ[1NER?NY;=5JK %9K!"U"24%147+8+F@.5 -MC[GQ=M7G^J4 '0_#W5N8N'*73-C^-Y;Z$P>7K!U!NYV0P4RJX/3R<];3[K2> -M#9N.'4=F<+K8[OJ,]M=<9/JJ5%3-U9J,DEL9\?;%\N^2NYA5BTH635.29%H! -MT(P8!Q[%PJM/$R[0PEYYEAV2!UF?YC2#P/YVFA +$FUZ -MN:J*6]>0EXK'(&SP\G.8G;B9<;J,ME6N&?KY,E R#J*5FFQ%C9N+XZ>K94AN -MS@[8]8>Z3^_CDI2+:9Z:X//6YI8_PP-/ELB,](:IUI/V^,C^:$>!K\7N\$== -MW)&NMH,7RB95TTCSV-:@Q=NV4Y:;GO=(5X'Y3Q&Z&))PEYB>N(X -M5%:>];?06I!$O\/KV-F$%E^%I'*(CHQ$6RO"P3ID\]!(D[A;F;V>ODL-U?'E -M]+_ONW:KDII&NK.9@%DR=Q3&&B*[7Y^\"4?/T;BZVLKZS_Q#"T&<^IJ*C):7 -M4H&V6*#JQI#N\@K-_*^52I)8W@@2?;K)U$FGS,76IG8^=NT7_;PG(V13D+8]&\VQG[K5!B0GO6PN(JJ6AL1 -M+O,!NG8@G1I;5ET@FH'G%C<]YL"P!U:2J?Q+DG>UK!/E$V<3V_ $)#E"$[MQ.?X0]:T2::X@1*L!H+;WBS_MWY//' BVK8,;NOO:59S)).RV\!KND$*"J.NNGM% :9_W-NWOXS]W -MFH /&XRHC:776LX [^JJT[Z&A+WC'I4'*'IRP/+^Y&&!2?E9*>D_G/^PE?\>**@)"_M8B"?WN5J*3$/27"+["[ -MEK:]@8=.L).<22(\Q_X#AUN6?IH0A;*3#,KJ%K?VIL=K5=KL7X8-1R.G@//H -MSZ(&XN/OCZ^NBZV4H( 6TYT%5QL#V)0^%0Z)7E\#.M7_P+N. -MFE0>KYZG2HVRC],"CP,06 /".[2GEAUH-@/LZ!$Z-G'&6I;YJ4 /=::?/-GR -M8S?@\TM&H!^[AU.4@X^A.\SN"M/3O5OP;9V& -MGHMZEK=)0<;Z-_#"C7N>^JKPYYFB8/:+R,( Y*K]RL"YNJB4@WF>1X*VL9"_ -M$V@Y9N7@<*^0EYN/^IFK <\E2'R8HY%6DJF"\=[99.[V UZ 7YU?D8#2LAN] -MPLO%XI;XI![UT/R#D$X3\NO],]0EM;B?DEDKZ)>?E0Q1GCSZU\N2E+F2D&:' -MA9E Y-9M?O;Z0VZ6D>@/G>E(QG:?Q\S Q@?"D9^0$:J&GYR#J9J# _OO[<#R -M&KF'JUM:>KM:GD"05^/"# ?ITL<'' ]WG)-:!ZV?WGF?G0/:Q=96%-M07!I5 -M1AVV*.*?U/;5@Q"?G&!7N8E^MY>4V-8]U_8FNUI&GP*/*Y21;DT2%2WWY<]# -M6ZJZA[_=#6@V@>3WI8 78^)T_*L%9K![I=4HY3 $R;=80!6UWZ9"YDIB0IC(,(ZVUF<_+ -MS P>W\.]A96\3XR.A:F $*[@EG;'K[I:[9B-O<^G 6+IBV(OV@V5*+=(V.; \'SQ@:UWD0)[>(R#V4 U/#_2PZ^@89^:457&"\XB -MTL7VQ]CI7X.96H#>)DKI\3;UE^X^T(FCA(A&FZ^-YDZ7Q50DX]_U$8L4+;V? -M5H'C)/93$I8V]^7Z4.<8B9DIE8U:GGJ.B]%]&?\_KD%\^:5(IQVA>#@:RE -M^.D7&L15B+>;4AB<'4.^6>/0%/*RHA_13<,;V ]6H=:8BS?S)E04HX23UER$"OP;.+?VY1<;U+Z#TH=:01I#=!Y[0-03[BZ0 -MV8:4[)*NJU^'BTI9$YW$,%M"HX2!.X?R?=.*H30NYD;ZP[JF4$P6_82+(K8? -MQWQ S_8.X<:5EE6/$FW8AH2[\3X\QC)[\)"^/I,7I&NIFK)ZF2W]Q/;8_ K! -MUI-3AP&V]$J^)B060PSC_6;DUD5&G$N'AH=)NM++H\/>D%Z,HY$8_\+;W18V -M1_?<$]F]1XB3VN& ER4<\M+>]EI$O[#WN,9/BUB2\\;_PQ2'D'236N\&I9*- -MQ2GU->7%2J2DGI^2J)H?/LSQ[/8T):B+4L6^;[A-NW.[^]'4_-@FPM!>M?R\ -M3XV,AX(.DL3S[;I%OEB#5ER N)>HCE>0=KTAR.F/J,)8 - Y>HRPK(8ZJJ*Q -MC$B%/C,T\!:E?).R57)2JAW YL+CCZ99KI80@[CQP<;NXM/%5?"P7PZA')*@ -M5'W;RQ""M=#!E]6EF]BLI%V8D_40_<]A[59B6W?/1J>2BA%Q]KOZB.LGIGVV -MFZQRGTG0Z^TZEG!Q;J2^1KZ_E(JXI%/JB/WXPY'2EX(%G8F3G5-LAI^2L_;^ -M5^_#IQ>9VTP&4JN3I9 !U\VH%,7"#X\QNUX50*F:HIQ9K!W7 3O\EA?UIIQP -M4:T 2:H]PPM%X;B4]@:F6X/_"7 9[/J0(1S4&JRGHIQZH-^=)^*F\!6&D9:? -MD99.P%8#2/3TTO?8X:UP1E.Q7DD"KK)6*V,[-SG;Q'"T"A8I.DKV"I/+8VSNU%^^2$U%XD0/\7DN7 -MDF*EVL+]RJ?H$\#GR*J*'Z62>@]^0F!: P50+,+7L!OWU/*QP'.[D\EJRS20 -M!!XKG;&[K8#R53+F.D+00+.;7*48N62_^L"*XN):I9:1-X>)F6V44Z/9[6[F -MVS&/4$R"L=L^1%2LFIL*V\0YB@DZVEDMOFM.WV=D*3J*\5@J22F8*1CGCC+>KDZ=U' -M:L@15;BSUHQOJ*&@DHK9XF;6]E/E#;1+J9;4FEW"_Z/2=! !K9Y4FHM:\_?0 -M+-;1O9/R+I>BFXCKCA<(SL#9A*3&"492V;^Y@)N$X[,^+?#8B/K[OQ^*C982 -ME-CC_[?R0[Q[HNC!=,/7X/?C;YI01$,2A9*IEJO-#'K8W"<4G)"M -MC:(_AH[WBQ\7FQ\(!BU0(*^ -ME/"?QW_/&'RF2YR.TX*]899:V5/$D.:ORYU/DXB/AQ>22Y7,]#<7[_&G$JP" -MJ*BNI*%M\\3&K[K^4ZV0$8RBF#BI=/.+V?W,U\?NU$.3JF2+KXD/K Z3TSHE -MNKH?SY"8GK&O_[J#BZJ. ('X^<,'^_\/W*EW^Y*)IDM2N*1>D]"0U/[F-I,% -MB8NTC9*KJP.O4]P:H;.'7_*"G:5KQ.W&^^4<7%*$E9.>NJ >J,+O]YRTB=ZM -M$(GY@S.:G2B08]OL4KSMFJV;*HM.-8642/*1O"X#$5!-FW^]#MVS:L7V]/?P -M9\6#2<4# -MG:!;FZ2)?Y?1$!5ME]/:AE&@10.7>H"H=%KS+LM06'7:488T]IZ-EZB1%#7F -M-B.P@U>@O;*"E91^AL>^Q930VY".E9:+DH>%V8@7L]5&]BXA'UN8:.^2H5M# -MDC[J[-@.)";(CYZ4E-:?E(NVG:V ^G7G[E(2NMA=GP./J7NCDG*=Q,H.]2HJ -MF_72:FWLI8#"7_XP#;&VMY:^I64<8.) 5\"L*^4GE^&71N3\RHE -M?(X#T0/'% J(M%O_B?Q];8Y)S3_Y5/9:XF?6:*BJAU;> -MBI1:P^7Z^DE>ZT\Q^!O#+$K]6 -M7,:?'"LFJ9?:P-03QO9ORPU6FU^:MY_V2,Q4B\3^Y,2MRP8#$[J?E7]<58\3 -MN[CSJ.34;91VM<+=H%&TEB5;@Z+"V[9\$%.'=;R[@Z#"+1:0]^]46%H4MAV< -M.I&@20FL\1*0H;*56Y.\TVQ:FQCB.,3 UQ"K=&2_]D.^SD=J!^CNK?I"HU[L -M2*J.CD#70-/JT)3_[_"[5X^\1IAKJZ&;@R??UD[""\)K5=>43YR!9J.FC0SR -MX1_PU,>'5IN(ED^^D-YPOY+2U<@75@K%]1RXKE[S7@6[BY@F<-MMGF_B6L3) -M?HF>7(:=J@/M"R\V1Y/^1KYPK%;2\.7WP-9SC:(2GZ 56XJMII['UV;!Q89R -MD:.*^OZ0A9/:L;;P].#:A[>DMU*9N ^+'@L^<._MPS]48)U867)7DKW!Z]7O -MM9?*KX^-C8F\JVJBI'LE*%>"WZ, 3(^$C9M7GVJP3Y_!'G-@$I#KGIY?HYZU -MJ=F3[ ^:\OS[[LI*[LOPK9X%"/B;CQCR+$2-4\/A;L VY9GYWD5V4IB-$0_" -MXYGVMMVEH9B?X6HF_N;V6U6P&9Z:%1JZX'7_36D!TGJ!VD:F65"3.X[=Q30W -M^_#%&%*V>8]7AP>WTH3-*,$F/\_(I&!:JKJ2,@.\$93Y;_KT#[G4NF0,\KT3 -M.;^:I\#4H@H/$)Z.3%6*GLTZP\Y*YW[A\,+>&UN+G[,HC+J6"L&=M_$'K@M& -M#02KRFJ;G=NN7KM;H8&7DP3^.:XV/\#1M!A%1[6*^<'6PK)=@Z:OEAW\ Q?: -M.38;[F=1H%[[LY$9VH"GEP,.SQ*L5+0ISYU>_K1: L$^&3_@%="-1H/[?HO> -ME9>ET;'T[O6BJ)W"=IF;FJ2)2-+T[L+$,\;NAM6-B9>4BKHUEQG:@ P=HM 4 -MIEKHZ5*+8[".32BS]/3P-"N CX7!7@:[N_Y$M%T3%.#JRB*@<1")%EN#FI^' -MFA>Z4']!ZFSV(/(#?)G6D;97DYM"W?6'UN3A)W* -MZN7^!>+ OX8#OSIK1=&ZIBMUMQ7JTQ)QE?ZP,#L_O;N -M)40<2D2Z49H"TL2EPYS0FIZ.@*J2P3[\T/I%]Y"@D8VV5YJ[>E:RTPU0T800 -M5IM:45I=;*)7YQ03__(3XIVWDIJKNWQSL3K9]&% >_.'5B69FKV8E+"_S2+Y -M;.(N R2VF:>>G$5*LY6:\P0,:M?#'(N5CYQNVXF[A)^JZ233U[WN(VK?C5M# -MCKBWB+&.4H$/R_=Z! %0M,L]O:*ZEIC27F)^6\'CYL9EU^>8S[L%45EZ=7@B>F*6^B\E_(LB&T9X<^E2"6JQ.LL7J -MK,8?]M*3H&P#BXU>&XJ\[<'5(##S4)83@MN3D@QWA*%!E/_%^L"CLMP9C)(, -MOVQZ6L+ _'XI.4FEZ5RH9=3N3WC>$Z)Q(E]:BC4["@F[9-FX)XCH,'!,A= -M7LOJ%>"KKHE*F9I+3J&CT)FJ_N5ZTCO"KI6+^UPW2'K1+<[;G))V>Z1 EY?! -MD]-T/_ KG)V4K[912GN@4$F3AZ#;G/92/*8=*'F@59WCE&WR.LK=D*)MDY:3 -MDEI[C #1L3?EVIND@JJYA]9,D>IE:.S2>L#3UI:5C"*8GX/@D(O-W^BH0 /= -MF8"\'FU8B:V1]YT#'O__K]H%2).9L=J06+Y#NKH/0?[!X=7\$\?3ZI^5RQHF -M[?:+DYI!P\/G/C[E\8QT6AT$>7Q:U0SWV)!1B?[RB?NK\SIF]9?\C[V<@9&D -MPH""RK[9VN+9R8>06YLD$9S>N(YQ03+36D+0\+ORIIJ"ZI*/EVP9ZC-EX-*" -M\K@8_&^4A%D, SOM[I1V KF?O$!6AH]-J%>7)\HJS>I/0NM?K8ZI -M)2/QM#6UAPM/AK;VI)&^/J:/B<#?[$<-V^G3RBNFFG=#]'+'O% -M?IN9%IX@E%KRULOCU"C/HM([CO]U>J!#4E;Q@)C%^>;$%,73^HF4\:)TJA;0 -MR_,"OMR41II(T'\!/C\TUA##E%"!WO97FIUYEOL0RQ?0E)B;E5^Q&IBG4*<9 ?2 -MK(# IHB:B!A7P,]3HY.&C9F-CY.XAI$%U!D^;A+(B).IE5Y2JI)0.)JY QN: -M8?Q\V\ZT2YZ? 9[UZTH2H)*7*)[1K_;V&XX0VZ\0D9.7\>_0D)!#H8>%DW)[ -MT?!Y/N9MPKR!BZ]&21*70:*:S5VKY;Q1DM%?G5S;:X29P/;#.C7U] M>N:EZ -MF)I?H^[)\?3B>IO-):N96XJX:F%J>G<&M1EY_@3OGQF(VX)K_G2%:=H4\4,@L!JU'I($40+'5%O?S -MG79FKTO+DG>5EAKT%_> 1&6GEA O8>[N.RFW:LFY)2OKFPPD7]U. 4]F9"4)Q3DXFE\9:8 -M\P_C1!264YR3MUA#S3/%+K RHQ!&@YG22)./;':I"WL+YG2#G_R6D=R?D?>2 -MP??L]9>GXFVFH9L>6P>V18SSY].7]\N[D.:95^J+@I%&#?[U/OOFVXF;G$&? -M$E6_H_+[(0HD_\K/ [LF^81&AZU&H$^7T,3UE>;ZY5*($9E\H(*ZM+&F^_?M -MSL\(5L/:R:]&>*>.$@**EFRVER+6;_#TQ Z?W%:?@H4:6L#YPL*-@*"'IE%; -MJ/?&^3HT,D#^D8I96J-^F6+ -MFZJJCJ".2.KS[C?&C86(&K.9NE(!*-+-W _B -MHLF_%GC@O_VNAI(7O1#@V7NZ],N'2(^ E@:]KIZF58-)3='#U<34U0GG\K>^ -MDZ7+FEIXC+;E>O7^9CKRG*/RGW"W<\+9RW,0A(:2A9+TFZK9\E5O]_90U9!6 -MOW"#CYJ@^X$IZ='(BI22U/HU'*NYEGUG\\;\/J+0:YJX,IN2AY7SF-K2<);7 -MRZVFP;^*0W>R7M0MU\4G[_ CBQI03BQH-*S@">OH.N%ZOS -MI9< P\3[[N;W1K9[5T(0AKQ2>Z1:\M? =5Z:\E6#TL;%;N;/-D.VQ$M:;Y.VLIP(]\4P^J-=M+ 9K$=7T)Z> -M6RIL]]0P&P]PF8CM6X;KD%6#&6K8!J80ME2GO;Y5$D6=H#6"\?XXU^[_]IB. -MOQ"3CXE*F^)>?U'?R\\4Y>90(N! -MJH<# -S1EO&5\+V?LMF0;._2%$^\EH0=E:27WV" 6L',QM)>B%>=^K"3O[.% -M^L$4GQ(FA;R=%!8;DB\/FH,-P?G%\D/O4Z"AF9R)59YRC!#JX<7'[]574E1* -MI(J'B+GT?MM<' W*]MP/D#ZAHTRORY!?@\,Z$.06VO.KEE&0F+N&F]Y@1E<# -MJM'C7-]")IQ3BYT0J R^FO;AI9OR\?:BGN7OFH)2732'>AMRJ^- >DF:!?:' -M6(KR]K[OUM?U=YA?D*)2WIMD!@O-'L[PNA9#BU>2\8N0)E?'UL7EUA+_3605XM/IKB^2)X6D(G3/OC&^_;5SYY>BK^=GLOX7E,L_-A( -MS^*6GU9?E8U604+H-D+E?NS\]^?%O[7$AUN/D4^+H'NJF0[(H0'!S4#&B_[? -M$((,NYHR<9_1 L#U-?X_UUV DD'G' -M]O"9EFA7*%N83;6.VO+E_O7"P6O6JHH)F(Z->(X8S=_@U\K3"ZU]C!^6QEWK -MAI!0S69EGFWPHHM2G)=7I*U\H:S6")&CZ!\%UMPAN^\@B+JTU=P+&LECZO<)>+DL$3[>8:^]DUEG.1C**"FT.UJ0TB -MD1"*H\F38VE -MTEORSQ'P6E9031"7LY$'._$@=93'6EP;KYJ=T+F0)ZD#Q.;<,%V+O873LJB@ -MFY-SJ]3?UL+"1X^AJ*J[E%)*B,GJ9?7PXL=:,'VXAQI$LY_)-\=PQ?!SETVX -M#+[&#H>-EKL3V@H"2M/\GU"6N+L7C4-Y\ZKQ8MF64$6BPJB$GJF66IB+N:6H -MQ5[84Z#+7L+8ZL^\BON6./^:+%_941(\Q-HOPQC3LX2?D5N)(PL'" 1P"AR' -MN+R]96H\QC VTIR3FZT025J];).ZQU=:T9P05DF.%?*_N8^K IYX__Y/<$ZF -MN8U64,Y;GS_%P^7V+ME#I9&/VHL/E9CO@V+VNYZB]TOVD(^_6F] -MG56HIJN6I"0647%D__02[]-<0!2M4+-*.P>"]4NN>Y11AIGXF<6I3?F,%'0-R$@Y95D$>I@I.:7P4J-/8GHYS I")2JX*N=!.?R^ M -M._OBB_!&JJ@-&!1#G-JJU.?^-<4+CM6F0PQO:+&WJ<'-B@/)OEKYLA7NM -M"Z"%W<#RL3;TY$#KQY&3EYY(@K/$EGKE)E&&_ ?.]U62F(T%K)>/N%K$#Y<) -MY-C:Q<7"A$2CA9.72JE5PRC(C9R*K9K;EBN,W^/2\#X'A%"?E[255X,UEJB@ -MIRMTG_!3AHV5%XMFCY?5M-%R,_?QD(YYL)!3+J !;_+2\3>0RXKWH-.KOZJ0 -MT0WG$9V:ME %GW90E&SRO4*RWAWD_M1>IO&SHPZ>U8.HBYZ GIUQ(''@-A;8 -MC[J8L)R:2():>AZ](O_:%(?"I-#Z.9W^E7.ZKIK2PZ#;46OL]IKEX712BI#W -M@)R*VNL/\%A#ODMTD5X2X=[Q9OIN$/24<962BI&+AGY(\>'YDD*4PH^/ -MNKY.J%VOH_J Q=S4_D8AP82$F9YCBFM2EKY8T_#SDO8G]]FOOJ6ZFMLJ2(&U -MM\,&0<'6=]PC4E[2.YJWC(=2DKI4FJ/7[?:4TM,QMJ* -MHG&L7_'6,S8W[\&7M!Z']@"6MV!P>LT7(1FO@[.6I+R+BL97FH?T[>?_PQ.Z -MCX&/6B:ZI'+!P^KD]F7;XYY%V*AK6%I5@=%^^>)T)8&#\$S5E*V/.L.4^5C( -M5,+=R+!BQKV E?WM1Z 25TSJ$48UG\:;A*M[OZ:36 J1UAK'PD1WK:KJXO&3 -M5YZW6?Y/7O1J]XG1,:/3P#9PK )T_YDH'$QO7A_HFV_:8=MM#"#9"H\&:\FL\0!Y20FP)-KD!3'@' -M9QS&TPJ6.YUZOIAT4JS9T>7&.L"BOT>N0$D5ZT$Y@(,IS?W^R@/&0Q8&K$F> -M36U@6A" P96FL/KO@UY]5U9'DUF ?9)+:)1X7_%VDO2#5@=BZ^%P)B@M!9W -M\?/Y.F?0PHA0E%F^68(!\<[)6;V#GHZVI5^-I.H8_\9URI!0>G']G)Q^I-93 -M)]\%@*V)@\Z]]*^"@ 690?(M\"? UJN6DYV(3PVRDZ?QP=4N5J.(E[)]JBV3 -ME@-6"<0Y),?WVT]5G>VS [L[S]E;PE9:-$DRGHHY7\<)D[C8Z -M\4Z^1)\L4XB(GB:&T]KOX$\J*@# Q@V;AP"Z\$*?BLF&FL?S_>XR;L%_L%N% -M0%>6F-K>PO"YB9(KCZ-;JZ#B=/ P%H%R: -ME[:Z7\TBY?0R\,6#]I.;JB:65]M4HO.=TC_+K87TGY:3F >>ZL7 W-9R/\"& -MGDP\#-:!HV9P4MC]^DP Y32"G)!%B:^[2V!0>,GVP3WT_\J3._U>FY!#=HN@ -M6KMQ" 76P, 1SM*Y/JLA4E93>::0MI,1,=_&1E;"SLF4CHXA&GLD_P*!B8)0 -M?I6GN@/3_N^?@IJ$T2OW-/3F!UZ,FI1+'[\O.9H9TP %Q\I#XYR@G*6I -M6HT=.*:=PV+C-C 6\(J/<"H#WXD>XE4B#\[M"H8&E -MNJG ]1YN/ML:LY.4I%5: N#6V3!7D#0,E]&"@Z#RDQ8R]AM4"+25C@BZ66)T -M^DBVBS!0"<&6/3/EKQF'E*))LYNJ7Z>)PO)E[G?3"W+&E_I" -MKE6*CZS">+YV>_%ICII 3K96BVP"D]&L!(_& T 76K!$'\;ANJRZ\\U^,]6] -MQ9M:F([&_'"+EE1H7YO-2LG3^,/(@)"&K*Z@FEN_&Y_&7%W%]$7DQO;8O=!6 -MKOJ0G*K"[*"(K)P6.4^1*Z\BDH.4 -MDYHJ\L@)RP%&U-LXJ(?%E5P%DQ;T>DZ[YQ+&Q;O&PU@1AA^6E9A*\03:T)!0 -MHDL'E)*:S?O5_X:P@8/H+-W*[8>* -MO8F\F7JWD&NKL997O\#A]6S0^J,DE6L=XW'Q?0/\9._DE&QB1G6-] T -MQ@%=E*.QQ?F^$Y/^2I;>9_3"=VTE$\<;NQ=Q!#L&ZJH=?VEN/ -MTOY$\.X%:Q>3@K:XVZ7:@)F1E,?&]ZZ>\(V439X,DK)?^.MV4^// 0-L]-G_M2@IJ-"%J CKZ [MC#QLT/QQ_DY"MX"D -M)%%QP/3L+L CG;VBD9"PFITEP\K0,8F2K773NAMB\BT:,- ++%.TF[#W0%ML -M5 . YU/3GKP*VW2%JH*MMMTEN^UO]D\02H6KGKZ3A_>9O(73]O_ZY1-?I:E_ -MDXQ42TW9YO7^-Y>K2;2>+4FTE*K1^_:= -MTO6:ZIX$@IHZAY?RP,R?T0+,SY/O*@L(3XBU&W:_AUP&)J)RTV'0U^; )?22 -M%EU&4)99P-WS\:B$H[7;@WGS)]/1Y_07VZV*6;U45UY?*8Z:]PE%2:X*KR7OM-O0JU9U%LAN6@MR@DJP!^_'^4.-/?J&="D*=\HBJ1?''\#9Z -M\HZRFJ^'=_(ZPH*8<)5>AX\H -ME*2/@NTHZ>,C@P4'$DB7E0&[M@-#B^VGD0C#[J#@]8%0$(&[EZ"9@P%/HU&( -M5D&K@)*Z?0OO=EPJ'R].\D*"=$A$6FZ&.GLCS[,;V -M=M*O1:2+GIM25K%,6? 55/K.J8>ADQ^3!A/^H,R4)^_ZQ=..E9R5A4^^BT:@ -MFPK@U)A=;QX95L[_8EG9:>A8>)BYL(ZP44#Z:1])"*D8]A]/W5 -MFL2GKX">6W>BB(GH!9G2[L<6#YN1E+?$CDF&VOTGX/3&^EK=IWVX'_JJCXZ@ -MB?5\*VR@+NFF+F-K8+:M82(7[> M:Y*A3GUQ-_7VWVFEIZ B,&? -M;%Z_07SOUH_PH]'V$WR=$9 #K/OM9?K/XX>:D$J#JJRR!TIST<77PHOCHJ8O -MNE&5I+=, 3YYY\0Z$4*W_8VYA;MKH)03&,^,3<_B_$S&6HIOGE^-8;H+"?+M -ME_HV15">F5:#H%O\^7UZ.Z -MO#9$E%22B/+_VK2H&%H&DI6*P^23Y=6V18*5DE;VAG264O*'KT%^+1N':Q;I? -MNN:/U*BX7Q]Y6SQP3AZVCUO^'&Y20\)?UZFWEPL#Q^8@+N5(R_BB9@U/8 -M>9Q4?867FG[(WK6Z9CK'C%P!K;:@DL,YLE?9YZKZK:"+K-^=F:ZLFJ[1.9,N -M\,*XGQ8PDY.#&(ZPC-/ T1O4 -V:P?U**T9.FX ,TKFW_.93[Z:,.$*2/)D@ -M6J[##:Q4YMOQ@Z2]@$^3SU*( "TG/B7^IO)#BZZ0HIN.BYO4N\":U,[;XLK& -MUL/<0-^="H)>BY::2+>ZV7+P]:_P)8_)@)U4B;^Z\9><@UA_ -MB6RA:_<67Z.-GZ*_>(F=U8*4), O_/?P%6=.G,V7C V2J)7_4L#$R:E#\9^T -M?DS%CHBHJZ7XQ;05QKWN\*&J^QO6$Y*!EZF7K:-OPB]/G_SJU$=^SK> -MT[.2FM'[Y.V4^BN$$%&],J*J6Q5.TO0=EA.IAE*RG>TVE3__K=/P78G/O8D: -M]S!RFU%58S %G/*%59%8$\PPGN<^\7YEV_#+FL&]>^^<=B.EZ?XU=>X%CW"L -MET.G2"!?G_#DU1+0]MM-< YL2Q*-0)&0>T5O_\U/%<.&]]^,5W^!/6:.70$6 -MQ^_FTE#M?9DFD9"0JI>YE]WRSCB9C0_PLTO?P)SKHP@@ML_^SWMN^)6!!1GY"AJI'CO9U'(T#PK=S3 -MF4;7@KUAH(CJZL<0$,7!C;:YJIJO7;!Q1\7$-;_DQHJ:*/NJ.QS5H)G2]GFE -MY!#BF51_G#L83+TAM[;GR$C5U_=XCI!)GDD.BXULEXM(U/-W[Y;;4HA?BUI/ -MB9PRK+(-40V+Q#*O!)&\UB^?V*^"ADM.L(+2H4OQ -MT(P"HYU7@M.;\L*C.N_NVORP5ID$45F8P25*.WD(Z:4'A%@PSZ->_7UZ?XL_Y-M'B!DN4#PM94=DH,M_>87XGF -M+,?NU@5.?9:<\'U6J,!>BUG#QMQ?H90\E;$(@VP 5]*2967E]=&=ID7RF -M5$MH0,#$]'/'DI*X]H.#';)1O:"V\5 UDNZ]&Y>\KY>/JZP:&,*T?%G>/G)K!LX+(_ YUSPH'X\N(KMO!6)9M -MGO)*3E,BDC[&)&;/4=A6A10)@ZODV=CX_9(B'YN5JHKRPC5M[_Y0N(NCA5H) -M\C&CIJW7QO+"FI19K(^ASEVTAD+8H9;UT-'&F\:KJ]@0TM10K$6C]1 ?T6>R -M;%\*FX>/DT 1'K3NUL;E8Q"]B@V'[1LAVD$)"@ 6!-K(AY;0/)RX9:MLEY_- -M]-$P]B?;[YQY?H.62*BPI(^:P*I2*M$.2?. NYZ<@U9 FI&2H(_-Q^NN[O;^ -MRY!6K.18**7H:Z#Q+RC -MG_F<69ZY0 _#R//F]\6K$HF/D[J2CPA7@HA8T]76U\J[TBP?LI&H=8FO\.'D -M]^SZ)KM/C> ]<@%3EI(70.W>"N;"Q!22N)P4JX"3N*0^P-;U1L:N0ZB&F?#8 -MC[N6)NR<0LW]J8JHC8J:%^+5@M&C\S?O]'51H%I&FO"+F]D= -M$_6X0GY=D%F"6\-R-?+FQ8^=G*2M,(M""V/7FR+V -M-,6:_ZK^>6IMV_OUHK -MAK&2TT$/ZLCF5SF5=GF4N:C,ZI!T@N+DQS"^,E6_%?&UEC!B@')P3H+9#LCW -M6LC?&4"+3[=>J?J#FJ)LEI['\#7P;C;2EYRRD9HQEX+Q2O72?IB6G(Q0F8*C -M,A/P]/( J(.*O)^8B+MIH(+S[84<+_)X6U8(O\.CUE<@\OGW^LBUJ/:D6_'/ -MG[>3O<+V'>0^Q1*2(_*;N(:&G[ZA0/U]_?ONNQ*0+]Z:JXNML B@Z ?H!LN( -MJ:><@(SZ3IUSEI]!-^<;[O[#:9O=DIO6CU86@))?\?[KYNO(@&_5ARP1D7Q^ -MRISSD86:P/C&NB7D\_2)EM64>KFY@,+:X+PV4;BD=Y?;)_;S-OWPSZQ6RAF> -M5WFY0]HXRP.NN'JCF)TSE5JIQHR#X1 \]C!7-8U6:9J;HU):GTJ@QL%]XB5& -M_8R)K@_7L%.-US_NI]8VPI:6OHV]AXV3X%NZVJK4SXH"TKL5K]2)N)5'ME>= -MPO1%)'_^"KNRK4.)H$U2LF.?B6Y1%#9/;G?&)X-2N,_!6DEO,>0+QLS8R_\+^7-N]?;$*W2*$77##\1@J -M@8&;=Z>06^R"0^#1\;?_T^ 2I&P)2CBJ.J%,R/&VUO("BZ>D0WJA%);U9%+_ -MQ>;\QO.&E!BHETV.JR10\P/^#,%+43VILDF.HWN^BZQ6BQ?6]_;ZUO#K+ASS -MB;J-J9G!CIW)HAQ?(M_!0N&"GM\+GI)#5X.B-YCQOCE"_\8C68 6G8ZRB:CC -M52G0/AP+A;"0G/?EP>?6_/IS+!:)KL*7NAEF0#O SN=45""6G0ZALD#CEE/) -M%#3O]_'3DX!I@U&#OX1WG.S3P20ZP)*7H!.HK[.<%;C:GCSO_G/S ]91G\FH -M0;ML(%?-R@\:QHK0EUX1CXN+C:]F_XJ#%L7^P&Z(AU97]Y>>J)^F\+Y[2._D -M0]31 G$(N9/]&H!^F8A8L%.KP/XS.OXZY1J1^["0E*H+@O_STLQ0 Y$WEUJ> -M\JOLGN64X[Q<@;6>4*^+S');(-L'W*Y;^Y"0DU:"J::9XT(W\,+CP^<7J8BO -M@T:2D9H$P?COQNNFGY.#6AV2$HL:VI?V^A)'X3T:'$_M1HL.H8Y;%^0)_^?B -MXH./E$1>4X",V3;%=J+: -MDY>V5S9;K@Y3K,#0[])OUE.-O97MOU^)BL:$5_$*'N/' ,B4M%14G_8@CY:. -M4Q$V-7OE^EJYAY"UJ:>]=A*[LX.E!EC/S\@LSO&KJ)[SL?62B?*2AYK#*A7N -MTE?U?G >5:#1]I\%Z8'(#Y."T2 PO(#(T\"VKNB5Y+0L;/O]O-29YHJTI9+C%^5ZB#"/-#^R4:")9?ZJKX5HX!, -MH?37^BY/G19>FF2N()MMAL*IR$VHWO,<3I:L3;D&[U-F=K;A,A#OYF6A@Y+Y -MFP+R@7N*:80?AP)*S,\*5,J#JIN,B*FFDII3Q+!WPSKD]N7N\)J3E(MR@,.K -M$7\5V*YR7@Z:\-B6\^GJJDJ&"':%6;%SO%]L7_\,N&G:.>]XJ:,J16T*XV;).IO7\'T3)V^(:M?8[1YRL -MJR22D?0N=>M%EHN+Q -M4].#G@9@KYJ(G:P&EW'V-.+'^O/*EM%:T+Z?RJ'YDAOWB*ZG1) OTN6C2O&; -MC'^/ I!ACA+1X_?UTM.%4));FU:E3$/EUX-AD)#0^Q(3U@W',;\5L+O VI ? -MG+18F*DXA /'_,\+L+!3JX19J%OD$%W-,!&7]:L<&;V$@JGIE;K;X$F>EWK$ -MVP^>>8-3NHN=I5;EL";WYMK#UU^,; >]C4UCOG?HU"D9Q5LREIN?S R7N4TY -MI9,%,\3V5A &DH^,VX.5AIX&:;>0D0*LU\>-QL661T^-DT.=JH!*IEZ:PI#E -MEM>:P7^(0%U.2H*X[1G/\Y0+GBV7E192UZO\^O/N"YIQB\5&M+9;XM:M\1O/ -M'(6V,@2GDIZZH+>"QSO7+/J^/>"T>(JNCDB\ -MCZ5*X;6:Q_4>1T[_#QO"C_!6 -ME\4B-.X[RW#GIG1= X:MCHM/A^ 3];9PCJ7L0QB37Y33Z*USESO[^]B/4*Q( -MZ9N;CX7<\7$/VMT6P\F/W+F:2_I-K::"@,SD^?ODTH_HEJRS>O>'4[8%MZV@ -M_H1QR\_$CL&'GYV0J;6)3A& EYKG_O/D]NW%A$B(J5J1'*GKWZ<07)7[D1QS -M29+ ]G&6/I/+?(N3L0^=_)*4$-L(SP]D.)Q?A5>2FH%AI)<94;7FU@+(4H^@ -M5T.[#Z971@TPY^__SI*,H(M3@HCPA83 T_;2,!0!G)99KY:HJYUCAJ[#5I1\ -MK*4(OW2:1YFXC(:*5[_HU#WMM=;S0K95LUO5COI*;+9#$-@ X_]BRR>T4U>; -M1Q&0II821I.;)Z%%'"@%*^R6))6PYN_A"MY^@NVJ_08HFF&8R]GI]!1D^7P,#.;<\HYH] '8B/7LVK -M8$1;F9KL\C?Z3XJ2A7=U[6LR3C$]MY"PYH0>0F+?XRC -M3<#^;>[P9AJ)5 9-@IRE( !D,STJ>@(YJ75YHNKG[FM'S[/3P,@-) -MOME;5J1(G[N OXF% ONCRX_"CKR!E'V%J//GDY3!EY[-,A9G_:*3_>(DXLH -MAX#;:&SN,O<84)6 FM.I=HR5JL'B_/+D]5*VDIJYNPI&DHW17\=V=C[15W:( -MO#^&#HZXCDC-#?^O#=/27B_'RI6MPPI&NH.QEIJ* -M\,9" 5+,Q]K)F7@YFI9:+?R?H)^-I.(]%>[WCSV T;$Z,9:9!=SE$)B2$ECW -MD1J0P])O^[;$PKP*7H22H)NM0I/=*,-*_)"[FJF5]UH>IHY33>)6_;XK.X*C -MK;BS@OI&=8X TB&6VD^[GD&7^CV8SZ:M]-XNQ?Y@PVR6GZJ\VH]=H+79V\[* -MS0;2RK^RNHRL^Z6BK!X;K7*YQ].ZX^>!&)7O1KSG<;POB.\B()UL'2^6]+*V?*4D9.%4%37@<'F[,)O[\.. -M\(.;EG>"@SF7MJ7)V1 .B+*MFB%<@TR^B,/3D3!4TM!'Q[*=%\<(C[<&X./U -M^I;6DIV%@MJ2UH9(K:'P_ZEYX%EY_ -MU-SN>O+:])R$FP!QB8/1^87 A(A?FU2C?%+"PCCR$.6CNHBSK5H$KH/!WD'9 -M(P/R7"2&B38128FR]YK,\_E %^5)IX_#FKB-?I91@:+D%6[WU4_2;).L;Y^7 -MVK[-UM5VFL8;KJ2. 8FOKI,$L(K)5EP; L7REH_PK+V>1-*[EBG)$N\5R+E9:*T->.QAJ5L*5TRJO$O 6X4^0 -ME)2'7EZ;I8"!TJ * ]G?*\B>0M(- -M6MF1FM+ ?,?3[N*1EI"$AXF#@6P-FU/4\QF?O!&%CE5*6J2'@QDYV?_04-O) -M7Z 6N;C7E_4 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/tpg/94654-20170317-085441153.pts b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/tpg/94654-20170317-085441153.pts deleted file mode 100644 index 6760d5ec6..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/pts/tpg/94654-20170317-085441153.pts +++ /dev/null @@ -1,289 +0,0 @@ - -94654mynewt-Updated - - - L2CAP - 0
2
- 1
3
- 1
4
- 1
5
- 1
6
- 2
40
- 2
41
- 2
42
- 2
43
- 2
45
- 2
46
- 2
47
- 3
1
- 3
12
- 3
16
-
- - GAP - 0
2
- 0a
4
- 10
1
- 12
1
- 13
1
- 13
2
- 14
1
- 15
1
- 16
1
- 18
1
- 18
2
- 19
1
- 19
2
- 19
3
- 20
1
- 20
2
- 20
3
- 20
4
- 20A
1
- 20A
10
- 20A
11
- 20A
12
- 20A
13
- 20A
14
- 20A
15
- 20A
16
- 20A
17
- 20A
2
- 20A
3
- 20A
4
- 20A
5
- 20A
7
- 20A
8
- 20A
9
- 21
1
- 21
2
- 21
3
- 21
4
- 21
5
- 21
6
- 21
7
- 21
8
- 21
9
- 22
1
- 22
2
- 22
3
- 22
4
- 23
1
- 23
2
- 23
3
- 23
4
- 23
5
- 24
1
- 24
2
- 24
3
- 24
4
- 25
1
- 25
2
- 25
3
- 25
4
- 25
7
- 25
8
- 25
9
- 26
1
- 26
2
- 26
3
- 26
4
- 27
1
- 27
2
- 28
1
- 28
2
- 29
1
- 29
2
- 29
3
- 29
4
- 30
1
- 30
2
- 31
1
- 31
2
- 31
3
- 31
4
- 31
5
- 31
6
- 31
7
- 31
8
- 31
9
- 32
1
- 32
2
- 32
3
- 33
1
- 33
2
- 33
3
- 33
4
- 33
5
- 33
6
- 34
1
- 34
2
- 34
3
- 35
1
- 35
2
- 35
3
- 35
4
- 35
5
- 35
7
- 35
8
- 35
9
- 37
1
- 37
2
- 37
3
- 5
1
- 5
2
- 5
3
- 5
4
- 6
1
- 7
1
- 7
2
- 8
1
- 8
2
- 8a
3
- 9
1
-
- - SUM ICS - - - PROD - - - GATT - 1
1
- 1
2
- 2
2
- 3
1
- 3
10
- 3
11
- 3
12
- 3
14
- 3
15
- 3
16
- 3
17
- 3
18
- 3
19
- 3
2
- 3
20
- 3
21
- 3
22
- 3
23
- 3
3
- 3
4
- 3
5
- 3
6
- 3
7
- 3
8
- 3
9
- 4
1
- 4
10
- 4
11
- 4
12
- 4
14
- 4
15
- 4
16
- 4
17
- 4
18
- 4
19
- 4
2
- 4
20
- 4
21
- 4
22
- 4
23
- 4
3
- 4
4
- 4
5
- 4
6
- 4
7
- 4
8
- 4
9
- 7
2
- 7
3
- 7
4
-
- - ATT - 1
1
- 1
2
- 2
2
- 3
1
- 3
10
- 3
11
- 3
12
- 3
13
- 3
14
- 3
15
- 3
16
- 3
17
- 3
18
- 3
19
- 3
2
- 3
20
- 3
22
- 3
23
- 3
24
- 3
25
- 3
26
- 3
27
- 3
28
- 3
29
- 3
3
- 3
4
- 3
5
- 3
6
- 3
7
- 3
8
- 3
9
- 4
1
- 4
10
- 4
11
- 4
12
- 4
13
- 4
14
- 4
15
- 4
16
- 4
17
- 4
18
- 4
19
- 4
2
- 4
20
- 4
22
- 4
23
- 4
24
- 4
25
- 4
26
- 4
27
- 4
28
- 4
29
- 4
3
- 4
4
- 4
5
- 4
6
- 4
7
- 4
8
- 4
9
- 5
2
- 5
3
- 5
4
-
- - SM - 1
1
- 1
2
- 2
1
- 2
2
- 2
3
- 2
5
- 3
1
- 4
1
- 4
2
- 5
1
- 5
2
- 5
3
- 5
4
- 7
1
- 7
2
- 7
3
-
-
-
diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ans/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ans/pkg.yml deleted file mode 100644 index 691e566e1..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ans/pkg.yml +++ /dev/null @@ -1,34 +0,0 @@ -# -# 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. -# - -pkg.name: nimble/host/services/ans -pkg.description: Alert Notification Service Server. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - - ans - - nimble - -pkg.deps: - - nimble/host - -pkg.init: - ble_svc_ans_init: 'MYNEWT_VAL(BLE_SVC_ANS_SYSINIT_STAGE)' diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ans/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ans/syscfg.yml deleted file mode 100644 index 74de8d963..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ans/syscfg.yml +++ /dev/null @@ -1,30 +0,0 @@ -# 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. - -syscfg.defs: - BLE_SVC_ANS_NEW_ALERT_CAT: - description: "Initial supported new alert category bitmask." - value: 0 - - BLE_SVC_ANS_UNR_ALERT_CAT: - description: "Initial supported unread alert category bitmask." - value: 0 - - BLE_SVC_ANS_SYSINIT_STAGE: - description: > - Sysinit stage for the alert notification service. - value: 303 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/bas/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/bas/pkg.yml deleted file mode 100644 index afdc69421..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/bas/pkg.yml +++ /dev/null @@ -1,34 +0,0 @@ -# -# 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. -# - -pkg.name: nimble/host/services/bas -pkg.description: Battery Service -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - - bas - - nimble - -pkg.deps: - - nimble/host - -pkg.init: - ble_svc_bas_init: 'MYNEWT_VAL(BLE_SVC_BAS_SYSINIT_STAGE)' diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/bas/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/bas/syscfg.yml deleted file mode 100644 index 279930f14..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/bas/syscfg.yml +++ /dev/null @@ -1,34 +0,0 @@ -# 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. - -syscfg.defs: - BLE_SVC_BAS_BATTERY_LEVEL_READ_PERM: - description: > - Defines permissions for reading "Battery Level" characteristics. Can - be zero to allow read without extra permissions or combination of: - BLE_GATT_CHR_F_READ_ENC - BLE_GATT_CHR_F_READ_AUTHEN - BLE_GATT_CHR_F_READ_AUTHOR - value: 0 - BLE_SVC_BAS_BATTERY_LEVEL_NOTIFY_ENABLE: - description: > - Set to 1 to support notification or 0 to disable it. - value: 1 - BLE_SVC_BAS_SYSINIT_STAGE: - description: > - Sysinit stage for the battery level service. - value: 303 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/include/services/dis/ble_svc_dis.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/include/services/dis/ble_svc_dis.h deleted file mode 100644 index d095e959a..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/include/services/dis/ble_svc_dis.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - * 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_SVC_DIS_ -#define H_BLE_SVC_DIS_ - -/** - * Example: - * - * char firmware_revision[20] = '?.?.?'; - * struct image_version iv; - * if (!imgr_my_version(&iv)) { - * snprintf(firmware_revision, sizeof(firmware_revision), - * "%u.%u.%u", iv.iv_major, iv.iv_minor, iv.iv_revision); - * } - * ble_svc_dis_manufacturer_name_set("MyNewt"); - * ble_svc_dis_firmware_revision_set(firmware_revision); - * - */ - -#define BLE_SVC_DIS_UUID16 0x180A -#define BLE_SVC_DIS_CHR_UUID16_SYSTEM_ID 0x2A23 -#define BLE_SVC_DIS_CHR_UUID16_MODEL_NUMBER 0x2A24 -#define BLE_SVC_DIS_CHR_UUID16_SERIAL_NUMBER 0x2A25 -#define BLE_SVC_DIS_CHR_UUID16_FIRMWARE_REVISION 0x2A26 -#define BLE_SVC_DIS_CHR_UUID16_HARDWARE_REVISION 0x2A27 -#define BLE_SVC_DIS_CHR_UUID16_SOFTWARE_REVISION 0x2A28 -#define BLE_SVC_DIS_CHR_UUID16_MANUFACTURER_NAME 0x2A29 - -/** - * Structure holding data for the main characteristics - */ -struct ble_svc_dis_data { - /** - * Model number. - * Represent the model number that is assigned by the device vendor. - */ - const char *model_number; - /** - * Serial number. - * Represent the serial number for a particular instance of the device. - */ - const char *serial_number; - /** - * Firmware revision. - * Represent the firmware revision for the firmware within the device. - */ - const char *firmware_revision; - /** - * Hardware revision. - * Represent the hardware revision for the hardware within the device. - */ - const char *hardware_revision; - /** - * Software revision. - * Represent the software revision for the software within the device. - */ - const char *software_revision; - /** - * Manufacturer name. - * Represent the name of the manufacturer of the device. - */ - const char *manufacturer_name; - /** - * System ID. - * Represent the System Id of the device. - */ - const char *system_id; -}; - -/** - * Variable holding data for the main characteristics. - */ -extern struct ble_svc_dis_data ble_svc_dis_data; - -/** - * Service initialisation. - * Automatically called during package initialisation. - */ -void ble_svc_dis_init(void); - -const char *ble_svc_dis_model_number(void); -int ble_svc_dis_model_number_set(const char *value); -const char *ble_svc_dis_serial_number(void); -int ble_svc_dis_serial_number_set(const char *value); -const char *ble_svc_dis_firmware_revision(void); -int ble_svc_dis_firmware_revision_set(const char *value); -const char *ble_svc_dis_hardware_revision(void); -int ble_svc_dis_hardware_revision_set(const char *value); -const char *ble_svc_dis_software_revision(void); -int ble_svc_dis_software_revision_set(const char *value); -const char *ble_svc_dis_manufacturer_name(void); -int ble_svc_dis_manufacturer_name_set(const char *value); -const char *ble_svc_dis_system_id(void); -int ble_svc_dis_system_id_set(const char *value); - -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/pkg.yml deleted file mode 100644 index b914ca90a..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/pkg.yml +++ /dev/null @@ -1,34 +0,0 @@ - -# 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. -# - -pkg.name: nimble/host/services/dis -pkg.description: Device Information Service Implementation. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - - dis - - nimble - -pkg.deps: - - nimble/host - -pkg.init: - ble_svc_dis_init: 'MYNEWT_VAL(BLE_SVC_DIS_SYSINIT_STAGE)' diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/src/ble_svc_dis.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/src/ble_svc_dis.c deleted file mode 100644 index 55c6f1d56..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/src/ble_svc_dis.c +++ /dev/null @@ -1,331 +0,0 @@ -/** - * 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 -#include -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "../include/services/dis/ble_svc_dis.h" - -/* Device information */ -struct ble_svc_dis_data ble_svc_dis_data = { - .model_number = MYNEWT_VAL(BLE_SVC_DIS_MODEL_NUMBER_DEFAULT), - .serial_number = MYNEWT_VAL(BLE_SVC_DIS_SERIAL_NUMBER_DEFAULT), - .firmware_revision = MYNEWT_VAL(BLE_SVC_DIS_FIRMWARE_REVISION_DEFAULT), - .hardware_revision = MYNEWT_VAL(BLE_SVC_DIS_HARDWARE_REVISION_DEFAULT), - .software_revision = MYNEWT_VAL(BLE_SVC_DIS_SOFTWARE_REVISION_DEFAULT), - .manufacturer_name = MYNEWT_VAL(BLE_SVC_DIS_MANUFACTURER_NAME_DEFAULT), - .system_id = MYNEWT_VAL(BLE_SVC_DIS_SYSTEM_ID_DEFAULT), -}; - -/* Access function */ -#if (MYNEWT_VAL(BLE_SVC_DIS_MODEL_NUMBER_READ_PERM) >= 0) || \ - (MYNEWT_VAL(BLE_SVC_DIS_SERIAL_NUMBER_READ_PERM) >= 0) || \ - (MYNEWT_VAL(BLE_SVC_DIS_HARDWARE_REVISION_READ_PERM) >= 0) || \ - (MYNEWT_VAL(BLE_SVC_DIS_FIRMWARE_REVISION_READ_PERM) >= 0) || \ - (MYNEWT_VAL(BLE_SVC_DIS_SOFTWARE_REVISION_READ_PERM) >= 0) || \ - (MYNEWT_VAL(BLE_SVC_DIS_MANUFACTURER_NAME_READ_PERM) >= 0) || \ - (MYNEWT_VAL(BLE_SVC_DIS_SYSTEM_ID_READ_PERM) >= 0) -static int -ble_svc_dis_access(uint16_t conn_handle, uint16_t attr_handle, - struct ble_gatt_access_ctxt *ctxt, void *arg); -#endif - -static const struct ble_gatt_svc_def ble_svc_dis_defs[] = { - { /*** Service: Device Information Service (DIS). */ - .type = BLE_GATT_SVC_TYPE_PRIMARY, - .uuid = BLE_UUID16_DECLARE(BLE_SVC_DIS_UUID16), - .characteristics = (struct ble_gatt_chr_def[]) { { -#if (MYNEWT_VAL(BLE_SVC_DIS_MODEL_NUMBER_READ_PERM) >= 0) - /*** Characteristic: Model Number String */ - .uuid = BLE_UUID16_DECLARE(BLE_SVC_DIS_CHR_UUID16_MODEL_NUMBER), - .access_cb = ble_svc_dis_access, - .flags = BLE_GATT_CHR_F_READ | - MYNEWT_VAL(BLE_SVC_DIS_MODEL_NUMBER_READ_PERM), - }, { -#endif -#if (MYNEWT_VAL(BLE_SVC_DIS_SERIAL_NUMBER_READ_PERM) >= 0) - /*** Characteristic: Serial Number String */ - .uuid = BLE_UUID16_DECLARE(BLE_SVC_DIS_CHR_UUID16_SERIAL_NUMBER), - .access_cb = ble_svc_dis_access, - .flags = BLE_GATT_CHR_F_READ | - MYNEWT_VAL(BLE_SVC_DIS_SERIAL_NUMBER_READ_PERM), - }, { -#endif -#if (MYNEWT_VAL(BLE_SVC_DIS_HARDWARE_REVISION_READ_PERM) >= 0) - /*** Characteristic: Hardware Revision String */ - .uuid = BLE_UUID16_DECLARE(BLE_SVC_DIS_CHR_UUID16_HARDWARE_REVISION), - .access_cb = ble_svc_dis_access, - .flags = BLE_GATT_CHR_F_READ | - MYNEWT_VAL(BLE_SVC_DIS_HARDWARE_REVISION_READ_PERM), - }, { -#endif -#if (MYNEWT_VAL(BLE_SVC_DIS_FIRMWARE_REVISION_READ_PERM) >= 0) - /*** Characteristic: Firmware Revision String */ - .uuid = BLE_UUID16_DECLARE(BLE_SVC_DIS_CHR_UUID16_FIRMWARE_REVISION), - .access_cb = ble_svc_dis_access, - .flags = BLE_GATT_CHR_F_READ | - MYNEWT_VAL(BLE_SVC_DIS_FIRMWARE_REVISION_READ_PERM), - }, { -#endif -#if (MYNEWT_VAL(BLE_SVC_DIS_SOFTWARE_REVISION_READ_PERM) >= 0) - /*** Characteristic: Software Revision String */ - .uuid = BLE_UUID16_DECLARE(BLE_SVC_DIS_CHR_UUID16_SOFTWARE_REVISION), - .access_cb = ble_svc_dis_access, - .flags = BLE_GATT_CHR_F_READ | - MYNEWT_VAL(BLE_SVC_DIS_SOFTWARE_REVISION_READ_PERM), - }, { -#endif -#if (MYNEWT_VAL(BLE_SVC_DIS_MANUFACTURER_NAME_READ_PERM) >= 0) - /*** Characteristic: Manufacturer Name */ - .uuid = BLE_UUID16_DECLARE(BLE_SVC_DIS_CHR_UUID16_MANUFACTURER_NAME), - .access_cb = ble_svc_dis_access, - .flags = BLE_GATT_CHR_F_READ | - MYNEWT_VAL(BLE_SVC_DIS_MANUFACTURER_NAME_READ_PERM), - }, { -#endif -#if (MYNEWT_VAL(BLE_SVC_DIS_SYSTEM_ID_READ_PERM) >= 0) - /*** Characteristic: System Id */ - .uuid = BLE_UUID16_DECLARE(BLE_SVC_DIS_CHR_UUID16_SYSTEM_ID), - .access_cb = ble_svc_dis_access, - .flags = BLE_GATT_CHR_F_READ | - MYNEWT_VAL(BLE_SVC_DIS_SYSTEM_ID_READ_PERM), - }, { -#endif - - 0, /* No more characteristics in this service */ - }, } - }, - - { - 0, /* No more services. */ - }, -}; - -/** - * Simple read access callback for the device information service - * characteristic. - */ -#if (MYNEWT_VAL(BLE_SVC_DIS_MODEL_NUMBER_READ_PERM) >= 0) || \ - (MYNEWT_VAL(BLE_SVC_DIS_SERIAL_NUMBER_READ_PERM) >= 0) || \ - (MYNEWT_VAL(BLE_SVC_DIS_HARDWARE_REVISION_READ_PERM) >= 0) || \ - (MYNEWT_VAL(BLE_SVC_DIS_FIRMWARE_REVISION_READ_PERM) >= 0) || \ - (MYNEWT_VAL(BLE_SVC_DIS_SOFTWARE_REVISION_READ_PERM) >= 0) || \ - (MYNEWT_VAL(BLE_SVC_DIS_MANUFACTURER_NAME_READ_PERM) >= 0) || \ - (MYNEWT_VAL(BLE_SVC_DIS_SYSTEM_ID_READ_PERM) >= 0) -static int -ble_svc_dis_access(uint16_t conn_handle, uint16_t attr_handle, - struct ble_gatt_access_ctxt *ctxt, void *arg) -{ - uint16_t uuid = ble_uuid_u16(ctxt->chr->uuid); - const char *info = NULL; - - switch(uuid) { -#if (MYNEWT_VAL(BLE_SVC_DIS_MODEL_NUMBER_READ_PERM) >= 0) - case BLE_SVC_DIS_CHR_UUID16_MODEL_NUMBER: - info = ble_svc_dis_data.model_number; -#ifdef MYNEWT_VAL_BLE_SVC_DIS_MODEL_NUMBER_NAME_DEFAULT - if (info == NULL) { - info = MYNEWT_VAL(BLE_SVC_DIS_MODEL_NUMBER_DEFAULT); - } -#endif - break; -#endif -#if (MYNEWT_VAL(BLE_SVC_DIS_SERIAL_NUMBER_READ_PERM) >= 0) - case BLE_SVC_DIS_CHR_UUID16_SERIAL_NUMBER: - info = ble_svc_dis_data.serial_number; -#ifdef MYNEWT_VAL_BLE_SVC_DIS_SERIAL_NUMBER_DEFAULT - if (info == NULL) { - info = MYNEWT_VAL(BLE_SVC_DIS_SERIAL_NUMBER_DEFAULT); - } -#endif - break; -#endif -#if (MYNEWT_VAL(BLE_SVC_DIS_FIRMWARE_REVISION_READ_PERM) >= 0) - case BLE_SVC_DIS_CHR_UUID16_FIRMWARE_REVISION: - info = ble_svc_dis_data.firmware_revision; -#ifdef MYNEWT_VAL_BLE_SVC_DIS_FIRMWARE_REVISION_DEFAULT - if (info == NULL) { - info = MYNEWT_VAL(BLE_SVC_DIS_FIRMWARE_REVISION_DEFAULT); - } -#endif - break; -#endif -#if (MYNEWT_VAL(BLE_SVC_DIS_HARDWARE_REVISION_READ_PERM) >= 0) - case BLE_SVC_DIS_CHR_UUID16_HARDWARE_REVISION: - info = ble_svc_dis_data.hardware_revision; -#ifdef MYNEWT_VAL_BLE_SVC_DIS_HARDWARE_REVISION_DEFAULT - if (info == NULL) { - info = MYNEWT_VAL(BLE_SVC_DIS_HARDWARE_REVISION_DEFAULT); - } -#endif - break; -#endif -#if (MYNEWT_VAL(BLE_SVC_DIS_SOFTWARE_REVISION_READ_PERM) >= 0) - case BLE_SVC_DIS_CHR_UUID16_SOFTWARE_REVISION: - info = ble_svc_dis_data.software_revision; -#ifdef MYNEWT_VAL_BLE_SVC_DIS_SOFTWARE_REVISION_DEFAULT - if (info == NULL) { - info = MYNEWT_VAL(BLE_SVC_DIS_SOFTWARE_REVISION_DEFAULT); - } -#endif - break; -#endif -#if (MYNEWT_VAL(BLE_SVC_DIS_MANUFACTURER_NAME_READ_PERM) >= 0) - case BLE_SVC_DIS_CHR_UUID16_MANUFACTURER_NAME: - info = ble_svc_dis_data.manufacturer_name; -#ifdef MYNEWT_VAL_BLE_SVC_DIS_MANUFACTURER_NAME_DEFAULT - if (info == NULL) { - info = MYNEWT_VAL(BLE_SVC_DIS_MANUFACTURER_NAME_DEFAULT); - } -#endif - break; -#endif -#if (MYNEWT_VAL(BLE_SVC_DIS_SYSTEM_ID_READ_PERM) >= 0) - case BLE_SVC_DIS_CHR_UUID16_SYSTEM_ID: - info = ble_svc_dis_data.system_id; -#ifdef MYNEWT_VAL_BLE_SVC_DIS_SYSTEM_ID_DEFAULT - if (info == NULL) { - info = MYNEWT_VAL(BLE_SVC_DIS_SYSTEM_ID_DEFAULT); - } -#endif - break; -#endif - default: - assert(0); - return BLE_ATT_ERR_UNLIKELY; - } - - if (info != NULL) { - int rc = os_mbuf_append(ctxt->om, info, strlen(info)); - return rc == 0 ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES; - } - - return 0; -} -#endif - -const char * -ble_svc_dis_model_number(void) -{ - return ble_svc_dis_data.model_number; -} - -int -ble_svc_dis_model_number_set(const char *value) -{ - ble_svc_dis_data.model_number = value; - return 0; -} - -const char * -ble_svc_dis_serial_number(void) -{ - return ble_svc_dis_data.serial_number; -} - -int -ble_svc_dis_serial_number_set(const char *value) -{ - ble_svc_dis_data.serial_number = value; - return 0; -} - -const char * -ble_svc_dis_firmware_revision(void) -{ - return ble_svc_dis_data.firmware_revision; -} - -int -ble_svc_dis_firmware_revision_set(const char *value) -{ - ble_svc_dis_data.firmware_revision = value; - return 0; -} - -const char * -ble_svc_dis_hardware_revision(void) -{ - return ble_svc_dis_data.hardware_revision; -} - -int -ble_svc_dis_hardware_revision_set(const char *value) -{ - ble_svc_dis_data.hardware_revision = value; - return 0; -} - -const char * -ble_svc_dis_software_revision(void) -{ - return ble_svc_dis_data.software_revision; -} - -int -ble_svc_dis_software_revision_set(const char *value) -{ - ble_svc_dis_data.software_revision = value; - return 0; -} - -const char * -ble_svc_dis_manufacturer_name(void) -{ - return ble_svc_dis_data.manufacturer_name; -} - -int -ble_svc_dis_manufacturer_name_set(const char *value) -{ - ble_svc_dis_data.manufacturer_name = value; - return 0; -} - -const char * -ble_svc_dis_system_id(void) -{ - return ble_svc_dis_data.system_id; -} - -int -ble_svc_dis_system_id_set(const char *value) -{ - ble_svc_dis_data.system_id = value; - return 0; -} - -/** - * Initialize the DIS package. - */ -void -ble_svc_dis_init(void) -{ - int rc; - - /* Ensure this function only gets called by sysinit. */ - SYSINIT_ASSERT_ACTIVE(); - - rc = ble_gatts_count_cfg(ble_svc_dis_defs); - SYSINIT_PANIC_ASSERT(rc == 0); - - rc = ble_gatts_add_svcs(ble_svc_dis_defs); - SYSINIT_PANIC_ASSERT(rc == 0); -} diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/syscfg.yml deleted file mode 100644 index b306d3bb5..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/dis/syscfg.yml +++ /dev/null @@ -1,109 +0,0 @@ -# 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. -# - -syscfg.defs: - BLE_SVC_DIS_DEFAULT_READ_PERM: - description: > - Defines default permissions for reading characteristics. Can be - zero to allow read without extra permissions or combination of: - BLE_GATT_CHR_F_READ_ENC - BLE_GATT_CHR_F_READ_AUTHEN - BLE_GATT_CHR_F_READ_AUTHOR - Set to '-1' to remove this characteristic. - value: -1 - BLE_SVC_DIS_MODEL_NUMBER_READ_PERM: - description: > - Defines permissions for reading "Model Number" characteristics. - Can be set to BLE_SVC_DIS_DEFAULT_READ_PERM or use any of the - possible values defined for that setting. - value: 0 - BLE_SVC_DIS_MODEL_NUMBER_DEFAULT: - description: > - Defines a default value for "Model number" if not set with - 'ble_svc_dis_model_number_set'. - value: '"Apache Mynewt NimBLE"' - BLE_SVC_DIS_SERIAL_NUMBER_READ_PERM: - description: > - Defines permissions for reading "Serial Number" characteristics. - Can be set to BLE_SVC_DIS_DEFAULT_READ_PERM or use any of the - possible values defined for that setting. - value: MYNEWT_VAL(BLE_SVC_DIS_DEFAULT_READ_PERM) - BLE_SVC_DIS_SERIAL_NUMBER_DEFAULT: - description: > - Defines a default value for "Serial number" if not set with - 'ble_svc_dis_serial_number_set'. - value: NULL - BLE_SVC_DIS_HARDWARE_REVISION_READ_PERM: - description: > - Defines permissions for reading "Hardware Revision" characteristics. - Can be set to BLE_SVC_DIS_DEFAULT_READ_PERM or use any of the - possible values defined for that setting. - value: MYNEWT_VAL(BLE_SVC_DIS_DEFAULT_READ_PERM) - BLE_SVC_DIS_HARDWARE_REVISION_DEFAULT: - description: > - Defines a default value for "Hardware revision" if not set with - 'ble_svc_dis_hardware_revision_set'. - value: NULL - BLE_SVC_DIS_FIRMWARE_REVISION_READ_PERM: - description: > - Defines permissions for reading "Firmware Revision" characteristics. - Can be set to BLE_SVC_DIS_DEFAULT_READ_PERM or use any of the - possible values defined for that setting. - value: MYNEWT_VAL(BLE_SVC_DIS_DEFAULT_READ_PERM) - BLE_SVC_DIS_FIRMWARE_REVISION_DEFAULT: - description: > - Defines a default value for "Software revision" if not set with - 'ble_svc_dis_firmware_revision_set'. - value: NULL - BLE_SVC_DIS_SOFTWARE_REVISION_READ_PERM: - description: > - Defines permissions for reading "Software Revision" characteristics. - Can be set to BLE_SVC_DIS_DEFAULT_READ_PERM or use any of the - possible values defined for that setting. - value: MYNEWT_VAL(BLE_SVC_DIS_DEFAULT_READ_PERM) - BLE_SVC_DIS_SOFTWARE_REVISION_DEFAULT: - description: > - Defines a default value for "Software revision" if not set with - 'ble_svc_dis_software_revision_set'. - value: NULL - BLE_SVC_DIS_MANUFACTURER_NAME_READ_PERM: - description: > - Defines permissions for reading "Manufacturer name" characteristics. - Can be set to BLE_SVC_DIS_DEFAULT_READ_PERM or use any of the - possible values defined for that setting. - value: MYNEWT_VAL(BLE_SVC_DIS_DEFAULT_READ_PERM) - BLE_SVC_DIS_MANUFACTURER_NAME_DEFAULT: - description: > - Defines a default value for "Manufacturer name" if not set with - 'ble_svc_dis_manufacturer_name_set'. - value: NULL - BLE_SVC_DIS_SYSTEM_ID_READ_PERM: - description: > - Defines permissions for reading "System ID" characteristics. - Can be set to BLE_SVC_DIS_DEFAULT_READ_PERM or use any of the - possible values defined for that setting. - value: MYNEWT_VAL(BLE_SVC_DIS_DEFAULT_READ_PERM) - BLE_SVC_DIS_SYSTEM_ID_DEFAULT: - description: > - Defines a default value for "System ID" if not set with - 'ble_svc_dis_manufacturer_name_set'. - value: NULL - BLE_SVC_DIS_SYSINIT_STAGE: - description: > - Sysinit stage for the device information BLE service. - value: 303 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gap/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gap/pkg.yml deleted file mode 100644 index a2ef756e3..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gap/pkg.yml +++ /dev/null @@ -1,34 +0,0 @@ -# -# 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. -# - -pkg.name: nimble/host/services/gap -pkg.description: Implements the GAP Service. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - - nimble - - gap - -pkg.deps: - - nimble/host - -pkg.init: - ble_svc_gap_init: 'MYNEWT_VAL(BLE_SVC_GAP_SYSINIT_STAGE)' diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gap/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gap/syscfg.yml deleted file mode 100644 index ad6aa7ef3..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gap/syscfg.yml +++ /dev/null @@ -1,83 +0,0 @@ -# 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. -# - -syscfg.defs: - BLE_SVC_GAP_DEVICE_NAME: - description: > - Default value for "Device Name" characteristics, unless overwritten - by application. - value: '"nimble"' - BLE_SVC_GAP_DEVICE_NAME_WRITE_PERM: - description: > - Defines permissions for writing "Device Name" characteristics. Can - be zero to allow write without extra permissions or combination of: - BLE_GATT_CHR_F_WRITE_ENC - BLE_GATT_CHR_F_WRITE_AUTHEN - BLE_GATT_CHR_F_WRITE_AUTHOR - Set to '-1' to make characteristic read only. - value: -1 - BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH: - description: Maximum length for "Device Name" characteristics - value: 31 - BLE_SVC_GAP_APPEARANCE: - description: 'Device appearance' - value: 0 - BLE_SVC_GAP_APPEARANCE_WRITE_PERM: - description: > - Defines permissions for writing "Appearance" characteristics. Can - be zero to allow write without extra permissions or combination of: - BLE_GATT_CHR_F_WRITE_ENC - BLE_GATT_CHR_F_WRITE_AUTHEN - BLE_GATT_CHR_F_WRITE_AUTHOR - Set to '-1' to make characteristic read only. - value: -1 - - # Setting all values for PPCP to '0' will disable characteristic! - BLE_SVC_GAP_PPCP_MIN_CONN_INTERVAL: - description: > - Value of "minimum connection interval" of PPCP characteristic as - defined by Core specification 5.0, Vol 3, Part C, section 12.3. - value: 0 - BLE_SVC_GAP_PPCP_MAX_CONN_INTERVAL: - description: > - Value of "maximum connection interval" of PPCP characteristic as - defined by Core specification 5.0, Vol 3, Part C, section 12.3. - value: 0 - BLE_SVC_GAP_PPCP_SLAVE_LATENCY: - description: > - Value of "slave latency" of PPCP characteristic as defined by Core - specification 5.0, Vol 3, Part C, section 12.3. - value: 0 - BLE_SVC_GAP_PPCP_SUPERVISION_TMO: - description: > - Value of "connection supervision timeout multiplier" of PPCP - characteristic as defined by Core specification 5.0, Vol 3, Part C, - section 12.3. - value: 0 - - BLE_SVC_GAP_CENTRAL_ADDRESS_RESOLUTION: - description: > - Value of "Central Address Resolution" characteristics, as defined - by Core specification 5.0, Vol 3, Part C, section 12. - Set to '-1' to disable. - value: -1 - - BLE_SVC_GAP_SYSINIT_STAGE: - description: > - Sysinit stage for the GAP BLE service. - value: 301 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gatt/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gatt/pkg.yml deleted file mode 100644 index e3704bc18..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gatt/pkg.yml +++ /dev/null @@ -1,34 +0,0 @@ -# -# 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. -# - -pkg.name: nimble/host/services/gatt -pkg.description: Implements the GATT service. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - - nimble - - gatt - -pkg.deps: - - nimble/host - -pkg.init: - ble_svc_gatt_init: 'MYNEWT_VAL(BLE_SVC_GATT_SYSINIT_STAGE)' diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gatt/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gatt/syscfg.yml deleted file mode 100644 index 6ba1b333e..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gatt/syscfg.yml +++ /dev/null @@ -1,24 +0,0 @@ -# -# 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. -# - -syscfg.defs: - BLE_SVC_GATT_SYSINIT_STAGE: - description: > - Sysinit stage for the GATT BLE service - value: 302 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ias/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ias/pkg.yml deleted file mode 100644 index 3b0ca0745..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ias/pkg.yml +++ /dev/null @@ -1,34 +0,0 @@ - -# 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. -# - -pkg.name: nimble/host/services/ias -pkg.description: Immediate Alert Service Implementation. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - - ias - - nimble - -pkg.deps: - - nimble/host - -pkg.init: - ble_svc_ias_init: 'MYNEWT_VAL(BLE_SVC_IAS_SYSINIT_STAGE)' diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ias/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ias/syscfg.yml deleted file mode 100644 index 2cbed3ab4..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ias/syscfg.yml +++ /dev/null @@ -1,23 +0,0 @@ -# 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. -# - -syscfg.defs: - BLE_SVC_IAS_SYSINIT_STAGE: - description: > - Sysinit stage for the immediate alert BLE service. - value: 303 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ipss/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ipss/pkg.yml deleted file mode 100644 index 55be157d9..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ipss/pkg.yml +++ /dev/null @@ -1,35 +0,0 @@ -# -# 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. -# - -pkg.name: nimble/host/services/ipss -pkg.description: Implements the IPSS service for IPSP suppoort. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - - nimble - - ipsp - - ipss - -pkg.deps: - - nimble/host - -pkg.init: - ble_svc_ipss_init: 'MYNEWT_VAL(BLE_SVC_IPSS_SYSINIT_STAGE)' diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ipss/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ipss/syscfg.yml deleted file mode 100644 index dd89608e3..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ipss/syscfg.yml +++ /dev/null @@ -1,24 +0,0 @@ -# -# 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. -# - -syscfg.defs: - BLE_SVC_IPSS_SYSINIT_STAGE: - description: > - Sysinit stage for the IPSS BLE service - value: 303 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/lls/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/lls/pkg.yml deleted file mode 100644 index 6160f020e..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/lls/pkg.yml +++ /dev/null @@ -1,34 +0,0 @@ -# -# 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. -# - -pkg.name: nimble/host/services/lls -pkg.description: Link Loss Service Implementation. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - - lls - - nimble - -pkg.deps: - - nimble/host - -pkg.init: - ble_svc_lls_init: 'MYNEWT_VAL(BLE_SVC_LLS_SYSINIT_STAGE)' diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/lls/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/lls/syscfg.yml deleted file mode 100644 index 312b08a2f..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/lls/syscfg.yml +++ /dev/null @@ -1,22 +0,0 @@ -# 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. - -syscfg.defs: - BLE_SVC_LLS_SYSINIT_STAGE: - description: > - Sysinit stage for the link loss BLE service. - value: 303 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/tps/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/tps/pkg.yml deleted file mode 100644 index 3d4c5e98e..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/tps/pkg.yml +++ /dev/null @@ -1,34 +0,0 @@ - -# 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. -# - -pkg.name: nimble/host/services/tps -pkg.description: Tx Power Service adopted specification. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - - tps - - nimble - -pkg.deps: - - nimble/host - -pkg.init: - ble_svc_tps_init: 'MYNEWT_VAL(BLE_SVC_TPS_SYSINIT_STAGE)' diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/tps/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/tps/syscfg.yml deleted file mode 100644 index 0391e8b1d..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/tps/syscfg.yml +++ /dev/null @@ -1,23 +0,0 @@ -# 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. - -syscfg.defs: - BLE_SVC_TPS_SYSINIT_STAGE: - description: > - Sysinit stage for the transmit power BLE service. - value: 303 - diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/pkg.yml deleted file mode 100644 index db80d1df8..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/pkg.yml +++ /dev/null @@ -1,38 +0,0 @@ -# -# 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. -# - -pkg.name: nimble/host/store/config -pkg.description: sys/config-based persistence layer for the NimBLE host. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - - nimble - - persistence - -pkg.deps: - - "@apache-mynewt-core/encoding/base64" - - nimble/host - -pkg.deps.BLE_STORE_CONFIG_PERSIST: - - "@apache-mynewt-core/sys/config" - -pkg.init: - ble_store_config_init: 'MYNEWT_VAL(BLE_STORE_SYSINIT_STAGE)' diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/src/ble_store_config_conf.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/src/ble_store_config_conf.c deleted file mode 100644 index c492c59bc..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/src/ble_store_config_conf.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - * 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. - */ - -/* - * Modified work Copyright (c) 2021 Ryan Powell. - */ - -#ifndef ESP_PLATFORM - -#include "nimble/porting/nimble/include/syscfg/syscfg.h" - -#if MYNEWT_VAL(BLE_STORE_CONFIG_PERSIST) - -#include -//#include - -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "../../../include/host/ble_hs.h" -//#include "config/config.h" -#include "base64/base64.h" -#include "../include/store/config/ble_store_config.h" -#include "ble_store_config_priv.h" -#include "ble_bond_nvs.h" - -/* -static int -ble_store_config_conf_set(int argc, char **argv, char *val); -static int -ble_store_config_conf_export(void (*func)(char *name, char *val), - enum conf_export_tgt tgt); - -static struct conf_handler ble_store_config_conf_handler = { - .ch_name = "ble_hs", - .ch_get = NULL, - .ch_set = ble_store_config_conf_set, - .ch_commit = NULL, - .ch_export = ble_store_config_conf_export -}; -*/ -#define BLE_STORE_CONFIG_SEC_ENCODE_SZ \ - BASE64_ENCODE_SIZE(sizeof (struct ble_store_value_sec)) - -#define BLE_STORE_CONFIG_SEC_SET_ENCODE_SZ \ - (MYNEWT_VAL(BLE_STORE_MAX_BONDS) * BLE_STORE_CONFIG_SEC_ENCODE_SZ + 1) - -#define BLE_STORE_CONFIG_CCCD_ENCODE_SZ \ - BASE64_ENCODE_SIZE(sizeof (struct ble_store_value_cccd)) - -#define BLE_STORE_CONFIG_CCCD_SET_ENCODE_SZ \ - (MYNEWT_VAL(BLE_STORE_MAX_CCCDS) * BLE_STORE_CONFIG_CCCD_ENCODE_SZ + 1) - -static void -ble_store_config_serialize_arr(const void *arr, int obj_sz, int num_objs, - char *out_buf, int buf_sz) -{ - int arr_size; - - arr_size = obj_sz * num_objs; - assert(arr_size <= buf_sz); - - base64_encode(arr, arr_size, out_buf, 1); -} - -static int -ble_store_config_deserialize_arr(const char *enc, - void *out_arr, - int obj_sz, - int *out_num_objs) -{ - int len; - - len = base64_decode(enc, out_arr); - if (len < 0) { - return OS_EINVAL; - } - - *out_num_objs = len / obj_sz; - return 0; -} -/* -static int -ble_store_config_conf_set(int argc, char **argv, char *val) -{ - int rc; - - if (argc == 1) { - if (strcmp(argv[0], "our_sec") == 0) { - rc = ble_store_config_deserialize_arr( - val, - ble_store_config_our_secs, - sizeof *ble_store_config_our_secs, - &ble_store_config_num_our_secs); - printf("\nloading: %s %s rc=%d\n", *argv, val, rc); - return rc; - } else if (strcmp(argv[0], "peer_sec") == 0) { - rc = ble_store_config_deserialize_arr( - val, - ble_store_config_peer_secs, - sizeof *ble_store_config_peer_secs, - &ble_store_config_num_peer_secs); - printf("\nloading: %s %s rc=%d\n", *argv, val, rc); - return rc; - } else if (strcmp(argv[0], "cccd") == 0) { - rc = ble_store_config_deserialize_arr( - val, - ble_store_config_cccds, - sizeof *ble_store_config_cccds, - &ble_store_config_num_cccds); - printf("\nloading: %s %s rc=%d\n", *argv, val, rc); - return rc; - } - } - return OS_ENOENT; -} - -static int -ble_store_config_conf_export(void (*func)(char *name, char *val), - enum conf_export_tgt tgt) -{ - union { - char sec[BLE_STORE_CONFIG_SEC_SET_ENCODE_SZ]; - char cccd[BLE_STORE_CONFIG_CCCD_SET_ENCODE_SZ]; - } buf; - - ble_store_config_serialize_arr(ble_store_config_our_secs, - sizeof *ble_store_config_our_secs, - ble_store_config_num_our_secs, - buf.sec, - sizeof buf.sec); - func("ble_hs/our_sec", buf.sec); - - ble_store_config_serialize_arr(ble_store_config_peer_secs, - sizeof *ble_store_config_peer_secs, - ble_store_config_num_peer_secs, - buf.sec, - sizeof buf.sec); - func("ble_hs/peer_sec", buf.sec); - - ble_store_config_serialize_arr(ble_store_config_cccds, - sizeof *ble_store_config_cccds, - ble_store_config_num_cccds, - buf.cccd, - sizeof buf.cccd); - func("ble_hs/cccd", buf.cccd); - - return 0; -} -*/ -static int -ble_store_config_persist_sec_set(uint32_t setting_name, - const struct ble_store_value_sec *secs, - int num_secs) -{ - char buf[BLE_STORE_CONFIG_SEC_SET_ENCODE_SZ]; - int rc; - - ble_store_config_serialize_arr(secs, sizeof *secs, num_secs, - buf, sizeof buf); - - rc = ble_bond_nvs_save_entry(setting_name, buf); - if (rc != 0) { - return BLE_HS_ESTORE_FAIL; - } - - return 0; -} - -int -ble_store_config_persist_our_secs(void) -{ - int rc; - - rc = ble_store_config_persist_sec_set(our_sec, - ble_store_config_our_secs, - ble_store_config_num_our_secs); - if (rc != 0) { - return rc; - } - - return 0; -} - -int -ble_store_config_persist_peer_secs(void) -{ - int rc; - - rc = ble_store_config_persist_sec_set(peer_sec, - ble_store_config_peer_secs, - ble_store_config_num_peer_secs); - if (rc != 0) { - return rc; - } - - return 0; -} - -int -ble_store_config_persist_cccds(void) -{ - char buf[BLE_STORE_CONFIG_CCCD_SET_ENCODE_SZ]; - int rc; - - ble_store_config_serialize_arr(ble_store_config_cccds, - sizeof *ble_store_config_cccds, - ble_store_config_num_cccds, - buf, - sizeof buf); - - rc = ble_bond_nvs_save_entry(cccd, buf); - if (rc != 0) { - return BLE_HS_ESTORE_FAIL; - } - - return 0; -} - -void -ble_store_config_conf_init(void) -{ - uint32_t val_addr = 0; - int rc = 0; - - rc = ble_bond_nvs_get_entry(our_sec, &val_addr); - if (rc == 0) { - rc = ble_store_config_deserialize_arr( - (char*)val_addr, - ble_store_config_our_secs, - sizeof *ble_store_config_our_secs, - &ble_store_config_num_our_secs); - if (rc != 0) { - BLE_HS_LOG(ERROR, "our_sec restore error rc=%d\n", rc); - return; - } - - rc = ble_bond_nvs_get_entry(peer_sec, &val_addr); - if (rc == 0) { - rc = ble_store_config_deserialize_arr( - (char*)val_addr, - ble_store_config_peer_secs, - sizeof *ble_store_config_peer_secs, - &ble_store_config_num_peer_secs); - if (rc != 0) { - BLE_HS_LOG(ERROR, "peer_sec restore error rc=%d\n", rc); - return; - } - - } else { - /* If we have a security entry for our security but not a peer - * we should assume something wrong with the store so delete it. - */ - BLE_HS_LOG(ERROR, "peer info not found\n"); - ble_store_clear(); - return; - } - - rc = ble_bond_nvs_get_entry(cccd, &val_addr); - if (rc == 0) { - rc = ble_store_config_deserialize_arr( - (char*)val_addr, - ble_store_config_cccds, - sizeof *ble_store_config_cccds, - &ble_store_config_num_cccds); - if (rc != 0) { - BLE_HS_LOG(ERROR, "cccd restore error rc=%d\n", rc); - return; - } - } - } - - /* int rc; - - rc = conf_register(&ble_store_config_conf_handler); - SYSINIT_PANIC_ASSERT_MSG(rc == 0, - "Failed to register ble_store_config conf"); - */ -} - -#endif /* MYNEWT_VAL(BLE_STORE_CONFIG_PERSIST) */ -#endif /* ESP_PLATFORM */ \ No newline at end of file diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/syscfg.yml deleted file mode 100644 index ff0689c6d..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/syscfg.yml +++ /dev/null @@ -1,27 +0,0 @@ -# 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. -# - -syscfg.defs: - BLE_STORE_CONFIG_PERSIST: - description: > - Whether to save data to sys/config, or just keep it in RAM. - value: 1 - BLE_STORE_SYSINIT_STAGE: - description: > - Sysinit stage for BLE host store. - value: 500 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/syscfg.yml deleted file mode 100644 index e72e8d529..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/syscfg.yml +++ /dev/null @@ -1,471 +0,0 @@ -# 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. -# - -syscfg.defs: - BLE_HOST: - description: 'Indicates that a BLE host is present.' - value: 1 - - BLE_HS_AUTO_START: - description: > - Causes the BLE host to automatically start during system - initialization. - value: 1 - - # Debug settings. - BLE_HS_DEBUG: - description: 'Enables extra runtime assertions.' - value: 0 - BLE_HS_PHONY_HCI_ACKS: - description: > - Rather than wait for HCI acknowledgements from a controller, the - host simulates incoming acks. Only recommended for test code - running in the simulator. - value: 0 - BLE_HS_REQUIRE_OS: - description: > - Specifies whether the host can depend on the kernel being present. - This should only be disabled for unit tests running in the - simulator. - value: 1 - - # Monitor interface settings - BLE_MONITOR_UART: - description: Enables monitor interface over UART - value: 0 - BLE_MONITOR_UART_DEV: - description: Monitor interface UART device - value: '"uart0"' - BLE_MONITOR_UART_BAUDRATE: - description: Baudrate for monitor interface UART - value: 1000000 - BLE_MONITOR_UART_BUFFER_SIZE: - description: > - Monitor interface ringbuffer size for UART. - This value should be a power of 2. - value: 64 - BLE_MONITOR_RTT: - description: Enables monitor interface over RTT - value: 0 - BLE_MONITOR_RTT_BUFFER_NAME: - description: Monitor interface upstream buffer name - value: '"btmonitor"' - BLE_MONITOR_RTT_BUFFER_SIZE: - description: Monitor interface upstream buffer size - value: 256 - BLE_MONITOR_RTT_BUFFERED: - description: > - Enables buffering when using monitor interface over RTT. The data - are written to RTT once complete packet is created in intermediate - buffer. This allows to skip complete packet if there is not enough - space in RTT buffer (e.g. there is no reader connected). If disabled, - monitor will simply block waiting for RTT to free space in buffer. - value: 1 - BLE_MONITOR_CONSOLE_BUFFER_SIZE: - description: > - Size of internal buffer for console output. Any line exceeding this - length value will be split. - value: 128 - - # L2CAP settings. - BLE_L2CAP_MAX_CHANS: - description: > - The number of L2CAP channels to allocate. The default value allows - for the signal, ATT, and SM channels for each connection. - value: '3*MYNEWT_VAL_BLE_MAX_CONNECTIONS' - BLE_L2CAP_SIG_MAX_PROCS: - description: > - The maximum number of concurrent L2CAP signal procedures. - value: 1 - BLE_L2CAP_JOIN_RX_FRAGS: - description: > - Whether to collapse incoming L2CAP fragments into a minimal set of - mbufs. - 1: Slower, more memory efficient. - 0: Faster, less memory efficient. - value: 1 - BLE_L2CAP_RX_FRAG_TIMEOUT: - description: > - Expiry time for incoming data packets (ms). If this much time - passes since the previous fragment was received, the connection is - terminated. A value of 0 means no timeout. - value: 30000 - BLE_L2CAP_COC_MAX_NUM: - description: > - Defines maximum number of LE Connection Oriented Channels channels. - When set to (0), LE COC is not compiled in. - value: 0 - BLE_L2CAP_COC_MPS: - description: > - Defines the MPS of L2CAP COC module. This is actually NimBLE's internal - L2CAP MTU. The default MPS size is chosen in a way, that the MPS plus - the required HCI and L2CAP headers fit into the smallest available - MSYS blocks. - value: 'MYNEWT_VAL_MSYS_1_BLOCK_SIZE-8' - - BLE_L2CAP_ENHANCED_COC: - description: > - Enables LE Enhanced CoC mode. - value: 0 - restrictions: - - '(BLE_L2CAP_COC_MAX_NUM > 0) && (BLE_VERSION >= 52) if 1' - - # Security manager settings. - BLE_SM_LEGACY: - description: 'Security manager legacy pairing.' - value: 1 - BLE_SM_SC: - description: 'Security manager secure connections (4.2).' - value: 0 - - BLE_SM_MAX_PROCS: - description: > - The maximum number of concurrent security manager procedures. - value: 1 - BLE_SM_IO_CAP: - description: > - The IO capabilities to report during pairing. Valid values are: - BLE_HS_IO_DISPLAY_ONLY - BLE_HS_IO_DISPLAY_YESNO - BLE_HS_IO_KEYBOARD_ONLY - BLE_HS_IO_NO_INPUT_OUTPUT - BLE_HS_IO_KEYBOARD_DISPLAY - value: 'BLE_HS_IO_NO_INPUT_OUTPUT' - BLE_SM_OOB_DATA_FLAG: - description: > - Whether the out-of-band pairing algorithm is advertised. (0/1) - value: 0 - BLE_SM_BONDING: - description: > - Enables bonding (persistence and restoration of secure links). (0/1) - value: 0 - BLE_SM_MITM: - description: > - Whether man-in-the-middle protection is advertised during - pairing. (0/1) - value: 0 - BLE_SM_KEYPRESS: - description: > - Whether keypress support is advertised during pairing. (0/1) - value: 0 - BLE_SM_OUR_KEY_DIST: - description: > - A bitmap indicating which keys to distribute during pairing. The - bits are defined as follows: - 0x01: BLE_SM_PAIR_KEY_DIST_ENC - 0x02: BLE_SM_PAIR_KEY_DIST_ID - 0x04: BLE_SM_PAIR_KEY_DIST_SIGN - 0x08: BLE_SM_PAIR_KEY_DIST_LINK - value: 0 - BLE_SM_THEIR_KEY_DIST: - description: > - A bitmap indicating which keys to accept during pairing. The - bits are defined as follows: - 0x01: BLE_SM_PAIR_KEY_DIST_ENC - 0x02: BLE_SM_PAIR_KEY_DIST_ID - 0x04: BLE_SM_PAIR_KEY_DIST_SIGN - 0x08: BLE_SM_PAIR_KEY_DIST_LINK - value: 0 - BLE_SM_SC_DEBUG_KEYS: - description: > - Enable SM debug mode. In this mode SM uses predefined DH key pair as - described in Core Specification 5.0, Vol. 3, Part H, 2.3.5.6.1. This - allows to decrypt air traffic easily and thus should be only used - for debugging. - value: 0 - - # GAP options. - BLE_GAP_MAX_PENDING_CONN_PARAM_UPDATE: - description: > - Controls the number of connection parameter updates that can be pending - simultaneously. Devices with many concurrent connections may need - to increase this value. - value: 1 - - # Supported GATT procedures. By default: - # o Notify and indicate are enabled; - # o All other procedures are enabled for centrals. - BLE_GATT_DISC_ALL_SVCS: - description: > - Enables the Discover All Primary Services GATT procedure. (0/1) - value: MYNEWT_VAL_BLE_ROLE_CENTRAL - BLE_GATT_DISC_SVC_UUID: - description: > - Enables the Discover Primary Services by Service UUID GATT - procedure. (0/1) - value: MYNEWT_VAL_BLE_ROLE_CENTRAL - BLE_GATT_FIND_INC_SVCS: - description: > - Enables the Find Included Services GATT procedure. (0/1) - value: MYNEWT_VAL_BLE_ROLE_CENTRAL - BLE_GATT_DISC_ALL_CHRS: - description: > - Enables the Discover All Characteristics of a Service GATT - procedure. (0/1) - value: MYNEWT_VAL_BLE_ROLE_CENTRAL - BLE_GATT_DISC_CHR_UUID: - description: > - Enables the Discover Characteristics by UUID GATT procedure. (0/1) - value: MYNEWT_VAL_BLE_ROLE_CENTRAL - BLE_GATT_DISC_ALL_DSCS: - description: > - Enables the Discover All Primary Services GATT procedure. (0/1) - value: MYNEWT_VAL_BLE_ROLE_CENTRAL - BLE_GATT_READ: - description: > - Enables the Read Characteristic Value GATT procedure. (0/1) - (0/1) - value: MYNEWT_VAL_BLE_ROLE_CENTRAL - BLE_GATT_READ_UUID: - description: > - Enables the Read Using Characteristic UUID GATT procedure. (0/1) - value: MYNEWT_VAL_BLE_ROLE_CENTRAL - BLE_GATT_READ_LONG: - description: > - Enables the Read Long Characteristic Values GATT procedure. (0/1) - value: MYNEWT_VAL_BLE_ROLE_CENTRAL - BLE_GATT_READ_MULT: - description: > - Enables the Read Multiple Characteristic Values GATT procedure. - (0/1) - value: MYNEWT_VAL_BLE_ROLE_CENTRAL - BLE_GATT_WRITE_NO_RSP: - description: > - Enables the Write Without Response GATT procedure. (0/1) - value: MYNEWT_VAL_BLE_ROLE_CENTRAL - BLE_GATT_SIGNED_WRITE: - description: > - Enables the Signed Write Without Response GATT procedure. (0/1) - value: MYNEWT_VAL_BLE_ROLE_CENTRAL - BLE_GATT_WRITE: - description: > - Enables the Write Characteristic Value GATT procedure. (0/1) - value: MYNEWT_VAL_BLE_ROLE_CENTRAL - BLE_GATT_WRITE_LONG: - description: > - Enables the Write Long Characteristic Values GATT procedure. (0/1) - value: MYNEWT_VAL_BLE_ROLE_CENTRAL - BLE_GATT_WRITE_RELIABLE: - description: > - Enables the Reliable Writes GATT procedure. (0/1) - value: MYNEWT_VAL_BLE_ROLE_CENTRAL - BLE_GATT_NOTIFY: - description: > - Enables sending and receiving of GATT notifications. (0/1) - value: 1 - BLE_GATT_INDICATE: - description: > - Enables sending and receiving of GATT indications. (0/1) - value: 1 - - # GATT options. - BLE_GATT_READ_MAX_ATTRS: - description: > - The maximum number of attributes that can be read with a single - GATT Read Multiple Characteristic Values procedure. (0/1) - value: 8 - BLE_GATT_WRITE_MAX_ATTRS: - description: > - The maximum number of attributes that can be written with a single - GATT Reliable Write procedure. (0/1) - value: 4 - BLE_GATT_MAX_PROCS: - description: > - The maximum number of concurrent client GATT procedures. (0/1) - value: 4 - BLE_GATT_RESUME_RATE: - description: > - The rate to periodically resume GATT procedures that have stalled - due to memory exhaustion. (0/1) Units are milliseconds. (0/1) - value: 1000 - - # Supported server ATT commands. (0/1) - BLE_ATT_SVR_FIND_INFO: - description: > - Enables processing of incoming Find Information Request ATT - commands. (0/1) - value: 1 - BLE_ATT_SVR_FIND_TYPE: - description: > - Enables processing of incoming Find By Type Value Request ATT - commands. (0/1) - value: 1 - BLE_ATT_SVR_READ_TYPE: - description: > - Enables processing of incoming Read By Type Request ATT commands. - (0/1) - value: 1 - BLE_ATT_SVR_READ: - description: > - Enables processing of incoming Read Request ATT commands. (0/1) - value: 1 - BLE_ATT_SVR_READ_BLOB: - description: > - Enables processing of incoming Read Blob Request ATT commands. - (0/1) - value: 1 - BLE_ATT_SVR_READ_MULT: - description: > - Enables processing of incoming Read Multiple Request ATT commands. - (0/1) - value: 1 - BLE_ATT_SVR_READ_GROUP_TYPE: - description: > - Enables processing of incoming Read by Group Type Request ATT - commands. (0/1) - value: 1 - BLE_ATT_SVR_WRITE: - description: > - Enables processing of incoming Write Request ATT commands. (0/1) - value: 1 - BLE_ATT_SVR_WRITE_NO_RSP: - description: > - Enables processing of incoming Write Command ATT commands. (0/1) - value: 1 - BLE_ATT_SVR_SIGNED_WRITE: - description: > - Enables processing of incoming Signed Write Command ATT commands. - (0/1) - value: 1 - BLE_ATT_SVR_QUEUED_WRITE: - description: > - Enables processing of incoming Prepare Write Request and Execute - Write Request ATT commands. (0/1) - value: 1 - BLE_ATT_SVR_NOTIFY: - description: > - Enables processing of incoming Handle Value Notification ATT - commands. (0/1) - value: 1 - BLE_ATT_SVR_INDICATE: - description: > - Enables processing of incoming Handle Value Indication ATT - commands. (0/1) - value: 1 - - # ATT options. - BLE_ATT_PREFERRED_MTU: - description: The preferred MTU to indicate in MTU exchange commands. - value: 256 - - BLE_ATT_SVR_MAX_PREP_ENTRIES: - description: > - A GATT server uses these when a peer performs a "write long - characteristic values" or "write long characteristic descriptors" - procedure. One of these resources is consumed each time a peer - sends a partial write. - value: 64 - - BLE_ATT_SVR_QUEUED_WRITE_TMO: - description: > - Expiry time for incoming ATT queued writes (ms). If this much - time passes since the previous prepared write was received, the - connection is terminated. A value of 0 means no timeout. - value: 30000 - - # Privacy options. - BLE_RPA_TIMEOUT: - description: > - The rate that new random addresses should be generated (seconds). - value: 300 - - # Store settings. - BLE_STORE_MAX_BONDS: - description: > - Maximum number of bonds that can be persisted. Note: increasing - this value may also require increasing the capacity of the - underlying storage mechanism. - value: 3 - BLE_STORE_MAX_CCCDS: - description: > - Maximum number of client characteristic configuration descriptors - that can be persisted. Note: increasing this value may also - require increasing the capacity of the underlying storage - mechanism. - - value: 8 - - BLE_MESH: - description: > - This option enables Bluetooth Mesh support. The specific - features that are available may depend on other features - that have been enabled in the stack, such as GATT support. - value: 0 - - # Flow control settings. - BLE_HS_FLOW_CTRL: - description: > - Whether to enable host-side flow control. This should only be - enabled in host-only setups (i.e., not combined-host-controller). - value: 0 - - BLE_HS_FLOW_CTRL_ITVL: - description: > - The interval, in milliseconds, that the host should provide - number-of-completed-packets updates to the controller. - value: 1000 - - BLE_HS_FLOW_CTRL_THRESH: - description: > - If the number of data buffers available to the controller falls to - this number, immediately send a number-of-completed-packets event. - The free buffer count is calculated as follows: - (total-acl-bufs - bufs-freed-since-last-num-completed-event). - value: 2 - - BLE_HS_FLOW_CTRL_TX_ON_DISCONNECT: - description: > - If enabled, the host will immediately transmit a - host-number-of-completed-packets command whenever a connection - terminates. This behavior is not required by the standard, but is - a necessary workaround when interfacing with some controllers. - value: 0 - - BLE_HS_STOP_ON_SHUTDOWN: - description: > - Stops the Bluetooth host when the system shuts down. Stopping - entails aborting all GAP procedures and terminating open - connections. - value: 1 - - BLE_HS_STOP_ON_SHUTDOWN_TIMEOUT: - description: > - Timeout used in NimBLE's host stop procedure in ms. - value: 2000 - - BLE_HS_SYSINIT_STAGE: - description: > - Sysinit stage for the NimBLE host. - value: 200 - - ### Log settings. - - BLE_HS_LOG_MOD: - description: 'Numeric module ID to use for BLE host log messages.' - value: 4 - BLE_HS_LOG_LVL: - description: 'Minimum level for the BLE host log.' - value: 1 - -syscfg.logs: - BLE_HS_LOG: - module: MYNEWT_VAL(BLE_HS_LOG_MOD) - level: MYNEWT_VAL(BLE_HS_LOG_LVL) - -syscfg.vals.BLE_MESH: - BLE_SM_SC: 1 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/tools/log2smtest.rb b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/tools/log2smtest.rb deleted file mode 100644 index e253e69f0..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/tools/log2smtest.rb +++ /dev/null @@ -1,1029 +0,0 @@ -#!/usr/bin/env ruby - -# -# 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. -# - -### This script converts a bletiny log into a security manager unit test. The -### input log must contain the connection establishment and complete pairing -### procedure. -### -### Arguments: None -### Stdin: bletiny log file - -$PAIR_ALG_STRINGS = { - 0 => [ 'BLE_SM_PAIR_ALG_JW', 'just works', 'jw' ], - 1 => [ 'BLE_SM_PAIR_ALG_PASSKEY', 'passkey entry', 'pk' ], - 2 => [ 'BLE_SM_PAIR_ALG_OOB', 'out of band', 'ob' ], - 3 => [ 'BLE_SM_PAIR_ALG_NUMCMP', 'numeric comparison', 'nc' ] -} - -$ADDR_TYPE_STRINGS = { - 0 => 'BLE_ADDR_TYPE_PUBLIC', - 1 => 'BLE_ADDR_TYPE_RANDOM', - 2 => 'BLE_ADDR_TYPE_RPA_PUB_DEFAULT', - 3 => 'BLE_ADDR_TYPE_RPA_RND_DEFAULT', -} - -$ACTION_STRINGS = { - 0 => 'BLE_SM_IOACT_NONE', - 1 => 'BLE_SM_IOACT_OOB', - 2 => 'BLE_SM_IOACT_INPUT', - 3 => 'BLE_SM_IOACT_DISP', - 4 => 'BLE_SM_IOACT_NUMCMP', -} - -$prev_idx = 0 -$ctxt = {} - -def test_case_name - type_str = $ctxt[:sc] ? "sc" : "lgcy" - init_str = $ctxt[:we_are_init] ? "us" : "peer" - alg_str = $PAIR_ALG_STRINGS[$ctxt[:pair_alg]][2] - iio_cap_str = "iio#{$ctxt[:pair_req][:io_cap]}" - rio_cap_str = "rio#{$ctxt[:pair_rsp][:io_cap]}" - bonding_str = "b#{$ctxt[:bonding] ? 1 : 0}" - iat_str = "iat#{$ctxt[:addrs][:init_type]}" - rat_str = "rat#{$ctxt[:addrs][:resp_type]}" - ikey_str = "ik#{$ctxt[:pair_rsp][:init_key_dist]}" - rkey_str = "rk#{$ctxt[:pair_rsp][:resp_key_dist]}" - - "ble_sm_" + - "#{type_str}_#{init_str}_#{alg_str}_#{iio_cap_str}_#{rio_cap_str}_" + - "#{bonding_str}_#{iat_str}_#{rat_str}_#{ikey_str}_#{rkey_str}" -end - -def test_case_comment -<<-eos -/** - * #{$ctxt[:sc] ? 'Secure connections' : 'Legacy'} pairing - * Master: #{$ctxt[:we_are_init] ? "us" : "peer"} - * Pair algorithm: #{$PAIR_ALG_STRINGS[$ctxt[:pair_alg]][1]} - * Initiator IO capabilities: #{$ctxt[:pair_req][:io_cap]} - * Responder IO capabilities: #{$ctxt[:pair_rsp][:io_cap]} - * Bonding: #{$ctxt[:bonding]} - * Initiator address type: #{$ADDR_TYPE_STRINGS[$ctxt[:addrs][:init_type]]} - * Responder address type: #{$ADDR_TYPE_STRINGS[$ctxt[:addrs][:resp_type]]} - * Initiator key distribution: #{$ctxt[:pair_rsp][:init_key_dist]} - * Responder key distribution: #{$ctxt[:pair_rsp][:resp_key_dist]} - */ -eos -end - -def to_hex_s(byte) - if byte.is_a?(String) - byte = s_to_i(byte) - end - - "0x#{byte.to_s(16).rjust(2, '0')}" -end - -# to_i(0) but interpret leading zeros as decimal. -def s_to_i(s) - if s[0..1] == "0x" - return s.to_i(16) - else - return s.to_i(10) - end -end - -def invalid_byte_line(msg, line) - str = "invalid byte line" - if msg != nil - str += ": #{msg}" - end - - str += "; line=#{line}" - - raise str -end - -def token_string_to_bytes(line, delim = ' ') - tokens = line.split(delim) - bytes = [] - tokens.each do |token| - begin - byte = token.to_i(16) - bytes << byte - rescue - invalid_byte_line("token=#{token}", line) - end - end - - return bytes -end - -def txrx_prefix(is_tx) - if is_tx - return "tx" - else - return "rx" - end -end - -def reqrsp_s(is_req) - reqrsp = nil - if is_req - return "req" - else - return "rsp" - end -end - -def bytes_to_arr_body(bytes, indent) - lines = [] - - idx = 0 - while idx < bytes.size - slice_len = nil - if bytes.size - idx >= 8 - slice_len = 8 - else - slice_len = bytes.size - idx - end - - slice = bytes[idx...(idx + slice_len)] - line = ' ' * indent + - slice.map{|b| to_hex_s(b)}.join(", ") + "," - lines << line - - idx += slice_len - end - - return lines.join("\n") << "\n" -end - -def bytes_to_arr(bytes, name, indent) - str = "#{' ' * indent}.#{name} = {\n" - str << bytes_to_arr_body(bytes, indent + 4) - str << "#{' ' * indent}}," - - return str -end - -def addr_string_to_bytes(addr_string) - token_string_to_bytes(addr_string, ':').reverse -end - -def parse_pair_cmd(line, is_req) - suffix = reqrsp_s(is_req) - re = %r{ - pair\s#{suffix}; - \s - conn=\d+ - \s - io_cap=(?\d+) - \s - oob_data_flag=(?\d+) - \s - authreq=(?0x[0-9a-f]+) - \s - mac_enc_key_size=(?\d+) - \s - init_key_dist=(?\d+) - \s - resp_key_dist=(?\d+) - }x - - m = re.match(line) - if m == nil - return nil - end - - cmd = {} - cmd[:io_cap] = s_to_i(m[:io_cap]) - cmd[:oob_data_flag] = s_to_i(m[:oob_data_flag]) - cmd[:authreq] = s_to_i(m[:authreq]) - cmd[:max_enc_key_size] = s_to_i(m[:max_enc_key_size]) - cmd[:init_key_dist] = s_to_i(m[:init_key_dist]) - cmd[:resp_key_dist] = s_to_i(m[:resp_key_dist]) - - return cmd -end - -def parse_privkey(line) - if !(line =~ /our privkey=(.+)/) - return nil - end - return token_string_to_bytes($1) -end - -def parse_public_key(line, is_tx) - prefix = txrx_prefix(is_tx) - if !(line =~ /#{prefix}ed sm command: public key; conn=\d+ x=(.+) y=(.+)/) - return nil - end - - pubkey = {} - pubkey[:x] = token_string_to_bytes($1) - pubkey[:y] = token_string_to_bytes($2) - - if pubkey[:x].size != 32 - raise "invalid public key: x length incorrect; line=#{line}" - end - - if pubkey[:y].size != 32 - raise "invalid public key: y length incorrect; line=#{line}" - end - - return pubkey -end - -def parse_confirm(line, is_tx) - prefix = txrx_prefix(is_tx) - if !(line =~ /#{prefix}ed sm command: confirm; conn=\d+ value=(.+)/) - return nil - end - - bytes = token_string_to_bytes($1) - if bytes.size != 16 - raise "invalid confirm line (length mismatch): #{line}" - end - - return { :value => bytes } -end - -def parse_random(line, is_tx) - prefix = txrx_prefix(is_tx) - if !(line =~ /#{prefix}ed sm command: random; conn=\d+ value=(.+)/) - return nil - end - - bytes = token_string_to_bytes($1) - if bytes.size != 16 - raise "invalid random line (length mismatch): #{line}" - end - - return { :value => bytes } -end - -def parse_stk(line) - if !(line =~ /^ out=(.+)/) - return nil - end - - bytes = token_string_to_bytes($1) - if bytes.size != 16 - raise "invalid stk line (length mismatch): #{line}" - end - - return bytes -end - -def parse_dhkey_check(line, is_tx) - prefix = txrx_prefix(is_tx) - if !(line =~ /#{prefix}ed sm command: dhkey check; conn=\d+ value=(.+)/) - return nil - end - - bytes = token_string_to_bytes($1) - if bytes.size != 16 - raise "invalid dhkey_check line (length mismatch): #{line}" - end - - return { :value => bytes } -end - -def parse_ltk(line) - if !(line =~ /persisting.+ltk=([^ ]+)/) - return nil - end - - bytes = $1.split(":") - if bytes.size != 16 - raise "invalid ltk line (length mismatch): exp=16 got=#{bytes.size} " + - "line=#{line}" - end - - return bytes -end - -def parse_enc_info(line, is_tx) - prefix = txrx_prefix(is_tx) - if !(line =~ /#{prefix}ed sm command: enc info; conn=\d+ ltk=(.+)/) - return nil - end - - bytes = token_string_to_bytes($1) - if bytes.size != 16 - raise "invalid enc info line (length mismatch): #{line}" - end - - return { :ltk => bytes } -end - -def parse_master_id(line, is_tx) - prefix = txrx_prefix(is_tx) - if !(line =~ /#{prefix}ed sm command: master id; conn=\d+ ediv=(.+) rand=(.+)/) - return nil - end - - return { - :ediv => s_to_i($1), - :rand => s_to_i($2), - } -end - -def parse_id_info(line, is_tx) - prefix = txrx_prefix(is_tx) - if !(line =~ /#{prefix}ed sm command: id info; conn=\d+ irk=(.+)/) - return nil - end - - bytes = token_string_to_bytes($1) - if bytes.size != 16 - raise "invalid id info line (length mismatch): #{line}" - end - - return { :irk => bytes } -end - -def parse_id_addr_info(line, is_tx) - prefix = txrx_prefix(is_tx) - if !(line =~ /#{prefix}ed sm command: id addr info; conn=\d+ addr_type=(\d+) addr=(.+)/) - return nil - end - - bytes = addr_string_to_bytes($2) - if bytes.size != 6 - raise "invalid id addr info line (length mismatch): #{line}" - end - - return { - :addr_type => s_to_i($1), - :addr => bytes, - } -end - -def parse_sign_info(line, is_tx) - prefix = txrx_prefix(is_tx) - if !(line =~ /#{prefix}ed sm command: sign info; conn=\d+ sig_key=(.+)/) - return nil - end - - bytes = token_string_to_bytes($1) - if bytes.size != 16 - raise "invalid sign info line (length mismatch): #{line}" - end - - return { - :sig_key => bytes, - } -end - -def parse_passkey_info(line) - passkey_info = {} - - case line - when /passkey action event; action=4 numcmp=(\d+)/ - passkey_info[:action] = 4 - passkey_info[:numcmp] = $1.to_i(10) - when /^b passkey conn=\d+ action=1 oob=(\S+)/ - passkey_info[:action] = 1 - passkey_info[:oob] = token_string_to_bytes($1, ':') - when /^b passkey conn=\d+ action=2 key=(\d+)/ - passkey_info[:action] = 2 - passkey_info[:key] = $1.to_i(10) - when /b passkey conn=\d+ action=3 key=(\d+)/ - passkey_info[:action] = 3 - passkey_info[:key] = $1.to_i(10) - else - return nil - end - - return passkey_info -end - -def parse_addrs(line) - if !(line =~ /our_ota_addr_type=(\d+) our_ota_addr=(\S+) our_id_addr_type=(\d+) our_id_addr=(\S+) peer_ota_addr_type=(\d+) peer_ota_addr=(\S+) peer_id_addr_type=(\d+) peer_id_addr=(\S+)/) - return nil - end - - our_ota_addr_bytes = addr_string_to_bytes($2) - our_id_addr_bytes = addr_string_to_bytes($4) - peer_ota_addr_bytes = addr_string_to_bytes($6) - peer_id_addr_bytes = addr_string_to_bytes($8) - - if $ctxt[:we_are_init] - init_id_bytes = our_id_addr_bytes - init_ota_bytes = our_ota_addr_bytes - resp_id_bytes = peer_id_addr_bytes - resp_ota_bytes = peer_ota_addr_bytes - init_addr_type = s_to_i($1) - resp_addr_type = s_to_i($5) - else - init_id_bytes = peer_id_addr_bytes - init_ota_bytes = peer_ota_addr_bytes - resp_id_bytes = our_id_addr_bytes - resp_ota_bytes = our_ota_addr_bytes - init_addr_type = s_to_i($5) - resp_addr_type = s_to_i($1) - end - - if init_id_bytes == init_ota_bytes - init_ota_bytes = [0] * 6 - end - if resp_id_bytes == resp_ota_bytes - resp_ota_bytes = [0] * 6 - end - - return { - :init_type => init_addr_type, - :resp_type => resp_addr_type, - :init_id_addr => init_id_bytes, - :resp_id_addr => resp_id_bytes, - :init_rpa => init_ota_bytes, - :resp_rpa => resp_ota_bytes, - } -end - -def detect_initiator(lines) - lines.each do |line| - if line =~ /txed sm command: pair req/ - $ctxt[:we_are_init] = true - elsif line =~ /txed sm command: pair rsp/ - $ctxt[:we_are_init] = false - end - end - - if $ctxt[:we_are_init] == nil - raise "could not detect which peer is the initiator" - end -end - -def pair_cmd_to_s(cmd, is_req) - suffix = reqrsp_s(is_req) - return <<-eos - .pair_#{suffix} = { - .io_cap = #{to_hex_s(cmd[:io_cap])}, - .oob_data_flag = #{to_hex_s(cmd[:oob_data_flag])}, - .authreq = #{to_hex_s(cmd[:authreq])}, - .max_enc_key_size = #{to_hex_s(cmd[:max_enc_key_size])}, - .init_key_dist = #{to_hex_s(cmd[:init_key_dist])}, - .resp_key_dist = #{to_hex_s(cmd[:resp_key_dist])}, - }, - eos -end - -def privkey_to_s(privkey) - return bytes_to_arr(privkey, "our_priv_key", 8) -end - -def public_key_to_s(public_key, is_req) - suffix = reqrsp_s(is_req) - return <<-eos - .public_key_#{suffix} = { -#{bytes_to_arr(public_key[:x], "x", 12)} -#{bytes_to_arr(public_key[:y], "y", 12)} - }, - eos -end - -def confirm_to_s(confirm, is_req, idx) - return <<-eos - .confirm_#{reqrsp_s(is_req)}[#{idx}] = { -#{bytes_to_arr(confirm[:value], "value", 12)} - }, - eos -end - -def random_to_s(random, is_req, idx) - return <<-eos - .random_#{reqrsp_s(is_req)}[#{idx}] = { -#{bytes_to_arr(random[:value], "value", 12)} - }, - eos -end - -def ltk_to_s(ltk) - return bytes_to_arr(ltk, "ltk", 8) -end - -def stk_to_s(stk) - return bytes_to_arr(stk, "stk", 8) -end - -def enc_info_to_s(id_info, is_req) - return <<-eos - .enc_info_#{reqrsp_s(is_req)} = { -#{bytes_to_arr(id_info[:ltk], "ltk", 12)} - }, - eos -end - -def master_id_to_s(master_id, is_req) - return <<-eos - .master_id_#{reqrsp_s(is_req)} = { - .ediv = 0x#{master_id[:ediv].to_s(16)}, - .rand_val = 0x#{master_id[:rand].to_s(16)}, - }, - eos -end - -def id_info_to_s(id_info, is_req) - return <<-eos - .id_info_#{reqrsp_s(is_req)} = { -#{bytes_to_arr(id_info[:irk], "irk", 12)} - }, - eos -end - -def id_addr_info_to_s(id_addr_info, is_req) - return <<-eos - .id_addr_info_#{reqrsp_s(is_req)} = { - .addr_type = #{id_addr_info[:addr_type]}, -#{bytes_to_arr(id_addr_info[:addr], "bd_addr", 12)} - }, - eos -end - -def sign_info_to_s(sign_info, is_req) - return <<-eos - .sign_info_#{reqrsp_s(is_req)} = { -#{bytes_to_arr(sign_info[:sig_key], "sig_key", 12)} - }, - eos -end - -def passkey_info_fill(passkey_info) - case passkey_info[:action] - # None - when 0 - $ctxt[:pair_alg] = 0 - $ctxt[:authenticated] = false - - # OOB - when 1 - $ctxt[:pair_alg] = 2 - $ctxt[:authenticated] = true - - # Input - when 2 - $ctxt[:pair_alg] = 1 - $ctxt[:authenticated] = true - - # Display - when 3 - $ctxt[:pair_alg] = 1 - $ctxt[:authenticated] = true - - # Numeric comparison - when 4 - $ctxt[:pair_alg] = 3 - $ctxt[:authenticated] = true - - else - raise "invalid MITM action: #{passkey_info[:action]}" - end -end - -def passkey_info_s - passkey_info = $ctxt[:passkey_info] - action_str = $ACTION_STRINGS[passkey_info[:action]] - - result = <<-eos - .pair_alg = #{$ctxt[:pair_alg]}, - .authenticated = #{$ctxt[:authenticated]}, - .passkey_info = { - .passkey = { - .action = #{action_str}, - eos - - if passkey_info[:key] != nil - result << <<-eos - .passkey = #{passkey_info[:key].to_i}, - eos - end - if passkey_info[:oob] != nil - result << <<-eos -#{bytes_to_arr(passkey_info[:oob], "oob", 16)} - eos - end - if passkey_info[:numcmp] != nil - result << <<-eos - .numcmp_accept = 1, - eos - end - - result << <<-eos - }, - eos - - if passkey_info[:numcmp] != nil - result << <<-eos - .exp_numcmp = #{passkey_info[:numcmp].to_i}, - eos - end - - result << <<-eos - }, - eos -end - -def addrs_to_s(addrs) - s = '' - - init_type = addrs[:init_type] - resp_type = addrs[:resp_type] - - if init_type != 0 - s += " .init_addr_type = #{$ADDR_TYPE_STRINGS[init_type]},\n" - end - s += bytes_to_arr(addrs[:init_id_addr], "init_id_addr", 8) + "\n" - if init_type >= 2 - s += bytes_to_arr(addrs[:init_rpa], "init_rpa", 8) + "\n" - end - - if resp_type != 0 - s += " .resp_addr_type = #{$ADDR_TYPE_STRINGS[resp_type]},\n" - end - s += bytes_to_arr(addrs[:resp_id_addr], "resp_id_addr", 8) + "\n" - if resp_type >= 2 - s += bytes_to_arr(addrs[:resp_rpa], "resp_rpa", 8) + "\n" - end - - return s -end - -def dhkey_check_to_s(dhkey_check, is_req) - return <<-eos - .dhkey_check_#{reqrsp_s(is_req)} = { -#{bytes_to_arr(dhkey_check[:value], "value", 12)} - }, - eos -end - -def extract_one(lines, ignore_prev = false) - if ignore_prev - start = 0 - else - start = $prev_idx - end - - (start...lines.size).each do |idx| - line = lines[idx] - result = yield(line) - if result != nil - if !ignore_prev - $prev_idx = idx - end - return result - end - end - - return nil -end - -def extract_pair_req(lines) - return extract_one(lines) {|line| parse_pair_cmd(line, true)} -end - -def extract_pair_rsp(lines) - return extract_one(lines) {|line| parse_pair_cmd(line, false)} -end - -def extract_privkey(lines) - return extract_one(lines) {|line| parse_privkey(line)} -end - -def extract_public_key_req(lines) - return extract_one(lines) do |line| - parse_public_key(line, $ctxt[:we_are_init]) - end -end - -def extract_public_key_rsp(lines) - return extract_one(lines) do |line| - parse_public_key(line, !$ctxt[:we_are_init]) - end -end - -def extract_confirm_req(lines) - return extract_one(lines) do |line| - parse_confirm(line, $ctxt[:we_are_init]) - end -end - -def extract_confirm_rsp(lines) - return extract_one(lines) do |line| - parse_confirm(line, !$ctxt[:we_are_init]) - end -end - -def extract_random_req(lines) - return extract_one(lines) do |line| - parse_random(line, $ctxt[:we_are_init]) - end -end - -def extract_random_rsp(lines) - return extract_one(lines) do |line| - parse_random(line, !$ctxt[:we_are_init]) - end -end - -def extract_confirm_random(lines) - confirm_reqs = [] - confirm_rsps = [] - random_reqs = [] - random_rsps = [] - - idx = 0 - loop do - confirm_req = extract_confirm_req(lines) - if confirm_req != nil - confirm_reqs << confirm_req - end - - confirm_rsp = extract_confirm_rsp(lines) - break if confirm_rsp == nil - if idx >= 20 - raise "too many confirm rsps (>20)" - end - confirm_rsps << confirm_rsp - - random_req = extract_random_req(lines) - break if random_req == nil - random_reqs << random_req - - random_rsp = extract_random_rsp(lines) - break if random_rsp == nil - random_rsps << random_rsp - - idx += 1 - end - - return confirm_reqs, confirm_rsps, random_reqs, random_rsps -end - -def extract_stk(lines) - return extract_one(lines, true) do |line| - parse_stk(line) - end -end - -def extract_dhkey_check_req(lines) - return extract_one(lines) do |line| - parse_dhkey_check(line, $ctxt[:we_are_init]) - end -end - -def extract_dhkey_check_rsp(lines) - return extract_one(lines) do |line| - parse_dhkey_check(line, !$ctxt[:we_are_init]) - end -end - -def extract_enc_info_req(lines) - return extract_one(lines) do |line| - parse_enc_info(line, !$ctxt[:we_are_init]) - end -end - -def extract_enc_info_rsp(lines) - return extract_one(lines) do |line| - parse_enc_info(line, $ctxt[:we_are_init]) - end -end - -def extract_master_id_req(lines) - return extract_one(lines) do |line| - parse_master_id(line, !$ctxt[:we_are_init]) - end -end - -def extract_master_id_rsp(lines) - return extract_one(lines) do |line| - parse_master_id(line, $ctxt[:we_are_init]) - end -end - -def extract_id_info_req(lines) - return extract_one(lines) do |line| - parse_id_info(line, !$ctxt[:we_are_init]) - end -end - -def extract_id_info_rsp(lines) - return extract_one(lines) do |line| - parse_id_info(line, $ctxt[:we_are_init]) - end -end - -def extract_id_addr_info_req(lines) - return extract_one(lines) do |line| - parse_id_addr_info(line, !$ctxt[:we_are_init]) - end -end - -def extract_id_addr_info_rsp(lines) - return extract_one(lines) do |line| - parse_id_addr_info(line, $ctxt[:we_are_init]) - end -end - -def extract_sign_info_req(lines) - return extract_one(lines) do |line| - parse_sign_info(line, !$ctxt[:we_are_init]) - end -end - -def extract_sign_info_rsp(lines) - return extract_one(lines) do |line| - parse_sign_info(line, $ctxt[:we_are_init]) - end -end - -def extract_ltk(lines) - return extract_one(lines) do |line| - parse_ltk(line) - end -end - -def extract_passkey_info(lines) - passkey_info = extract_one(lines, true) do |line| - parse_passkey_info(line) - end - - if passkey_info == nil - passkey_info = { :action => 0 } - end - - return passkey_info -end - -def extract_addrs(lines) - return extract_one(lines) do |line| - parse_addrs(line) - end -end - - -lines = STDIN.readlines - -detect_initiator(lines) -$ctxt[:pair_req] = extract_pair_req(lines) -$ctxt[:pair_rsp] = extract_pair_rsp(lines) -$ctxt[:privkey] = extract_privkey(lines) -$ctxt[:public_key_req] = extract_public_key_req(lines) -$ctxt[:public_key_rsp] = extract_public_key_rsp(lines) -$ctxt[:confirm_reqs], $ctxt[:confirm_rsps], $ctxt[:random_reqs], $ctxt[:random_rsps] = extract_confirm_random(lines) -$ctxt[:passkey_info] = extract_passkey_info(lines) -$ctxt[:dhkey_check_req] = extract_dhkey_check_req(lines) -$ctxt[:dhkey_check_rsp] = extract_dhkey_check_rsp(lines) -$ctxt[:enc_info_req] = extract_enc_info_req(lines) -$ctxt[:master_id_req] = extract_master_id_req(lines) -$ctxt[:id_info_req] = extract_id_info_req(lines) -$ctxt[:id_addr_info_req] = extract_id_addr_info_req(lines) -$ctxt[:sign_info_req] = extract_sign_info_req(lines) -$ctxt[:enc_info_rsp] = extract_enc_info_rsp(lines) -$ctxt[:master_id_rsp] = extract_master_id_rsp(lines) -$ctxt[:id_info_rsp] = extract_id_info_rsp(lines) -$ctxt[:id_addr_info_rsp] = extract_id_addr_info_rsp(lines) -$ctxt[:sign_info_rsp] = extract_sign_info_rsp(lines) -$ctxt[:addrs] = extract_addrs(lines) -$ctxt[:ltk] = extract_ltk(lines) -$ctxt[:stk] = extract_stk(lines) - -expected_confirm_rsps = nil -expected_random_reqs = nil -expected_random_rsps = nil -if $ctxt[:confirm_reqs].size == 0 - expected_confirm_rsps = 1 - expected_random_reqs = 1 - expected_random_rsps = 1 -else - expected_confirm_rsps = $ctxt[:confirm_reqs].size - expected_random_reqs = $ctxt[:random_reqs].size - expected_random_rsps = $ctxt[:random_rsps].size -end - -if $ctxt[:confirm_rsps].size != expected_confirm_rsps - raise "wrong number of confirm responses " + - "(exp=#{expected_confirm_rsps}; got=#{$ctxt[:confirm_rsps].size}" -end - -if $ctxt[:random_reqs].size != expected_random_reqs - raise "wrong number of random requests " + - "(exp=#{expected_random_reqs}; got=#{$ctxt[:random_reqs].size}" -end - -if $ctxt[:random_rsps].size != expected_random_rsps - raise "wrong number of random responses " + - "(exp=#{expected_random_rsps}; got=#{$ctxt[:random_rsps].size}" -end - -passkey_info_fill($ctxt[:passkey_info]) - -$ctxt[:sc] = $ctxt[:public_key_req] != nil -$ctxt[:bonding] = $ctxt[:pair_req][:authreq] & 1 == 1 && - $ctxt[:pair_rsp][:authreq] & 1 == 1 - -puts test_case_comment() -puts <<-eos -TEST_CASE(#{test_case_name()}) -{ - struct ble_sm_test_params params; - - params = (struct ble_sm_test_params) { -eos - -puts addrs_to_s($ctxt[:addrs]) - -puts pair_cmd_to_s($ctxt[:pair_req], true) -puts pair_cmd_to_s($ctxt[:pair_rsp], false) - -if $ctxt[:sc] - puts privkey_to_s($ctxt[:privkey]) - puts public_key_to_s($ctxt[:public_key_req], true) - puts public_key_to_s($ctxt[:public_key_req], false) -end - -$ctxt[:confirm_rsps].size.times do |i| - confirm_req = $ctxt[:confirm_reqs][i] - confirm_rsp = $ctxt[:confirm_rsps][i] - random_req = $ctxt[:random_reqs][i] - random_rsp = $ctxt[:random_rsps][i] - - if confirm_req != nil - puts confirm_to_s(confirm_req, true, i) - end - - puts confirm_to_s(confirm_rsp, false, i) - puts random_to_s(random_req, true, i) - puts random_to_s(random_rsp, false, i) -end - -if $ctxt[:sc] - puts dhkey_check_to_s($ctxt[:dhkey_check_req], true) - puts dhkey_check_to_s($ctxt[:dhkey_check_rsp], false) -end - -if $ctxt[:enc_info_req] != nil - puts enc_info_to_s($ctxt[:enc_info_req], true) -end -if $ctxt[:master_id_req] != nil - puts master_id_to_s($ctxt[:master_id_req], true) -end -if $ctxt[:id_info_req] != nil - puts id_info_to_s($ctxt[:id_info_req], true) -end -if $ctxt[:id_addr_info_req] != nil - puts id_addr_info_to_s($ctxt[:id_addr_info_req], true) -end -if $ctxt[:sign_info_req] != nil - puts sign_info_to_s($ctxt[:sign_info_req], true) -end -if $ctxt[:enc_info_rsp] != nil - puts enc_info_to_s($ctxt[:enc_info_rsp], false) -end -if $ctxt[:master_id_rsp] != nil - puts master_id_to_s($ctxt[:master_id_rsp], false) -end -if $ctxt[:id_info_rsp] != nil - puts id_info_to_s($ctxt[:id_info_rsp], false) -end -if $ctxt[:id_addr_info_rsp] != nil - puts id_addr_info_to_s($ctxt[:id_addr_info_rsp], false) -end -if $ctxt[:sign_info_rsp] != nil - puts sign_info_to_s($ctxt[:sign_info_rsp], false) -end -if $ctxt[:sc] - puts ltk_to_s($ctxt[:ltk]) -else - puts stk_to_s($ctxt[:stk]) -end -puts passkey_info_s() - -puts ' };' - -if $ctxt[:sc] - if $ctxt[:we_are_init] - puts ' ble_sm_test_util_us_sc_good(¶ms);' - else - puts ' ble_sm_test_util_peer_sc_good(¶ms);' - end -else - if $ctxt[:we_are_init] - puts ' ble_sm_test_util_us_lgcy_good(¶ms);' - else - puts ' ble_sm_test_util_peer_lgcy_good(¶ms);' - end -end -puts '}' diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/util/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/util/pkg.yml deleted file mode 100644 index 0f5f3a5de..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/util/pkg.yml +++ /dev/null @@ -1,29 +0,0 @@ -# -# 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. -# - -pkg.name: nimble/host/util -pkg.description: Supplementary utilities for the NimBLE host -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - -pkg.deps: - - nimble/host diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/util/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/util/syscfg.yml deleted file mode 100644 index 2cdd57468..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/util/syscfg.yml +++ /dev/null @@ -1,19 +0,0 @@ -# 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. -# - -syscfg.defs: diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/pkg.yml deleted file mode 100644 index 8b6058e11..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/pkg.yml +++ /dev/null @@ -1,30 +0,0 @@ -# -# 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. -# - -pkg.name: nimble -pkg.description: Generic functionality for the nimble Bluetooth Smart stack; used by both the controller and the host. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - -pkg.deps: - - porting/npl/mynewt - - "@apache-mynewt-core/kernel/os" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/syscfg.yml deleted file mode 100644 index 537fd9ba5..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/syscfg.yml +++ /dev/null @@ -1,83 +0,0 @@ -# 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. -# - -syscfg.defs: - # Supported GAP roles. By default, all four roles are enabled. - BLE_ROLE_CENTRAL: - description: 'Enables the Central bluetooth role. (0/1)' - value: 1 - BLE_ROLE_PERIPHERAL: - description: 'Enables the Peripheral bluetooth role. (0/1)' - value: 1 - BLE_ROLE_BROADCASTER: - description: 'Enables the Broadcaster bluetooth role. (0/1)' - value: 1 - BLE_ROLE_OBSERVER: - description: 'Enables the Observer bluetooth role. (0/1)' - value: 1 - - BLE_MAX_CONNECTIONS: - description: 'The maximum number of concurrent connections.' - value: 1 - BLE_MAX_PERIODIC_SYNCS: - description: > - The maximum number of concurrent periodic syncs that can - be created - value: 1 - BLE_WHITELIST: - description: > - Enables the BLE whitelist for controlling who to connect to or - accept a connection from. (0/1) - value: 1 - BLE_MULTI_ADV_INSTANCES: - description: > - This is the number of multi-advertising instances. This is NOT the - total number of advertising instances. The total number of - advertising instances is this number plus 1 (assuming the device - supports advertising). - value: 0 - BLE_EXT_ADV: - description: > - This enables extended advertising feature. - value: 0 - BLE_PERIODIC_ADV: - description: > - This enables periodic advertising feature. - value: 0 - BLE_PERIODIC_ADV_SYNC_TRANSFER: - description: > - This enables Periodic Advertising Sync Transfer Feature. - value: 0 - - BLE_EXT_ADV_MAX_SIZE: - description: > - This allows to configure maximum size of advertising data and - scan response data used in LE Advertising Extensions. - Valid range 31-1650. - value: 31 - BLE_VERSION: - description: > - This allows to configure supported Bluetooth Core version. Some - features may not be available if version is too low. Version is - integer for easy comparison. - range: 50, 51, 52 - value: 50 - -# Allow periodic sync transfer only if 5.1 or higher -syscfg.restrictions: - - "'BLE_PERIODIC_ADV_SYNC_TRANSFER == 0' || 'BLE_VERSION >= 51'" diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/pkg.yml deleted file mode 100644 index 2bc4ac293..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/pkg.yml +++ /dev/null @@ -1,45 +0,0 @@ -# -# 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. -# - -pkg.name: nimble/transport -pkg.description: Meta-package for NimBLE HCI transport -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - -pkg.deps.'BLE_HCI_TRANSPORT == "builtin"': - - nimble/transport/ram - - nimble/controller - -pkg.deps.'BLE_HCI_TRANSPORT == "emspi"': - - nimble/transport/emspi - -pkg.deps.'BLE_HCI_TRANSPORT == "ram"': - - nimble/transport/ram - -pkg.deps.'BLE_HCI_TRANSPORT == "socket"': - - nimble/transport/socket - -pkg.deps.'BLE_HCI_TRANSPORT == "uart"': - - nimble/transport/uart - -pkg.deps.'BLE_HCI_TRANSPORT == "da1469x"': - - nimble/transport/da1469x diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/ram/pkg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/ram/pkg.yml deleted file mode 100644 index bb8397bf3..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/ram/pkg.yml +++ /dev/null @@ -1,36 +0,0 @@ -# -# 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. -# - -pkg.name: nimble/transport/ram -pkg.description: XXX -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - ble - - bluetooth - -pkg.deps: - - "@apache-mynewt-core/kernel/os" - - nimble - -pkg.apis: - - ble_transport - -pkg.init: - ble_hci_ram_init: 'MYNEWT_VAL(BLE_TRANS_RAM_SYSINIT_STAGE)' diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/ram/src/ble_hci_ram.c b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/ram/src/ble_hci_ram.c deleted file mode 100644 index 9eaa1d866..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/ram/src/ble_hci_ram.c +++ /dev/null @@ -1,241 +0,0 @@ -/* - * 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 ESP_PLATFORM - -#include -#include -#include -#include "nimble/porting/nimble/include/syscfg/syscfg.h" -#include "nimble/porting/nimble/include/sysinit/sysinit.h" -#include "nimble/porting/nimble/include/os/os.h" -#include "nimble/porting/nimble/include/mem/mem.h" -#include "nimble/nimble/include/nimble/ble.h" -#include "nimble/nimble/include/nimble/ble_hci_trans.h" -#include "../include/transport/ram/ble_hci_ram.h" - -static ble_hci_trans_rx_cmd_fn *ble_hci_ram_rx_cmd_hs_cb; -static void *ble_hci_ram_rx_cmd_hs_arg; - -static ble_hci_trans_rx_cmd_fn *ble_hci_ram_rx_cmd_ll_cb; -static void *ble_hci_ram_rx_cmd_ll_arg; - -static ble_hci_trans_rx_acl_fn *ble_hci_ram_rx_acl_hs_cb; -static void *ble_hci_ram_rx_acl_hs_arg; - -static ble_hci_trans_rx_acl_fn *ble_hci_ram_rx_acl_ll_cb; -static void *ble_hci_ram_rx_acl_ll_arg; - -static struct os_mempool ble_hci_ram_cmd_pool; -static os_membuf_t ble_hci_ram_cmd_buf[ - OS_MEMPOOL_SIZE(1, BLE_HCI_TRANS_CMD_SZ) -]; - -static struct os_mempool ble_hci_ram_evt_hi_pool; -static os_membuf_t ble_hci_ram_evt_hi_buf[ - OS_MEMPOOL_SIZE(MYNEWT_VAL(BLE_HCI_EVT_HI_BUF_COUNT), - MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE)) -]; - -static struct os_mempool ble_hci_ram_evt_lo_pool; -static os_membuf_t ble_hci_ram_evt_lo_buf[ - OS_MEMPOOL_SIZE(MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT), - MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE)) -]; - -void -ble_hci_trans_cfg_hs(ble_hci_trans_rx_cmd_fn *cmd_cb, - void *cmd_arg, - ble_hci_trans_rx_acl_fn *acl_cb, - void *acl_arg) -{ - ble_hci_ram_rx_cmd_hs_cb = cmd_cb; - ble_hci_ram_rx_cmd_hs_arg = cmd_arg; - ble_hci_ram_rx_acl_hs_cb = acl_cb; - ble_hci_ram_rx_acl_hs_arg = acl_arg; -} - -void -ble_hci_trans_cfg_ll(ble_hci_trans_rx_cmd_fn *cmd_cb, - void *cmd_arg, - ble_hci_trans_rx_acl_fn *acl_cb, - void *acl_arg) -{ - ble_hci_ram_rx_cmd_ll_cb = cmd_cb; - ble_hci_ram_rx_cmd_ll_arg = cmd_arg; - ble_hci_ram_rx_acl_ll_cb = acl_cb; - ble_hci_ram_rx_acl_ll_arg = acl_arg; -} - -int -ble_hci_trans_hs_cmd_tx(uint8_t *cmd) -{ - int rc; - - assert(ble_hci_ram_rx_cmd_ll_cb != NULL); - - rc = ble_hci_ram_rx_cmd_ll_cb(cmd, ble_hci_ram_rx_cmd_ll_arg); - return rc; -} - -int -ble_hci_trans_ll_evt_tx(uint8_t *hci_ev) -{ - int rc; - - assert(ble_hci_ram_rx_cmd_hs_cb != NULL); - - rc = ble_hci_ram_rx_cmd_hs_cb(hci_ev, ble_hci_ram_rx_cmd_hs_arg); - return rc; -} - -int -ble_hci_trans_hs_acl_tx(struct os_mbuf *om) -{ - int rc; - - assert(ble_hci_ram_rx_acl_ll_cb != NULL); - - rc = ble_hci_ram_rx_acl_ll_cb(om, ble_hci_ram_rx_acl_ll_arg); - return rc; -} - -int -ble_hci_trans_ll_acl_tx(struct os_mbuf *om) -{ - int rc; - - assert(ble_hci_ram_rx_acl_hs_cb != NULL); - - rc = ble_hci_ram_rx_acl_hs_cb(om, ble_hci_ram_rx_acl_hs_arg); - return rc; -} - -uint8_t * -ble_hci_trans_buf_alloc(int type) -{ - uint8_t *buf; - - switch (type) { - case BLE_HCI_TRANS_BUF_CMD: - buf = os_memblock_get(&ble_hci_ram_cmd_pool); - break; - - case BLE_HCI_TRANS_BUF_EVT_HI: - buf = os_memblock_get(&ble_hci_ram_evt_hi_pool); - if (buf == NULL) { - /* If no high-priority event buffers remain, try to grab a - * low-priority one. - */ - buf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_LO); - } - break; - - case BLE_HCI_TRANS_BUF_EVT_LO: - buf = os_memblock_get(&ble_hci_ram_evt_lo_pool); - break; - - default: - assert(0); - buf = NULL; - } - - return buf; -} - -void -ble_hci_trans_buf_free(uint8_t *buf) -{ - int rc; - - /* XXX: this may look a bit odd, but the controller uses the command - * buffer to send back the command complete/status as an immediate - * response to the command. This was done to insure that the controller - * could always send back one of these events when a command was received. - * Thus, we check to see which pool the buffer came from so we can free - * it to the appropriate pool - */ - if (os_memblock_from(&ble_hci_ram_evt_hi_pool, buf)) { - rc = os_memblock_put(&ble_hci_ram_evt_hi_pool, buf); - assert(rc == 0); - } else if (os_memblock_from(&ble_hci_ram_evt_lo_pool, buf)) { - rc = os_memblock_put(&ble_hci_ram_evt_lo_pool, buf); - assert(rc == 0); - } else { - assert(os_memblock_from(&ble_hci_ram_cmd_pool, buf)); - rc = os_memblock_put(&ble_hci_ram_cmd_pool, buf); - assert(rc == 0); - } -} - -/** - * Unsupported; the RAM transport does not have a dedicated ACL data packet - * pool. - */ -int -ble_hci_trans_set_acl_free_cb(os_mempool_put_fn *cb, void *arg) -{ - return BLE_ERR_UNSUPPORTED; -} - -int -ble_hci_trans_reset(void) -{ - /* No work to do. All allocated buffers are owned by the host or - * controller, and they will get freed by their owners. - */ - return 0; -} - -void -ble_hci_ram_init(void) -{ - int rc; - - /* Ensure this function only gets called by sysinit. */ - SYSINIT_ASSERT_ACTIVE(); - - /* - * Create memory pool of HCI command buffers. NOTE: we currently dont - * allow this to be configured. The controller will only allow one - * outstanding command. We decided to keep this a pool in case we allow - * allow the controller to handle more than one outstanding command. - */ - rc = os_mempool_init(&ble_hci_ram_cmd_pool, - 1, - BLE_HCI_TRANS_CMD_SZ, - ble_hci_ram_cmd_buf, - "ble_hci_ram_cmd_pool"); - SYSINIT_PANIC_ASSERT(rc == 0); - - rc = os_mempool_init(&ble_hci_ram_evt_hi_pool, - MYNEWT_VAL(BLE_HCI_EVT_HI_BUF_COUNT), - MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE), - ble_hci_ram_evt_hi_buf, - "ble_hci_ram_evt_hi_pool"); - SYSINIT_PANIC_ASSERT(rc == 0); - - rc = os_mempool_init(&ble_hci_ram_evt_lo_pool, - MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT), - MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE), - ble_hci_ram_evt_lo_buf, - "ble_hci_ram_evt_lo_pool"); - SYSINIT_PANIC_ASSERT(rc == 0); -} - -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/ram/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/ram/syscfg.yml deleted file mode 100644 index 3b822fcc6..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/ram/syscfg.yml +++ /dev/null @@ -1,48 +0,0 @@ -# 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. -# - -syscfg.defs: - BLE_HCI_EVT_HI_BUF_COUNT: - description: 'Number of high-priority event buffers.' - value: 2 - - BLE_HCI_EVT_LO_BUF_COUNT: - description: 'Number of low-priority event buffers.' - value: 8 - - BLE_HCI_EVT_BUF_SIZE: - description: 'Size of each event buffer, in bytes.' - value: 70 - - BLE_ACL_BUF_COUNT: - description: 'The number of ACL data buffers' - value: 4 - - BLE_ACL_BUF_SIZE: - description: > - This is the maximum size of the data portion of HCI ACL data - packets. It does not include the HCI data header (of 4 bytes). - value: 255 - - BLE_TRANS_RAM_SYSINIT_STAGE: - description: > - Sysinit stage for the RAM BLE transport. - value: 100 - -syscfg.vals.BLE_EXT_ADV: - BLE_HCI_EVT_BUF_SIZE: 257 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/syscfg.yml b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/syscfg.yml deleted file mode 100644 index 137d6e94f..000000000 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/transport/syscfg.yml +++ /dev/null @@ -1,68 +0,0 @@ -# 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. -# - -syscfg.defs: - BLE_HCI_TRANSPORT: - description: > - Selects HCI transport to be included in build. - This has virtually the same effect as including package dependency - manually, but it allows to easily override HCI transport package in - application or target settings. - value: builtin - restrictions: $notnull - choices: - - builtin # Built-in NimBLE controller and RAM transport - - custom # Custom transport, has to be included manually by user - - ram # RAM transport - - uart # UART HCI H4 transport - - socket # Socket transport (for native builds) - - emspi # SPI transport for EM Microelectionic controllers - - da1469x # Dialog DA1469x integrated controller - -# Deprecated settings - BLE_HCI_TRANSPORT_NIMBLE_BUILTIN: - description: Use BLE_HCI_TRANSPORT instead. - value: 0 - deprecated: 1 - BLE_HCI_TRANSPORT_EMSPI: - description: Use BLE_HCI_TRANSPORT instead. - value: 0 - deprecated: 1 - BLE_HCI_TRANSPORT_RAM: - description: Use BLE_HCI_TRANSPORT instead. - value: 0 - deprecated: 1 - BLE_HCI_TRANSPORT_SOCKET: - description: Use BLE_HCI_TRANSPORT instead. - value: 0 - deprecated: 1 - BLE_HCI_TRANSPORT_UART: - description: Use BLE_HCI_TRANSPORT instead. - value: 0 - deprecated: 1 - -syscfg.vals.BLE_HCI_TRANSPORT_NIMBLE_BUILTIN: - BLE_HCI_TRANSPORT: builtin -syscfg.vals.BLE_HCI_TRANSPORT_RAM: - BLE_HCI_TRANSPORT: ram -syscfg.vals.BLE_HCI_TRANSPORT_UART: - BLE_HCI_TRANSPORT: uart -syscfg.vals.BLE_HCI_TRANSPORT_SOCKET: - BLE_HCI_TRANSPORT: socket -syscfg.vals.BLE_HCI_TRANSPORT_EMSPI: - BLE_HCI_TRANSPORT: emspi diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/nimble_npl.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_npl.h similarity index 97% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/nimble_npl.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_npl.h index 091cbea59..883832289 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/nimble_npl.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_npl.h @@ -23,6 +23,7 @@ #include #include #include +#include "nimconfig.h" #ifdef __cplusplus extern "C" { @@ -50,7 +51,7 @@ enum ble_npl_error { typedef enum ble_npl_error ble_npl_error_t; /* Include OS-specific definitions */ -#include "nimble/porting/npl/freertos/include/nimble/nimble_npl_os.h" +#include "nimble/nimble_npl_os.h" /* * Generic @@ -163,7 +164,7 @@ void ble_npl_time_delay(ble_npl_time_t ticks); #if NIMBLE_CFG_CONTROLLER -void ble_npl_hw_set_isr(int irqn, void (*addr)(void)); +void ble_npl_hw_set_isr(int irqn, uint32_t addr); #endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/npl/freertos/include/nimble/nimble_npl_os.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_npl_os.h similarity index 89% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/npl/freertos/include/nimble/nimble_npl_os.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_npl_os.h index 7321cd27a..1525d8228 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/npl/freertos/include/nimble/nimble_npl_os.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_npl_os.h @@ -37,13 +37,6 @@ extern "C" { #define BLE_NPL_TIME_FOREVER portMAX_DELAY -#ifndef ESP_PLATFORM -#define NIMBLE_CFG_CONTROLLER 1 -#define NIMBLE_EVT_QUEUE_SIZE 4 -#else -#define NIMBLE_EVT_QUEUE_SIZE 32 -#endif - /* This should be compatible with TickType_t */ typedef uint32_t ble_npl_time_t; typedef int32_t ble_npl_stime_t; @@ -59,11 +52,7 @@ struct ble_npl_eventq { }; struct ble_npl_callout { -#if CONFIG_BT_NIMBLE_USE_ESP_TIMER - esp_timer_handle_t handle; -#else TimerHandle_t handle; -#endif struct ble_npl_eventq *evq; struct ble_npl_event ev; }; @@ -99,7 +88,7 @@ ble_npl_get_current_task_id(void) static inline void ble_npl_eventq_init(struct ble_npl_eventq *evq) { - evq->q = xQueueCreate(NIMBLE_EVT_QUEUE_SIZE, sizeof(struct ble_npl_eventq *)); + evq->q = xQueueCreate(32, sizeof(struct ble_npl_eventq *)); } static inline void @@ -225,7 +214,6 @@ ble_npl_callout_init(struct ble_npl_callout *co, struct ble_npl_eventq *evq, { npl_freertos_callout_init(co, evq, ev_cb, ev_arg); } - static inline void ble_npl_callout_deinit(struct ble_npl_callout *co) { @@ -241,19 +229,23 @@ ble_npl_callout_reset(struct ble_npl_callout *co, ble_npl_time_t ticks) static inline void ble_npl_callout_stop(struct ble_npl_callout *co) { - npl_freertos_callout_stop(co); + xTimerStop(co->handle, portMAX_DELAY); } static inline bool ble_npl_callout_is_active(struct ble_npl_callout *co) { - return npl_freertos_callout_is_active(co); + /* Workaround for bug in xTimerIsTimerActive with FreeRTOS V10.2.0, fixed in V10.4.4 + * See: https://github.com/FreeRTOS/FreeRTOS-Kernel/pull/305 + * Sometimes xTimerIsTimerActive returns pdTRUE even though the timer has expired, so we double check. + */ + return xTimerIsTimerActive(co->handle) == pdTRUE && xTimerGetExpiryTime(co->handle) > xTaskGetTickCountFromISR(); } static inline ble_npl_time_t ble_npl_callout_get_ticks(struct ble_npl_callout *co) { - return npl_freertos_callout_get_ticks(co); + return xTimerGetExpiryTime(co->handle); } static inline uint32_t @@ -307,20 +299,13 @@ ble_npl_time_delay(ble_npl_time_t ticks) #if NIMBLE_CFG_CONTROLLER static inline void -ble_npl_hw_set_isr(int irqn, void (*addr)(void)) +ble_npl_hw_set_isr(int irqn, uint32_t addr) { npl_freertos_hw_set_isr(irqn, addr); } - -static inline bool -ble_npl_hw_is_in_critical(void) -{ - return (uxGetCriticalNestingDepth() > 0); -} #endif -#ifdef ESP_PLATFORM -extern portMUX_TYPE ble_port_mutex; +extern portMUX_TYPE ble_port_mutex; //critical section static inline uint32_t ble_npl_hw_enter_critical(void) @@ -333,24 +318,9 @@ static inline void ble_npl_hw_exit_critical(uint32_t ctx) { portEXIT_CRITICAL(&ble_port_mutex); -} -#else -static inline uint32_t -ble_npl_hw_enter_critical(void) -{ - vPortEnterCritical(); - return 0; } -static inline void -ble_npl_hw_exit_critical(uint32_t ctx) -{ - (void)ctx; - vPortExitCritical(); -} -#endif - #ifdef __cplusplus } #endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/nimble_opt.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_opt.h similarity index 96% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/nimble_opt.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_opt.h index 7de55d668..f0e988b27 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/nimble_opt.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_opt.h @@ -25,7 +25,7 @@ extern "C" { #endif /* Include automatically-generated settings. */ -#include "nimble_opt_auto.h" +#include "nimble/nimble_opt_auto.h" #ifdef __cplusplus } diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/nimble_opt_auto.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_opt_auto.h similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/nimble_opt_auto.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_opt_auto.h index 056eb1b02..33a1e2aac 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/include/nimble/nimble_opt_auto.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_opt_auto.h @@ -20,7 +20,7 @@ #ifndef H_NIMBLE_OPT_AUTO_ #define H_NIMBLE_OPT_AUTO_ -#include "nimble/porting/nimble/include/syscfg/syscfg.h" +#include "syscfg/syscfg.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/nimble/nimble_port.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_port.h similarity index 88% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/nimble/nimble_port.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_port.h index 68e7cdbb8..e8996a666 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/nimble/nimble_port.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_port.h @@ -20,16 +20,11 @@ #ifndef _NIMBLE_PORT_H #define _NIMBLE_PORT_H -#include "nimble/nimble/include/nimble/nimble_npl.h" - -#ifdef ESP_PLATFORM +#include "nimble/nimble_npl.h" #include "nimconfig.h" + #define NIMBLE_CORE (CONFIG_BT_NIMBLE_PINNED_TO_CORE < portNUM_PROCESSORS ? CONFIG_BT_NIMBLE_PINNED_TO_CORE : tskNO_AFFINITY) #define NIMBLE_STACK_SIZE CONFIG_BT_NIMBLE_TASK_STACK_SIZE -#else -#include "../syscfg/syscfg.h" -#define NIMBLE_HS_TASK_STACK_SIZE (CONFIG_BT_NIMBLE_TASK_STACK_SIZE / 4) -#endif #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/npl/freertos/include/nimble/nimble_port_freertos.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_port_freertos.h similarity index 85% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/npl/freertos/include/nimble/nimble_port_freertos.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_port_freertos.h index 94d75f5a5..ddeefc71c 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/npl/freertos/include/nimble/nimble_port_freertos.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble_port_freertos.h @@ -20,7 +20,7 @@ #ifndef _NIMBLE_PORT_FREERTOS_H #define _NIMBLE_PORT_FREERTOS_H -#include "nimble/nimble/include/nimble/nimble_npl.h" +#include "nimble/nimble_npl.h" #ifdef __cplusplus extern "C" { @@ -28,10 +28,6 @@ extern "C" { void nimble_port_freertos_init(TaskFunction_t host_task_fn); void nimble_port_freertos_deinit(void); -#ifndef ESP_PLATFORM -UBaseType_t nimble_port_freertos_get_ll_hwm(void); -#endif -UBaseType_t nimble_port_freertos_get_hs_hwm(void); #ifdef __cplusplus } diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/npl/freertos/include/nimble/npl_freertos.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/npl_freertos.h similarity index 91% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/npl/freertos/include/nimble/npl_freertos.h rename to lib/libesp32_div/NimBLE-Arduino/src/nimble/npl_freertos.h index 69942773f..2bf7b3d23 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/npl/freertos/include/nimble/npl_freertos.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/npl_freertos.h @@ -57,12 +57,6 @@ void npl_freertos_callout_init(struct ble_npl_callout *co, void npl_freertos_callout_deinit(struct ble_npl_callout *co); -void npl_freertos_callout_stop(struct ble_npl_callout *co); - -bool npl_freertos_callout_is_active(struct ble_npl_callout *co); - -ble_npl_time_t npl_freertos_callout_get_ticks(struct ble_npl_callout *co); - ble_npl_error_t npl_freertos_callout_reset(struct ble_npl_callout *co, ble_npl_time_t ticks); @@ -75,7 +69,7 @@ ble_npl_error_t npl_freertos_time_ms_to_ticks(uint32_t ms, ble_npl_error_t npl_freertos_time_ticks_to_ms(ble_npl_time_t ticks, uint32_t *out_ms); -void npl_freertos_hw_set_isr(int irqn, void (*addr)(void)); +void npl_freertos_hw_set_isr(int irqn, uint32_t addr); uint32_t npl_freertos_hw_enter_critical(void); diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimconfig.h b/lib/libesp32_div/NimBLE-Arduino/src/nimconfig.h index b66993ef7..49b81ae29 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimconfig.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimconfig.h @@ -1,11 +1,6 @@ #pragma once -#ifdef ESP_PLATFORM #include "sdkconfig.h" -#else -#include "ext_nimble_config.h" -#endif - #include "nimconfig_rename.h" /*********************************************** @@ -21,17 +16,16 @@ /** @brief Un-comment to change default device name */ // #define CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME "nimble" -/** @brief Un-comment to set the debug log messages level from the NimBLE host stack.\n - * Values: 0 = DEBUG, 1 = INFO, 2 = WARNING, 3 = ERROR, 4 = CRITICAL, 5+ = NONE\n +/** @brief Un-comment to see debug log messages from the NimBLE host * Uses approx. 32kB of flash memory. */ - // #define CONFIG_BT_NIMBLE_LOG_LEVEL 5 +// #define CONFIG_BT_NIMBLE_DEBUG /** @brief Un-comment to set the debug log messages level from the NimBLE CPP Wrapper.\n * Values: 0 = NONE, 1 = ERROR, 2 = WARNING, 3 = INFO, 4+ = DEBUG\n * Uses approx. 32kB of flash memory. */ - // #define NIMBLE_CPP_DEBUG_LEVEL 0 + // #define CONFIG_NIMBLE_CPP_DEBUG_LEVEL 0 /** @brief Un-comment to see NimBLE host return codes as text debug log messages. * Uses approx. 7kB of flash memory. @@ -162,10 +156,6 @@ #define CONFIG_BT_NIMBLE_RPA_TIMEOUT 900 #endif -#ifndef CONFIG_BT_NIMBLE_LOG_LEVEL -#define CONFIG_BT_NIMBLE_LOG_LEVEL 5 -#endif - /** @brief Set if CCCD's and bond data should be stored in NVS */ #define CONFIG_BT_NIMBLE_NVS_PERSIST 1 @@ -208,7 +198,6 @@ #define CONFIG_BT_ENABLED #endif -#ifdef ESP_PLATFORM #ifndef CONFIG_BTDM_CONTROLLER_MODE_BLE_ONLY #define CONFIG_BTDM_CONTROLLER_MODE_BLE_ONLY #endif @@ -228,7 +217,6 @@ #if !defined(CONFIG_IDF_TARGET_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) #define CONFIG_IDF_TARGET_ESP32 1 #endif -#endif /* Cannot use client without scan */ #if defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) && !defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER) diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/endian.h b/lib/libesp32_div/NimBLE-Arduino/src/os/endian.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/endian.h rename to lib/libesp32_div/NimBLE-Arduino/src/os/endian.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os.h b/lib/libesp32_div/NimBLE-Arduino/src/os/os.h similarity index 89% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os.h rename to lib/libesp32_div/NimBLE-Arduino/src/os/os.h index d4f6101b7..f7a7ef9c5 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/os/os.h @@ -34,8 +34,8 @@ extern "C" { #define max(a, b) ((a)>(b)?(a):(b)) #endif -#include "../syscfg/syscfg.h" -#include "nimble/nimble/include/nimble/nimble_npl.h" +#include "syscfg/syscfg.h" +#include "nimble/nimble_npl.h" #define OS_ALIGN(__n, __a) ( \ (((__n) & ((__a) - 1)) == 0) ? \ @@ -50,11 +50,11 @@ typedef uint32_t os_sr_t; #define OS_ASSERT_CRITICAL() assert(ble_npl_hw_is_in_critical()) /* Mynewt components (not abstracted in NPL) */ -#include "endian.h" -#include "queue.h" -#include "os_error.h" -#include "os_mbuf.h" -#include "os_mempool.h" +#include "os/endian.h" +#include "os/queue.h" +#include "os/os_error.h" +#include "os/os_mbuf.h" +#include "os/os_mempool.h" #ifdef __cplusplus } diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os_cputime.h b/lib/libesp32_div/NimBLE-Arduino/src/os/os_cputime.h similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os_cputime.h rename to lib/libesp32_div/NimBLE-Arduino/src/os/os_cputime.h index 9002ca56a..20124b574 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os_cputime.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/os/os_cputime.h @@ -31,9 +31,9 @@ extern "C" { #endif -#include "../syscfg/syscfg.h" -#include "../hal/hal_timer.h" -#include "os.h" +#include "syscfg/syscfg.h" +#include "hal/hal_timer.h" +#include "os/os.h" /* * NOTE: these definitions allow one to override the cputime frequency used. diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os_error.h b/lib/libesp32_div/NimBLE-Arduino/src/os/os_error.h similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os_error.h rename to lib/libesp32_div/NimBLE-Arduino/src/os/os_error.h index f2213bdf9..15cc62282 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os_error.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/os/os_error.h @@ -20,7 +20,7 @@ #ifndef H_OS_ERROR_ #define H_OS_ERROR_ -#include "os.h" +#include "os/os.h" enum os_error { OS_OK = 0, diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os_mbuf.h b/lib/libesp32_div/NimBLE-Arduino/src/os/os_mbuf.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os_mbuf.h rename to lib/libesp32_div/NimBLE-Arduino/src/os/os_mbuf.h index 0775556d2..f3857fe46 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os_mbuf.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/os/os_mbuf.h @@ -29,7 +29,7 @@ #ifndef _OS_MBUF_H #define _OS_MBUF_H -#include "os.h" +#include "os/os.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os_mempool.h b/lib/libesp32_div/NimBLE-Arduino/src/os/os_mempool.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os_mempool.h rename to lib/libesp32_div/NimBLE-Arduino/src/os/os_mempool.h index a01d34ded..251858742 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os_mempool.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/os/os_mempool.h @@ -29,8 +29,8 @@ #define _OS_MEMPOOL_H_ #include -#include "os.h" -#include "queue.h" +#include "os/os.h" +#include "os/queue.h" #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os_trace_api.h b/lib/libesp32_div/NimBLE-Arduino/src/os/os_trace_api.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/os_trace_api.h rename to lib/libesp32_div/NimBLE-Arduino/src/os/os_trace_api.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/queue.h b/lib/libesp32_div/NimBLE-Arduino/src/os/queue.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/queue.h rename to lib/libesp32_div/NimBLE-Arduino/src/os/queue.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/util.h b/lib/libesp32_div/NimBLE-Arduino/src/os/util.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/os/util.h rename to lib/libesp32_div/NimBLE-Arduino/src/os/util.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/port/src/esp_nimble_mem.c b/lib/libesp32_div/NimBLE-Arduino/src/port/src/esp_nimble_mem.c similarity index 96% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/port/src/esp_nimble_mem.c rename to lib/libesp32_div/NimBLE-Arduino/src/port/src/esp_nimble_mem.c index 21e22fd26..a26e9b2f4 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/port/src/esp_nimble_mem.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/port/src/esp_nimble_mem.c @@ -18,12 +18,11 @@ * specific language governing permissions and limitations * under the License. */ -#ifdef ESP_PLATFORM #include "esp_attr.h" #include "esp_heap_caps.h" #include "nimconfig.h" -#include "../include/esp_nimble_mem.h" +#include "esp_nimble_mem.h" IRAM_ATTR void *nimble_platform_mem_malloc(size_t size) { @@ -55,4 +54,3 @@ IRAM_ATTR void nimble_platform_mem_free(void *ptr) { heap_caps_free(ptr); } -#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/include/nimble/nimble_port.h b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/include/nimble/nimble_port.h new file mode 100644 index 000000000..fe9592764 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/include/nimble/nimble_port.h @@ -0,0 +1,48 @@ +/* + * 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 _NIMBLE_PORT_H +#define _NIMBLE_PORT_H + +#include "nimble/nimble_npl.h" + +#define NIMBLE_CORE (CONFIG_BT_NIMBLE_PINNED_TO_CORE < portNUM_PROCESSORS ? CONFIG_BT_NIMBLE_PINNED_TO_CORE : tskNO_AFFINITY) +#define NIMBLE_STACK_SIZE CONFIG_BT_NIMBLE_TASK_STACK_SIZE + +#ifdef __cplusplus +extern "C" { +#endif + +void nimble_port_init(void); +void nimble_port_deinit(void); + +void nimble_port_run(void); +int nimble_port_stop(void); + +struct ble_npl_eventq *nimble_port_get_dflt_eventq(void); + +#if NIMBLE_CFG_CONTROLLER +void nimble_port_ll_task_func(void *arg); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _NIMBLE_PORT_H */ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/endian.c b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/endian.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/endian.c rename to lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/endian.c index c1b181dfe..2afd6a22e 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/endian.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/endian.c @@ -17,7 +17,7 @@ * under the License. */ -#include "../include/os/endian.h" +#include "os/endian.h" void put_le16(void *buf, uint16_t x) diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/hal_timer.c b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/hal_timer.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/hal_timer.c rename to lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/hal_timer.c index 93dfc8df3..14f746e85 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/hal_timer.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/hal_timer.c @@ -16,15 +16,14 @@ * specific language governing permissions and limitations * under the License. */ -#ifndef ESP_PLATFORM - +#if 0 #include #include #include #include -#include "../include/os/os.h" -#include "nrf.h" -#include "../include/hal/hal_timer.h" +#include "os/os.h" +#include "nrfx.h" +#include "hal/hal_timer.h" /* IRQ prototype */ typedef void (*hal_timer_irq_handler_t)(void); @@ -487,7 +486,9 @@ hal_timer_init(int timer_num, void *cfg) /* Disable IRQ, set priority and set vector in table */ NVIC_DisableIRQ(irq_num); +#ifndef RIOT_VERSION NVIC_SetPriority(irq_num, (1 << __NVIC_PRIO_BITS) - 1); +#endif #if MYNEWT NVIC_SetVector(irq_num, (uint32_t)irq_isr); #else diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/mem.c b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/mem.c similarity index 96% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/mem.c rename to lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/mem.c index bf1ae7ee3..256632333 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/mem.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/mem.c @@ -18,12 +18,9 @@ */ #include -#include "../include/os/os.h" -#include "../include/mem/mem.h" - -#ifdef ESP_PLATFORM -#include "nimble/esp_port/port/include/esp_nimble_mem.h" -#endif +#include "os/os.h" +#include "mem/mem.h" +#include "esp_nimble_mem.h" /** * Generic mempool allocation function. Used with basic and extended mempools. @@ -35,11 +32,7 @@ mem_malloc_mempool_gen(uint16_t num_blocks, uint32_t block_size, block_size = OS_ALIGN(block_size, OS_ALIGNMENT); if (num_blocks > 0) { -#ifdef ESP_PLATFORM *out_buf = nimble_platform_mem_malloc(OS_MEMPOOL_BYTES(num_blocks, block_size)); -#else - *out_buf = malloc(OS_MEMPOOL_BYTES(num_blocks, block_size)); -#endif if (*out_buf == NULL) { return OS_ENOMEM; } @@ -80,11 +73,7 @@ mem_malloc_mempool(struct os_mempool *mempool, uint16_t num_blocks, rc = os_mempool_init(mempool, num_blocks, block_size, buf, name); if (rc != 0) { -#ifdef ESP_PLATFORM nimble_platform_mem_free(buf); -#else - free(buf); -#endif return rc; } @@ -125,11 +114,7 @@ mem_malloc_mempool_ext(struct os_mempool_ext *mpe, uint16_t num_blocks, rc = os_mempool_ext_init(mpe, num_blocks, block_size, buf, name); if (rc != 0) { -#ifdef ESP_PLATFORM nimble_platform_mem_free(buf); -#else - free(buf); -#endif return rc; } @@ -176,11 +161,7 @@ mem_malloc_mbuf_pool(struct os_mempool *mempool, rc = os_mbuf_pool_init(mbuf_pool, mempool, block_size, num_blocks); if (rc != 0) { -#ifdef ESP_PLATFORM nimble_platform_mem_free(buf); -#else - free(buf); -#endif return rc; } diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/nimble_port.c b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/nimble_port.c similarity index 90% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/nimble_port.c rename to lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/nimble_port.c index 98902ce60..5cd377582 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/nimble_port.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/nimble_port.c @@ -18,13 +18,12 @@ */ #include -#include "../include/os/os.h" -#include "../include/sysinit/sysinit.h" -#include "nimble/nimble/host/include/host/ble_hs.h" -#include "../include/nimble/nimble_port.h" - +#include "os/os.h" +#include "sysinit/sysinit.h" +#include "host/ble_hs.h" +#include "nimble/nimble_port.h" #if NIMBLE_CFG_CONTROLLER -#include "nimble/nimble/controller/include/controller/ble_ll.h" +#include "controller/ble_ll.h" #endif #ifdef ESP_PLATFORM #include "esp_log.h" @@ -39,9 +38,12 @@ void nimble_port_init(void) { void os_msys_init(void); - + void ble_store_ram_init(void); #if NIMBLE_CFG_CONTROLLER void ble_hci_ram_init(void); +#endif +#ifdef ESP_PLATFORM + esp_log_level_set("NimBLE", LOG_LOCAL_LEVEL); #endif /* Initialize default event queue */ ble_npl_eventq_init(&g_eventq_dflt); @@ -50,13 +52,13 @@ nimble_port_init(void) ble_hs_init(); + /* XXX Need to have template for store */ + ble_store_ram_init(); + #if NIMBLE_CFG_CONTROLLER hal_timer_init(5, NULL); - os_cputime_init(32768); - ble_ll_init(); - ble_hci_ram_init(); #endif } diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/os_cputime.c b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/os_cputime.c similarity index 96% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/os_cputime.c rename to lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/os_cputime.c index 5c418c6a8..6c95c4f19 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/os_cputime.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/os_cputime.c @@ -20,9 +20,9 @@ #include #include #include -#include "../include/syscfg/syscfg.h" -#include "../include/os/os_cputime.h" -#include "../include/hal/hal_timer.h" +#include "syscfg/syscfg.h" +#include "os/os_cputime.h" +#include "hal/hal_timer.h" #if defined(OS_CPUTIME_FREQ_HIGH) struct os_cputime_data g_os_cputime; diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/os_cputime_pwr2.c b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/os_cputime_pwr2.c similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/os_cputime_pwr2.c rename to lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/os_cputime_pwr2.c index 7a17aabc5..1567070ae 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/os_cputime_pwr2.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/os_cputime_pwr2.c @@ -17,7 +17,7 @@ * under the License. */ -#include "../include/os/os_cputime.h" +#include "os/os_cputime.h" /** * This module implements cputime functionality for timers for which: diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/os_mbuf.c b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/os_mbuf.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/os_mbuf.c rename to lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/os_mbuf.c index 426bd47d8..ed18405b8 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/os_mbuf.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/os_mbuf.c @@ -33,7 +33,7 @@ * */ -#include "../include/os/os.h" +#include "os/os.h" #include #include diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/os_mempool.c b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/os_mempool.c similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/os_mempool.c rename to lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/os_mempool.c index a26099ef0..ba837e7d6 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/os_mempool.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/os_mempool.c @@ -17,7 +17,7 @@ * under the License. */ -#include "../include/os/os.h" +#include "os/os.h" #include #include diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/os_msys_init.c b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/os_msys_init.c similarity index 90% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/os_msys_init.c rename to lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/os_msys_init.c index 180e18d60..905e7bd09 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/src/os_msys_init.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/porting/nimble/src/os_msys_init.c @@ -18,12 +18,9 @@ */ #include -#include "../include/os/os.h" -#include "../include/mem/mem.h" - -#ifdef ESP_PLATFORM -#include "nimble/esp_port/port/include/esp_nimble_mem.h" -#endif +#include "os/os.h" +#include "mem/mem.h" +#include "esp_nimble_mem.h" #if MYNEWT_VAL(MSYS_1_BLOCK_COUNT) > 0 #define SYSINIT_MSYS_1_MEMBLOCK_SIZE \ @@ -31,11 +28,7 @@ #define SYSINIT_MSYS_1_MEMPOOL_SIZE \ OS_MEMPOOL_SIZE(MYNEWT_VAL(MSYS_1_BLOCK_COUNT), \ SYSINIT_MSYS_1_MEMBLOCK_SIZE) -#ifdef ESP_PLATFORM static os_membuf_t *os_msys_init_1_data; -#else -static os_membuf_t os_msys_init_1_data[SYSINIT_MSYS_1_MEMPOOL_SIZE]; -#endif static struct os_mbuf_pool os_msys_init_1_mbuf_pool; static struct os_mempool os_msys_init_1_mempool; #endif @@ -46,11 +39,7 @@ static struct os_mempool os_msys_init_1_mempool; #define SYSINIT_MSYS_2_MEMPOOL_SIZE \ OS_MEMPOOL_SIZE(MYNEWT_VAL(MSYS_2_BLOCK_COUNT), \ SYSINIT_MSYS_2_MEMBLOCK_SIZE) -#ifdef ESP_PLATFORM static os_membuf_t *os_msys_init_2_data; -#else -static os_membuf_t os_msys_init_2_data[SYSINIT_MSYS_2_MEMPOOL_SIZE]; -#endif static struct os_mbuf_pool os_msys_init_2_mbuf_pool; static struct os_mempool os_msys_init_2_mempool; #endif @@ -70,7 +59,6 @@ os_msys_init_once(void *data, struct os_mempool *mempool, assert(rc == 0); } -#ifdef ESP_PLATFORM int os_msys_buf_alloc(void) { @@ -105,7 +93,6 @@ os_msys_buf_free(void) #endif } -#endif void os_msys_init(void) diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/npl/freertos/src/nimble_port_freertos.c b/lib/libesp32_div/NimBLE-Arduino/src/porting/npl/freertos/src/nimble_port_freertos.c similarity index 61% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/npl/freertos/src/nimble_port_freertos.c rename to lib/libesp32_div/NimBLE-Arduino/src/porting/npl/freertos/src/nimble_port_freertos.c index a674e2a56..f0f80561f 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/npl/freertos/src/nimble_port_freertos.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/porting/npl/freertos/src/nimble_port_freertos.c @@ -20,24 +20,11 @@ #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" -#include "../../../nimble/include/nimble/nimble_port.h" +#include "nimble/nimble_port.h" #if NIMBLE_CFG_CONTROLLER -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -#define NIMBLE_LL_TASK_STACK_SIZE (120) -#else -#define NIMBLE_LL_TASK_STACK_SIZE (90) -#endif -static StackType_t ll_xStack[ NIMBLE_LL_TASK_STACK_SIZE ]; -static StaticTask_t ll_xTaskBuffer; static TaskHandle_t ll_task_h; #endif - -#ifndef ESP_PLATFORM -static StackType_t hs_xStack[ NIMBLE_HS_TASK_STACK_SIZE ]; -static StaticTask_t hs_xTaskBuffer; -#endif - static TaskHandle_t host_task_h; void @@ -50,8 +37,8 @@ nimble_port_freertos_init(TaskFunction_t host_task_fn) * provided by NimBLE and in case of FreeRTOS it does not need to be wrapped * since it has compatible prototype. */ - ll_task_h = xTaskCreateStatic(nimble_port_ll_task_func, "ll", NIMBLE_LL_TASK_STACK_SIZE, - NULL, configMAX_PRIORITIES, ll_xStack, &ll_xTaskBuffer); + xTaskCreate(nimble_port_ll_task_func, "ll", configMINIMAL_STACK_SIZE + 400, + NULL, configMAX_PRIORITIES - 1, &ll_task_h); #endif /* @@ -59,13 +46,8 @@ nimble_port_freertos_init(TaskFunction_t host_task_fn) * have separate task for NimBLE host, but since something needs to handle * default queue it is just easier to make separate task which does this. */ -#ifdef ESP_PLATFORM xTaskCreatePinnedToCore(host_task_fn, "ble", NIMBLE_STACK_SIZE, - NULL, (configMAX_PRIORITIES - 4), &host_task_h, NIMBLE_CORE); -#else - host_task_h = xTaskCreateStatic(host_task_fn, "ble", NIMBLE_HS_TASK_STACK_SIZE, - NULL, (configMAX_PRIORITIES - 1), hs_xStack, &hs_xTaskBuffer); -#endif + NULL, (configMAX_PRIORITIES - 4), &host_task_h, NIMBLE_CORE); } void @@ -75,17 +57,3 @@ nimble_port_freertos_deinit(void) vTaskDelete(host_task_h); } } - -#if NIMBLE_CFG_CONTROLLER -UBaseType_t -nimble_port_freertos_get_ll_hwm(void) -{ - return uxTaskGetStackHighWaterMark(ll_task_h); -} -#endif - -UBaseType_t -nimble_port_freertos_get_hs_hwm(void) -{ - return uxTaskGetStackHighWaterMark(host_task_h); -} diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/npl/freertos/src/npl_os_freertos.c b/lib/libesp32_div/NimBLE-Arduino/src/porting/npl/freertos/src/npl_os_freertos.c similarity index 67% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/npl/freertos/src/npl_os_freertos.c rename to lib/libesp32_div/NimBLE-Arduino/src/porting/npl/freertos/src/npl_os_freertos.c index 3f9c530e4..458180f83 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/npl/freertos/src/npl_os_freertos.c +++ b/lib/libesp32_div/NimBLE-Arduino/src/porting/npl/freertos/src/npl_os_freertos.c @@ -20,22 +20,11 @@ #include #include #include - -#include "nimble/nimble/include/nimble/nimble_npl.h" - -#ifdef ESP_PLATFORM +#include "nimble/nimble_npl.h" #include "freertos/portable.h" + portMUX_TYPE ble_port_mutex = portMUX_INITIALIZER_UNLOCKED; -#else -#include "nrf.h" - -static void *radio_isr_addr; -static void *rng_isr_addr; -static void *rtc0_isr_addr; -#endif - -#ifdef ESP_PLATFORM static inline bool in_isr(void) { @@ -43,50 +32,6 @@ in_isr(void) return xPortInIsrContext() != 0; } -#else -static inline bool -in_isr(void) -{ - /* XXX hw specific! */ - return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0; -} - -void -RADIO_IRQHandler(void) -{ - ((void (*)(void))radio_isr_addr)(); -} - -void -RNG_IRQHandler(void) -{ - ((void (*)(void))rng_isr_addr)(); -} - -void -RTC0_IRQHandler(void) -{ - ((void (*)(void))rtc0_isr_addr)(); -} - -/* This is called by NimBLE radio driver to set interrupt handlers */ -void -npl_freertos_hw_set_isr(int irqn, void (*addr)(void)) -{ - switch (irqn) { - case RADIO_IRQn: - radio_isr_addr = addr; - break; - case RNG_IRQn: - rng_isr_addr = addr; - break; - case RTC0_IRQn: - rtc0_isr_addr = addr; - break; - } -} -#endif - struct ble_npl_event * npl_freertos_eventq_get(struct ble_npl_eventq *evq, ble_npl_time_t tmo) { @@ -97,13 +42,9 @@ npl_freertos_eventq_get(struct ble_npl_eventq *evq, ble_npl_time_t tmo) if (in_isr()) { assert(tmo == 0); ret = xQueueReceiveFromISR(evq->q, &ev, &woken); -#ifdef ESP_PLATFORM if( woken == pdTRUE ) { portYIELD_FROM_ISR(); } -#else - portYIELD_FROM_ISR(woken); -#endif } else { ret = xQueueReceive(evq->q, &ev, tmo); } @@ -130,13 +71,9 @@ npl_freertos_eventq_put(struct ble_npl_eventq *evq, struct ble_npl_event *ev) if (in_isr()) { ret = xQueueSendToBackFromISR(evq->q, &ev, &woken); -#ifdef ESP_PLATFORM if( woken == pdTRUE ) { portYIELD_FROM_ISR(); } -#else - portYIELD_FROM_ISR(woken); -#endif } else { ret = xQueueSendToBack(evq->q, &ev, portMAX_DELAY); } @@ -183,20 +120,13 @@ npl_freertos_eventq_remove(struct ble_npl_eventq *evq, woken |= woken2; } -#ifdef ESP_PLATFORM if( woken == pdTRUE ) { portYIELD_FROM_ISR(); } -#else - portYIELD_FROM_ISR(woken); -#endif } else { -#ifdef ESP_PLATFORM portMUX_TYPE ble_npl_mut = portMUX_INITIALIZER_UNLOCKED; portENTER_CRITICAL(&ble_npl_mut); -#else - vPortEnterCritical(); -#endif + count = uxQueueMessagesWaiting(evq->q); for (i = 0; i < count; i++) { ret = xQueueReceive(evq->q, &tmp_ev, 0); @@ -209,11 +139,8 @@ npl_freertos_eventq_remove(struct ble_npl_eventq *evq, ret = xQueueSendToBack(evq->q, &tmp_ev, 0); assert(ret == pdPASS); } -#ifdef ESP_PLATFORM + portEXIT_CRITICAL(&ble_npl_mut); -#else - vPortExitCritical(); -#endif } ev->queued = 0; @@ -329,13 +256,9 @@ npl_freertos_sem_pend(struct ble_npl_sem *sem, ble_npl_time_t timeout) if (in_isr()) { assert(timeout == 0); ret = xSemaphoreTakeFromISR(sem->handle, &woken); -#ifdef ESP_PLATFORM if( woken == pdTRUE ) { portYIELD_FROM_ISR(); } -#else - portYIELD_FROM_ISR(woken); -#endif } else { ret = xSemaphoreTake(sem->handle, timeout); } @@ -357,13 +280,10 @@ npl_freertos_sem_release(struct ble_npl_sem *sem) if (in_isr()) { ret = xSemaphoreGiveFromISR(sem->handle, &woken); -#ifdef ESP_PLATFORM + if( woken == pdTRUE ) { portYIELD_FROM_ISR(); } -#else - portYIELD_FROM_ISR(woken); -#endif } else { ret = xSemaphoreGive(sem->handle); } @@ -372,38 +292,6 @@ npl_freertos_sem_release(struct ble_npl_sem *sem) return BLE_NPL_OK; } - -#if CONFIG_BT_NIMBLE_USE_ESP_TIMER -static void -ble_npl_event_fn_wrapper(void *arg) -{ - struct ble_npl_callout *co = (struct ble_npl_callout *)arg; - - if (co->evq) { - ble_npl_eventq_put(co->evq, &co->ev); - } else { - co->ev.fn(&co->ev); - } -} - -static -ble_npl_error_t esp_err_to_npl_error(esp_err_t err) -{ - switch(err) { - case ESP_ERR_INVALID_ARG: - return BLE_NPL_INVALID_PARAM; - - case ESP_ERR_INVALID_STATE: - return BLE_NPL_EINVAL; - - case ESP_OK: - return BLE_NPL_OK; - - default: - return BLE_NPL_ERROR; - } -} -#else static void os_callout_timer_cb(TimerHandle_t timer) { @@ -418,64 +306,31 @@ os_callout_timer_cb(TimerHandle_t timer) co->ev.fn(&co->ev); } } -#endif void npl_freertos_callout_init(struct ble_npl_callout *co, struct ble_npl_eventq *evq, - ble_npl_event_fn *ev_cb, void *ev_arg) + ble_npl_event_fn *ev_cb, void *ev_arg) { -#if CONFIG_BT_NIMBLE_USE_ESP_TIMER - co->ev.fn = ev_cb; - co->ev.arg = ev_arg; - co->evq = evq; - - esp_timer_create_args_t create_args = { - .callback = ble_npl_event_fn_wrapper, - .arg = co, - .name = "nimble_timer" - }; - - ESP_ERROR_CHECK(esp_timer_create(&create_args, &co->handle)); -#else if (co->handle == NULL) { co->handle = xTimerCreate("co", 1, pdFALSE, co, os_callout_timer_cb); } - co->evq = evq; ble_npl_event_init(&co->ev, ev_cb, ev_arg); -#endif } - void npl_freertos_callout_deinit(struct ble_npl_callout *co) { -#if CONFIG_BT_NIMBLE_USE_ESP_TIMER - ESP_ERROR_CHECK_WITHOUT_ABORT(esp_timer_stop(co->handle)); - ESP_ERROR_CHECK_WITHOUT_ABORT(esp_timer_delete(co->handle)); -#else if (co->handle) { xTimerDelete(co->handle, portMAX_DELAY); co->handle = NULL; } -#endif } ble_npl_error_t npl_freertos_callout_reset(struct ble_npl_callout *co, ble_npl_time_t ticks) { -#if CONFIG_BT_NIMBLE_USE_ESP_TIMER - esp_timer_stop(co->handle); - - return esp_err_to_npl_error(esp_timer_start_once(co->handle, ticks*1000)); -#else - BaseType_t woken1, woken2, woken3; - if (co->handle == NULL) { - co->handle = xTimerCreate("co", 1, pdFALSE, co, os_callout_timer_cb); - assert(co->handle); - } - if (ticks == 0) { ticks = 1; } @@ -484,13 +339,10 @@ npl_freertos_callout_reset(struct ble_npl_callout *co, ble_npl_time_t ticks) xTimerStopFromISR(co->handle, &woken1); xTimerChangePeriodFromISR(co->handle, ticks, &woken2); xTimerResetFromISR(co->handle, &woken3); -#ifdef ESP_PLATFORM + if( woken1 == pdTRUE || woken2 == pdTRUE || woken3 == pdTRUE) { portYIELD_FROM_ISR(); } -#else - portYIELD_FROM_ISR(woken1 || woken2 || woken3); -#endif } else { xTimerStop(co->handle, portMAX_DELAY); xTimerChangePeriod(co->handle, ticks, portMAX_DELAY); @@ -498,49 +350,6 @@ npl_freertos_callout_reset(struct ble_npl_callout *co, ble_npl_time_t ticks) } return BLE_NPL_OK; -#endif -} - -void -npl_freertos_callout_stop(struct ble_npl_callout *co) -{ -#if CONFIG_BT_NIMBLE_USE_ESP_TIMER - esp_timer_stop(co->handle); -#else - xTimerStop(co->handle, portMAX_DELAY); -#endif -} - -bool -npl_freertos_callout_is_active(struct ble_npl_callout *co) -{ -#if CONFIG_BT_NIMBLE_USE_ESP_TIMER - return esp_timer_is_active(co->handle); -#else - /* Workaround for bug in xTimerIsTimerActive with FreeRTOS V10.2.0, fixed in V10.4.4 - * See: https://github.com/FreeRTOS/FreeRTOS-Kernel/pull/305 - * Sometimes xTimerIsTimerActive returns pdTRUE even though the timer has expired, so we double check. - */ - return xTimerIsTimerActive(co->handle) == pdTRUE && xTimerGetExpiryTime(co->handle) > xTaskGetTickCountFromISR(); -#endif -} - -ble_npl_time_t -npl_freertos_callout_get_ticks(struct ble_npl_callout *co) -{ -#if CONFIG_BT_NIMBLE_USE_ESP_TIMER - /* Currently, esp_timer does not support an API which gets the expiry time for - * current timer. - * Returning 0 from here should not cause any effect. - * Drawback of this approach is that existing code to reset timer would be called - * more often (since the if condition to invoke reset timer would always succeed if - * timer is active). - */ - - return 0; -#else - return xTimerGetExpiryTime(co->handle); -#endif } ble_npl_time_t diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ans/include/services/ans/ble_svc_ans.h b/lib/libesp32_div/NimBLE-Arduino/src/services/ans/ble_svc_ans.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ans/include/services/ans/ble_svc_ans.h rename to lib/libesp32_div/NimBLE-Arduino/src/services/ans/ble_svc_ans.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/bas/include/services/bas/ble_svc_bas.h b/lib/libesp32_div/NimBLE-Arduino/src/services/bas/ble_svc_bas.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/bas/include/services/bas/ble_svc_bas.h rename to lib/libesp32_div/NimBLE-Arduino/src/services/bas/ble_svc_bas.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gap/include/services/gap/ble_svc_gap.h b/lib/libesp32_div/NimBLE-Arduino/src/services/gap/ble_svc_gap.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gap/include/services/gap/ble_svc_gap.h rename to lib/libesp32_div/NimBLE-Arduino/src/services/gap/ble_svc_gap.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gatt/include/services/gatt/ble_svc_gatt.h b/lib/libesp32_div/NimBLE-Arduino/src/services/gatt/ble_svc_gatt.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/gatt/include/services/gatt/ble_svc_gatt.h rename to lib/libesp32_div/NimBLE-Arduino/src/services/gatt/ble_svc_gatt.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ias/include/services/ias/ble_svc_ias.h b/lib/libesp32_div/NimBLE-Arduino/src/services/ias/ble_svc_ias.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ias/include/services/ias/ble_svc_ias.h rename to lib/libesp32_div/NimBLE-Arduino/src/services/ias/ble_svc_ias.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ipss/include/services/ipss/ble_svc_ipss.h b/lib/libesp32_div/NimBLE-Arduino/src/services/ipss/ble_svc_ipss.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/ipss/include/services/ipss/ble_svc_ipss.h rename to lib/libesp32_div/NimBLE-Arduino/src/services/ipss/ble_svc_ipss.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/lls/include/services/lls/ble_svc_lls.h b/lib/libesp32_div/NimBLE-Arduino/src/services/lls/ble_svc_lls.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/lls/include/services/lls/ble_svc_lls.h rename to lib/libesp32_div/NimBLE-Arduino/src/services/lls/ble_svc_lls.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/tps/include/services/tps/ble_svc_tps.h b/lib/libesp32_div/NimBLE-Arduino/src/services/tps/ble_svc_tps.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/services/tps/include/services/tps/ble_svc_tps.h rename to lib/libesp32_div/NimBLE-Arduino/src/services/tps/ble_svc_tps.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/src/ble_hs_hci_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/src/ble_hs_hci_priv.h new file mode 100644 index 000000000..362f12cbd --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/src/ble_hs_hci_priv.h @@ -0,0 +1,124 @@ +/* + * 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_HS_HCI_PRIV_ +#define H_BLE_HS_HCI_PRIV_ + +#include "nimble/hci_common.h" +#ifdef __cplusplus +extern "C" { +#endif + +struct ble_hs_conn; +struct os_mbuf; + +#define BLE_HS_HCI_LE_FEAT_ENCRYPTION (0x00000001) +#define BLE_HS_HCI_LE_FEAT_CONN_PARAM_REQUEST (0x00000002) +#define BLE_HS_HCI_LE_FEAT_EXT_REJECT (0x00000004) +#define BLE_HS_HCI_LE_FEAT_SLAVE_FEAT_EXCHANGE (0x00000008) +#define BLE_HS_HCI_LE_FEAT_PING (0x00000010) +#define BLE_HS_HCI_LE_FEAT_DATA_PACKET_LENGTH_EXT (0x00000020) +#define BLE_HS_HCI_LE_FEAT_LL_PRIVACY (0x00000040) +#define BLE_HS_HCI_LE_FEAT_EXT_SCANNER_FILTER_POLICIES (0x00000080) +#define BLE_HS_HCI_LE_FEAT_2M_PHY (0x00000100) +#define BLE_HS_HCI_LE_FEAT_STABLE_MOD_INDEX_TX (0x00000200) +#define BLE_HS_HCI_LE_FEAT_STABLE_MOD_INDEX_RX (0x00000400) +#define BLE_HS_HCI_LE_FEAT_CODED_PHY (0x00000800) +#define BLE_HS_HCI_LE_FEAT_EXT_ADV (0x00001000) +#define BLE_HS_HCI_LE_FEAT_PERIODIC_ADV (0x00002000) +#define BLE_HS_HCI_LE_FEAT_CSA2 (0x00004000) +#define BLE_HS_HCI_LE_FEAT_POWER_CLASS_1 (0x00008000) +#define BLE_HS_HCI_LE_FEAT_MIN_NUM_USED_CHAN (0x00010000) + +struct ble_hs_hci_ack { + int bha_status; /* A BLE_HS_E<...> error; NOT a naked HCI code. */ + const uint8_t *bha_params; + int bha_params_len; + uint16_t bha_opcode; + uint8_t bha_hci_handle; +}; + +#if MYNEWT_VAL(BLE_EXT_ADV) +struct ble_hs_hci_ext_scan_param { + uint8_t scan_type; + uint16_t scan_itvl; + uint16_t scan_window; +}; + +struct ble_hs_hci_ext_conn_params { + uint16_t scan_itvl; + uint16_t scan_window; + uint16_t conn_itvl; + uint16_t conn_windows; +}; + +#if MYNEWT_VAL(BLE_PERIODIC_ADV) +/* Periodic Advertising Parameters */ +struct hci_periodic_adv_params +{ + uint16_t min_interval; + uint16_t max_interval; + uint16_t properties; +}; +#endif +#endif + +extern uint16_t ble_hs_hci_avail_pkts; + +int ble_hs_hci_cmd_tx(uint16_t opcode, const void *cmd, uint8_t cmd_len, + void *rsp, uint8_t rsp_len); +void ble_hs_hci_init(void); +void ble_hs_hci_deinit(void); + +void ble_hs_hci_set_le_supported_feat(uint32_t feat); +uint32_t ble_hs_hci_get_le_supported_feat(void); +void ble_hs_hci_set_hci_version(uint8_t hci_version); +uint8_t ble_hs_hci_get_hci_version(void); + +#if MYNEWT_VAL(BLE_HS_PHONY_HCI_ACKS) +typedef int ble_hs_hci_phony_ack_fn(uint8_t *ack, int ack_buf_len); +void ble_hs_hci_set_phony_ack_cb(ble_hs_hci_phony_ack_fn *cb); +#endif + +int ble_hs_hci_util_read_adv_tx_pwr(int8_t *out_pwr); +int ble_hs_hci_util_rand(void *dst, int len); +int ble_hs_hci_util_read_rssi(uint16_t conn_handle, int8_t *out_rssi); +int ble_hs_hci_util_set_random_addr(const uint8_t *addr); +int ble_hs_hci_util_data_hdr_strip(struct os_mbuf *om, + struct hci_data_hdr *out_hdr); +int ble_hs_hci_evt_process(const struct ble_hci_ev *ev); + +int ble_hs_hci_cmd_send_buf(uint16_t opcode, const void *buf, uint8_t buf_len); +int ble_hs_hci_set_buf_sz(uint16_t pktlen, uint16_t max_pkts); +void ble_hs_hci_add_avail_pkts(uint16_t delta); + +uint16_t ble_hs_hci_util_handle_pb_bc_join(uint16_t handle, uint8_t pb, + uint8_t bc); + +int ble_hs_hci_acl_tx_now(struct ble_hs_conn *conn, struct os_mbuf **om); +int ble_hs_hci_acl_tx(struct ble_hs_conn *conn, struct os_mbuf **om); + +int ble_hs_hci_frag_num_mbufs(void); +int ble_hs_hci_frag_num_mbufs_free(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/src/ble_sm_priv.h b/lib/libesp32_div/NimBLE-Arduino/src/src/ble_sm_priv.h new file mode 100644 index 000000000..def0a32f5 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/src/ble_sm_priv.h @@ -0,0 +1,428 @@ +/* + * 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_SM_PRIV_ +#define H_BLE_SM_PRIV_ + +#include +#include "syscfg/syscfg.h" +#include "os/queue.h" +#include "nimble/nimble_opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct ble_gap_sec_state; +struct hci_le_lt_key_req; +struct hci_encrypt_change; + +#define BLE_SM_MTU 65 + +#define BLE_SM_OP_PAIR_REQ 0x01 +#define BLE_SM_OP_PAIR_RSP 0x02 +#define BLE_SM_OP_PAIR_CONFIRM 0x03 +#define BLE_SM_OP_PAIR_RANDOM 0x04 +#define BLE_SM_OP_PAIR_FAIL 0x05 +#define BLE_SM_OP_ENC_INFO 0x06 +#define BLE_SM_OP_MASTER_ID 0x07 +#define BLE_SM_OP_IDENTITY_INFO 0x08 +#define BLE_SM_OP_IDENTITY_ADDR_INFO 0x09 +#define BLE_SM_OP_SIGN_INFO 0x0a +#define BLE_SM_OP_SEC_REQ 0x0b +#define BLE_SM_OP_PAIR_PUBLIC_KEY 0x0c +#define BLE_SM_OP_PAIR_DHKEY_CHECK 0x0d +#define BLE_SM_OP_PAIR_KEYPRESS_NOTIFY 0x0e + +struct ble_sm_hdr { + uint8_t opcode; + uint8_t data[0]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x01/0x02 [req/rsp]) | 1 | + * | IO Capability | 1 | + * | OOB data flag | 1 | + * | AuthReq | 1 | + * | Maximum Encryption Key Size | 1 | + * | Initiator Key Distribution | 1 | + * | Responder Key Distribution | 1 | + */ + +struct ble_sm_pair_cmd { + uint8_t io_cap; + uint8_t oob_data_flag; + uint8_t authreq; + uint8_t max_enc_key_size; + uint8_t init_key_dist; + uint8_t resp_key_dist; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x03) | 1 | + * | Confirm Value | 16 | + */ + +struct ble_sm_pair_confirm { + uint8_t value[16]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x04) | 1 | + * | Random Value | 16 | + */ +struct ble_sm_pair_random { + uint8_t value[16]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x05) | 1 | + * | Reason | 1 | + */ +struct ble_sm_pair_fail { + uint8_t reason; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x06) | 1 | + * | ltk | 16 | + */ +struct ble_sm_enc_info { + uint8_t ltk[16]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x07) | 1 | + * | EDIV | 2 | + * | RAND | 8 | + */ +struct ble_sm_master_id { + uint16_t ediv; + uint64_t rand_val; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x08) | 1 | + * | irk | 16 | + */ +struct ble_sm_id_info { + uint8_t irk[16]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x09) | 1 | + * | addr_type | 1 | + * | address | 6 | + */ +struct ble_sm_id_addr_info { + uint8_t addr_type; + uint8_t bd_addr[6]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x0A) | 1 | + * | csrk | 16 | + */ +struct ble_sm_sign_info { + uint8_t sig_key[16]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x0B) | 1 | + * | authreq | 1 | + */ +struct ble_sm_sec_req { + uint8_t authreq; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x0c) | 1 | + * | Public Key X | 32 | + * | Public Key Y | 32 | + */ +struct ble_sm_public_key { + uint8_t x[32]; + uint8_t y[32]; +} __attribute__((packed)); + +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | (Code=0x0d) | 1 | + * | DHKey Check | 16 | + */ +struct ble_sm_dhkey_check { + uint8_t value[16]; +} __attribute__((packed)); + +#if NIMBLE_BLE_SM + +#define BLE_SM_PROC_STATE_NONE ((uint8_t)-1) + +#define BLE_SM_PROC_STATE_PAIR 0 +#define BLE_SM_PROC_STATE_CONFIRM 1 +#define BLE_SM_PROC_STATE_RANDOM 2 +#define BLE_SM_PROC_STATE_LTK_START 3 +#define BLE_SM_PROC_STATE_LTK_RESTORE 4 +#define BLE_SM_PROC_STATE_ENC_START 5 +#define BLE_SM_PROC_STATE_ENC_RESTORE 6 +#define BLE_SM_PROC_STATE_KEY_EXCH 7 +#define BLE_SM_PROC_STATE_SEC_REQ 8 +#define BLE_SM_PROC_STATE_PUBLIC_KEY 9 +#define BLE_SM_PROC_STATE_DHKEY_CHECK 10 +#define BLE_SM_PROC_STATE_CNT 11 + +#define BLE_SM_PROC_F_INITIATOR 0x01 +#define BLE_SM_PROC_F_IO_INJECTED 0x02 +#define BLE_SM_PROC_F_ADVANCE_ON_IO 0x04 +#define BLE_SM_PROC_F_AUTHENTICATED 0x08 +#define BLE_SM_PROC_F_SC 0x10 +#define BLE_SM_PROC_F_BONDING 0x20 + +#define BLE_SM_KE_F_ENC_INFO 0x01 +#define BLE_SM_KE_F_MASTER_ID 0x02 +#define BLE_SM_KE_F_ID_INFO 0x04 +#define BLE_SM_KE_F_ADDR_INFO 0x08 +#define BLE_SM_KE_F_SIGN_INFO 0x10 + +typedef uint8_t ble_sm_proc_flags; + +struct ble_sm_keys { + unsigned ltk_valid:1; + unsigned ediv_rand_valid:1; + unsigned irk_valid:1; + unsigned csrk_valid:1; + unsigned addr_valid:1; + uint16_t ediv; + uint64_t rand_val; + uint8_t addr_type; + uint8_t key_size; + uint8_t ltk[16]; /* Little endian. */ + uint8_t irk[16]; /* Little endian. */ + uint8_t csrk[16]; /* Little endian. */ + uint8_t addr[6]; /* Little endian. */ +}; + +struct ble_sm_proc { + STAILQ_ENTRY(ble_sm_proc) next; + + ble_npl_time_t exp_os_ticks; + ble_sm_proc_flags flags; + uint16_t conn_handle; + uint8_t pair_alg; + uint8_t state; + uint8_t rx_key_flags; + uint8_t key_size; + + uint8_t pair_req[sizeof(struct ble_sm_hdr) + sizeof(struct ble_sm_pair_cmd)]; + uint8_t pair_rsp[sizeof(struct ble_sm_hdr) + sizeof(struct ble_sm_pair_cmd)]; + uint8_t tk[16]; + uint8_t confirm_peer[16]; + uint8_t randm[16]; + uint8_t rands[16]; + uint8_t ltk[16]; /* Little endian. */ + struct ble_sm_keys our_keys; + struct ble_sm_keys peer_keys; + +#if MYNEWT_VAL(BLE_SM_SC) + /* Secure connections. */ + uint8_t passkey_bits_exchanged; + uint8_t ri; + struct ble_sm_public_key pub_key_peer; + uint8_t mackey[16]; + uint8_t dhkey[32]; + const struct ble_sm_sc_oob_data *oob_data_local; + const struct ble_sm_sc_oob_data *oob_data_remote; +#endif +}; + +struct ble_sm_result { + int app_status; + uint8_t sm_err; + struct ble_gap_passkey_params passkey_params; + void *state_arg; + unsigned execute : 1; + unsigned enc_cb : 1; + unsigned bonded : 1; + unsigned restore : 1; +}; + +#if MYNEWT_VAL(BLE_HS_DEBUG) +void ble_sm_dbg_set_next_pair_rand(uint8_t *next_pair_rand); +void ble_sm_dbg_set_next_ediv(uint16_t next_ediv); +void ble_sm_dbg_set_next_master_id_rand(uint64_t next_master_id_rand); +void ble_sm_dbg_set_next_ltk(uint8_t *next_ltk); +void ble_sm_dbg_set_next_csrk(uint8_t *next_csrk); +void ble_sm_dbg_set_sc_keys(uint8_t *pubkey, uint8_t *privkey); +#endif + +int ble_sm_num_procs(void); + +int ble_sm_alg_s1(const uint8_t *k, const uint8_t *r1, const uint8_t *r2, + uint8_t *out); +int ble_sm_alg_c1(const uint8_t *k, const uint8_t *r, + const uint8_t *preq, const uint8_t *pres, + uint8_t iat, uint8_t rat, + const uint8_t *ia, const uint8_t *ra, + uint8_t *out_enc_data); +int ble_sm_alg_f4(const uint8_t *u, const uint8_t *v, const uint8_t *x, + uint8_t z, uint8_t *out_enc_data); +int ble_sm_alg_g2(const uint8_t *u, const uint8_t *v, const uint8_t *x, + const uint8_t *y, uint32_t *passkey); +int ble_sm_alg_f5(const uint8_t *w, const uint8_t *n1, const uint8_t *n2, + uint8_t a1t, const uint8_t *a1, uint8_t a2t, + const uint8_t *a2, uint8_t *mackey, uint8_t *ltk); +int ble_sm_alg_f6(const uint8_t *w, const uint8_t *n1, const uint8_t *n2, + const uint8_t *r, const uint8_t *iocap, uint8_t a1t, + const uint8_t *a1, uint8_t a2t, const uint8_t *a2, + uint8_t *check); +int ble_sm_alg_gen_dhkey(const uint8_t *peer_pub_key_x, + const uint8_t *peer_pub_key_y, + const uint8_t *our_priv_key, uint8_t *out_dhkey); +int ble_sm_alg_gen_key_pair(uint8_t *pub, uint8_t *priv); +void ble_sm_alg_ecc_init(void); + +void ble_sm_enc_change_rx(const struct ble_hci_ev_enrypt_chg *ev); +void ble_sm_enc_key_refresh_rx(const struct ble_hci_ev_enc_key_refresh *ev); +int ble_sm_ltk_req_rx(const struct ble_hci_ev_le_subev_lt_key_req *ev); + +#if MYNEWT_VAL(BLE_SM_LEGACY) +int ble_sm_lgcy_io_action(struct ble_sm_proc *proc, uint8_t *action); +void ble_sm_lgcy_confirm_exec(struct ble_sm_proc *proc, + struct ble_sm_result *res); +void ble_sm_lgcy_random_exec(struct ble_sm_proc *proc, + struct ble_sm_result *res); +void ble_sm_lgcy_random_rx(struct ble_sm_proc *proc, + struct ble_sm_result *res); +#else +#define ble_sm_lgcy_io_action(proc, action) (BLE_HS_ENOTSUP) +#define ble_sm_lgcy_confirm_exec(proc, res) +#define ble_sm_lgcy_random_exec(proc, res) +#define ble_sm_lgcy_random_rx(proc, res) +#endif + +#if MYNEWT_VAL(BLE_SM_SC) +int ble_sm_sc_io_action(struct ble_sm_proc *proc, uint8_t *action); +void ble_sm_sc_confirm_exec(struct ble_sm_proc *proc, + struct ble_sm_result *res); +void ble_sm_sc_random_exec(struct ble_sm_proc *proc, + struct ble_sm_result *res); +void ble_sm_sc_random_rx(struct ble_sm_proc *proc, struct ble_sm_result *res); +void ble_sm_sc_public_key_exec(struct ble_sm_proc *proc, + struct ble_sm_result *res, + void *arg); +void ble_sm_sc_public_key_rx(uint16_t conn_handle, struct os_mbuf **rxom, + struct ble_sm_result *res); +void ble_sm_sc_dhkey_check_exec(struct ble_sm_proc *proc, + struct ble_sm_result *res, void *arg); +void ble_sm_sc_dhkey_check_rx(uint16_t conn_handle, struct os_mbuf **rxom, + struct ble_sm_result *res); +bool ble_sm_sc_oob_data_check(struct ble_sm_proc *proc, + bool oob_data_local_present, + bool oob_data_remote_present); +void ble_sm_sc_oob_confirm(struct ble_sm_proc *proc, struct ble_sm_result *res); +void ble_sm_sc_init(void); +#else +#define ble_sm_sc_io_action(proc, action) (BLE_HS_ENOTSUP) +#define ble_sm_sc_confirm_exec(proc, res) +#define ble_sm_sc_random_exec(proc, res) +#define ble_sm_sc_random_rx(proc, res) +#define ble_sm_sc_public_key_exec(proc, res, arg) +#define ble_sm_sc_public_key_rx(conn_handle, op, om, res) +#define ble_sm_sc_dhkey_check_exec(proc, res, arg) +#define ble_sm_sc_dhkey_check_rx(conn_handle, op, om, res) +#define ble_sm_sc_init() + +#endif + +struct ble_sm_proc *ble_sm_proc_find(uint16_t conn_handle, uint8_t state, + int is_initiator, + struct ble_sm_proc **out_prev); +int ble_sm_gen_pair_rand(uint8_t *pair_rand); +uint8_t *ble_sm_our_pair_rand(struct ble_sm_proc *proc); +uint8_t *ble_sm_peer_pair_rand(struct ble_sm_proc *proc); +int ble_sm_ioact_state(uint8_t action); +int ble_sm_proc_can_advance(struct ble_sm_proc *proc); +void ble_sm_process_result(uint16_t conn_handle, struct ble_sm_result *res); +void ble_sm_confirm_advance(struct ble_sm_proc *proc); +void ble_sm_ia_ra(struct ble_sm_proc *proc, + uint8_t *out_iat, uint8_t *out_ia, + uint8_t *out_rat, uint8_t *out_ra); + +int32_t ble_sm_timer(void); +void ble_sm_connection_broken(uint16_t conn_handle); +int ble_sm_pair_initiate(uint16_t conn_handle); +int ble_sm_slave_initiate(uint16_t conn_handle); +int ble_sm_enc_initiate(uint16_t conn_handle, uint8_t key_size, + const uint8_t *ltk, uint16_t ediv, + uint64_t rand_val, int auth); +int ble_sm_alg_encrypt(const uint8_t *key, const uint8_t *plaintext, + uint8_t *enc_data); +int ble_sm_init(void); +#else + +#define ble_sm_enc_change_rx(evt) ((void)(evt)) +#define ble_sm_ltk_req_rx(evt) ((void)(evt)) +#define ble_sm_enc_key_refresh_rx(evt) ((void)(evt)) + +#define ble_sm_timer() BLE_HS_FOREVER +#define ble_sm_connection_broken(conn_handle) +#define ble_sm_pair_initiate(conn_handle) BLE_HS_ENOTSUP +#define ble_sm_slave_initiate(conn_handle) BLE_HS_ENOTSUP +#define ble_sm_enc_initiate(conn_handle, keysize, ltk, ediv, rand_val, auth) \ + BLE_HS_ENOTSUP + +#define ble_sm_init() 0 + +#define ble_sm_alg_encrypt(key, plaintext, enc_data) \ + BLE_HS_ENOTSUP + +#endif + +struct ble_l2cap_chan *ble_sm_create_chan(uint16_t handle); +void *ble_sm_cmd_get(uint8_t opcode, size_t len, struct os_mbuf **txom); +int ble_sm_tx(uint16_t conn_handle, struct os_mbuf *txom); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/stats/stats.h b/lib/libesp32_div/NimBLE-Arduino/src/stats/stats.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/stats/stats.h rename to lib/libesp32_div/NimBLE-Arduino/src/stats/stats.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/include/store/config/ble_store_config.h b/lib/libesp32_div/NimBLE-Arduino/src/store/config/ble_store_config.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/nimble/host/store/config/include/store/config/ble_store_config.h rename to lib/libesp32_div/NimBLE-Arduino/src/store/config/ble_store_config.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/store/ram/ble_store_ram.h b/lib/libesp32_div/NimBLE-Arduino/src/store/ram/ble_store_ram.h new file mode 100644 index 000000000..842fb5f3f --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/store/ram/ble_store_ram.h @@ -0,0 +1,39 @@ +/* + * 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_STORE_RAM_ +#define H_BLE_STORE_RAM_ + +#ifdef __cplusplus +extern "C" { +#endif + +union ble_store_key; +union ble_store_value; + +int ble_store_ram_read(int obj_type, const union ble_store_key *key, + union ble_store_value *value); +int ble_store_ram_write(int obj_type, const union ble_store_value *val); +int ble_store_ram_delete(int obj_type, const union ble_store_key *key); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/syscfg/syscfg.h b/lib/libesp32_div/NimBLE-Arduino/src/syscfg/syscfg.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/syscfg/syscfg.h rename to lib/libesp32_div/NimBLE-Arduino/src/syscfg/syscfg.h index 3cb2b14ba..8dccca5eb 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/syscfg/syscfg.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/syscfg/syscfg.h @@ -6,12 +6,8 @@ #define H_MYNEWT_SYSCFG_ #ifdef ESP_PLATFORM -#include "nimble/esp_port/port/include/esp_nimble_cfg.h" +#include "esp_nimble_cfg.h" #else -#include "ext_nimble_config.h" -#endif - -#if 0 /** * This macro exists to ensure code includes this header when needed. If code diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/sysflash/sysflash.h b/lib/libesp32_div/NimBLE-Arduino/src/sysflash/sysflash.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/sysflash/sysflash.h rename to lib/libesp32_div/NimBLE-Arduino/src/sysflash/sysflash.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/sysinit/sysinit.h b/lib/libesp32_div/NimBLE-Arduino/src/sysinit/sysinit.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/porting/nimble/include/sysinit/sysinit.h rename to lib/libesp32_div/NimBLE-Arduino/src/sysinit/sysinit.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/AUTHORS b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/AUTHORS new file mode 100644 index 000000000..0a8e9f806 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/AUTHORS @@ -0,0 +1,15 @@ +Architect: +Rafael Misoczki + +Open Source Maintainer: +Constanza Heath +Rafael Misoczki + +Contributors: +Constanza Heath +Rafael Misoczki +Flavio Santes +Jarkko Sakkinen +Chris Morrison +Marti Bolivar +Colin Ian King diff --git a/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/LICENSE b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/LICENSE new file mode 100644 index 000000000..2e1db516a --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/LICENSE @@ -0,0 +1,61 @@ + +================================================================================ + + TinyCrypt Cryptographic Library + +================================================================================ + + Copyright (c) 2017, Intel Corporation. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + - Neither the name of the Intel Corporation nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +================================================================================ +Copyright (c) 2014, Kenneth MacKay +All rights reserved. + +https://github.com/kmackay/micro-ecc + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +================================================================================ diff --git a/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/README b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/README new file mode 100644 index 000000000..fb52c196a --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/README @@ -0,0 +1,71 @@ + +================================================================================ + + TinyCrypt Cryptographic Library + +================================================================================ + + Copyright (c) 2017, Intel Corporation. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + - Neither the name of the Intel Corporation nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +================================================================================ + +Overview: + +The TinyCrypt Library provides an implementation for constrained devices of a +minimal set of standard cryptography primitives. + +Please, ***SEE THE DOCUMENTATION*** folder for more information on the supported +cryptographic primitives and the limitations of TinyCrypt library. For usage, +security and technicalities, please see the corresponding header file of each +cryptographic primitive. + +================================================================================ + +Organization: + +/lib: C source code of the cryptographic primitives. +/lib/include/tinycrypt: C header files of the cryptographic primitives. +/tests: Test vectors of the cryptographic primitives. +/doc: Documentation of TinyCrypt. + +================================================================================ + +Building: + +1) In Makefile.conf set: + - CFLAGS for compiler flags. + - CC for compiler. + - ENABLE_TESTS for enabling (true) or disabling (false) tests compilation. +2) In lib/Makefile select the primitives required by your project. +3) In tests/Makefile select the corresponding tests of the selected primitives. +4) make +5) run tests in tests/ + +================================================================================ + diff --git a/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/VERSION b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/VERSION new file mode 100644 index 000000000..a45be4627 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/VERSION @@ -0,0 +1 @@ +0.2.8 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/aes.h b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/aes.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/aes.h rename to lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/aes.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/cbc_mode.h b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/cbc_mode.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/cbc_mode.h rename to lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/cbc_mode.h index a53318eed..4a837fd01 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/cbc_mode.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/cbc_mode.h @@ -74,7 +74,7 @@ #ifndef __TC_CBC_MODE_H__ #define __TC_CBC_MODE_H__ -#include "aes.h" +#include #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ccm_mode.h b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ccm_mode.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ccm_mode.h rename to lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ccm_mode.h index c22ac08d4..69c798e2f 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ccm_mode.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ccm_mode.h @@ -74,7 +74,7 @@ #ifndef __TC_CCM_MODE_H__ #define __TC_CCM_MODE_H__ -#include "aes.h" +#include #include #ifdef __cplusplus diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/cmac_mode.h b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/cmac_mode.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/cmac_mode.h rename to lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/cmac_mode.h index 327097026..f44b0a53c 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/cmac_mode.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/cmac_mode.h @@ -97,7 +97,7 @@ #ifndef __TC_CMAC_MODE_H__ #define __TC_CMAC_MODE_H__ -#include "aes.h" +#include #include diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/constants.h b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/constants.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/constants.h rename to lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/constants.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ctr_mode.h b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ctr_mode.h similarity index 98% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ctr_mode.h rename to lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ctr_mode.h index e2da5b43b..dc221f9ee 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ctr_mode.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ctr_mode.h @@ -67,8 +67,8 @@ #ifndef __TC_CTR_MODE_H__ #define __TC_CTR_MODE_H__ -#include "aes.h" -#include "constants.h" +#include +#include #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ctr_prng.h b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ctr_prng.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ctr_prng.h rename to lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ctr_prng.h index bff7f9726..9be06dbb1 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ctr_prng.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ctr_prng.h @@ -59,7 +59,7 @@ #ifndef __TC_CTR_PRNG_H__ #define __TC_CTR_PRNG_H__ -#include "aes.h" +#include #define TC_CTR_PRNG_RESEED_REQ -1 diff --git a/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/documentation/tinycrypt.rst b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/documentation/tinycrypt.rst new file mode 100644 index 000000000..356c099a0 --- /dev/null +++ b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/documentation/tinycrypt.rst @@ -0,0 +1,352 @@ + +TinyCrypt Cryptographic Library +############################### +Copyright (C) 2017 by Intel Corporation, All Rights Reserved. + +Overview +******** +The TinyCrypt Library provides an implementation for targeting constrained devices +with a minimal set of standard cryptography primitives, as listed below. To better +serve applications targeting constrained devices, TinyCrypt implementations differ +from the standard specifications (see the Important Remarks section for some +important differences). Certain cryptographic primitives depend on other +primitives, as mentioned in the list below. + +Aside from the Important Remarks section below, valuable information on the usage, +security and technicalities of each cryptographic primitive are found in the +corresponding header file. + +* SHA-256: + + * Type of primitive: Hash function. + * Standard Specification: NIST FIPS PUB 180-4. + * Requires: -- + +* HMAC-SHA256: + + * Type of primitive: Message authentication code. + * Standard Specification: RFC 2104. + * Requires: SHA-256 + +* HMAC-PRNG: + + * Type of primitive: Pseudo-random number generator (256-bit strength). + * Standard Specification: NIST SP 800-90A. + * Requires: SHA-256 and HMAC-SHA256. + +* AES-128: + + * Type of primitive: Block cipher. + * Standard Specification: NIST FIPS PUB 197. + * Requires: -- + +* AES-CBC mode: + + * Type of primitive: Encryption mode of operation. + * Standard Specification: NIST SP 800-38A. + * Requires: AES-128. + +* AES-CTR mode: + + * Type of primitive: Encryption mode of operation. + * Standard Specification: NIST SP 800-38A. + * Requires: AES-128. + +* AES-CMAC mode: + + * Type of primitive: Message authentication code. + * Standard Specification: NIST SP 800-38B. + * Requires: AES-128. + +* AES-CCM mode: + + * Type of primitive: Authenticated encryption. + * Standard Specification: NIST SP 800-38C. + * Requires: AES-128. + +* CTR-PRNG: + + * Type of primitive: Pseudo-random number generator (128-bit strength). + * Standard Specification: NIST SP 800-90A. + * Requires: AES-128. + +* ECC-DH: + + * Type of primitive: Key exchange based on curve NIST p-256. + * Standard Specification: RFC 6090. + * Requires: ECC auxiliary functions (ecc.h/c). + +* ECC-DSA: + + * Type of primitive: Digital signature based on curve NIST p-256. + * Standard Specification: RFC 6090. + * Requires: ECC auxiliary functions (ecc.h/c). + +Design Goals +************ + +* Minimize the code size of each cryptographic primitive. This means minimize + the size of a platform-independent implementation, as presented in TinyCrypt. + Note that various applications may require further features, optimizations with + respect to other metrics and countermeasures for particular threats. These + peculiarities would increase the code size and thus are not considered here. + +* Minimize the dependencies among the cryptographic primitives. This means + that it is unnecessary to build and allocate object code for more primitives + than the ones strictly required by the intended application. In other words, + one can select and compile only the primitives required by the application. + + +Important Remarks +***************** + +The cryptographic implementations in TinyCrypt library have some limitations. +Some of these limitations are inherent to the cryptographic primitives +themselves, while others are specific to TinyCrypt. These limitations were accepted +in order to meet its design goals (in special, minimal code size) and to better +serve applications targeting constrained devices in general. Some of these +limitations are discussed in-depth below. + +General Remarks +*************** + +* TinyCrypt does **not** intend to be fully side-channel resistant. Due to the + variety of side-channel attacks, many of them only relevant to certain + platforms. In this sense, instead of penalizing all library users with + side-channel countermeasures such as increasing the overall code size, + TinyCrypt only implements certain generic timing-attack countermeasures. + +Specific Remarks +**************** + +* SHA-256: + + * The number of bits_hashed in the state is not checked for overflow. Note + however that this will only be a problem if you intend to hash more than + 2^64 bits, which is an extremely large window. + +* HMAC: + + * The HMAC verification process is assumed to be performed by the application. + This compares the computed tag with some given tag. + Note that conventional memory-comparison methods (such as memcmp function) + might be vulnerable to timing attacks; thus be sure to use a constant-time + memory comparison function (such as compare_constant_time + function provided in lib/utils.c). + + * The tc_hmac_final function, responsible for computing the message tag, + cleans the state context before exiting. Thus, applications do not need to + clean the TCHmacState_t ctx after calling tc_hmac_final. This should not + be changed in future versions of the library as there are applications + currently relying on this good-practice/feature of TinyCrypt. + +* HMAC-PRNG: + + * Before using HMAC-PRNG, you *must* find an entropy source to produce a seed. + PRNGs only stretch the seed into a seemingly random output of arbitrary + length. The security of the output is exactly equal to the + unpredictability of the seed. + + * NIST SP 800-90A requires three items as seed material in the initialization + step: entropy seed, personalization and a nonce (which is not implemented). + TinyCrypt requires the personalization byte array and automatically creates + the entropy seed using a mandatory call to the re-seed function. + +* AES-128: + + * The current implementation does not support other key-lengths (such as 256 + bits). Note that if you need AES-256, it doesn't sound as though your + application is running in a constrained environment. AES-256 requires keys + twice the size as for AES-128, and the key schedule is 40% larger. + +* CTR mode: + + * The AES-CTR mode limits the size of a data message they encrypt to 2^32 + blocks. If you need to encrypt larger data sets, your application would + need to replace the key after 2^32 block encryptions. + +* CTR-PRNG: + + * Before using CTR-PRNG, you *must* find an entropy source to produce a seed. + PRNGs only stretch the seed into a seemingly random output of arbitrary + length. The security of the output is exactly equal to the + unpredictability of the seed. + +* CBC mode: + + * TinyCrypt CBC decryption assumes that the iv and the ciphertext are + contiguous (as produced by TinyCrypt CBC encryption). This allows for a + very efficient decryption algorithm that would not otherwise be possible. + +* CMAC mode: + + * AES128-CMAC mode of operation offers 64 bits of security against collision + attacks. Note however that an external attacker cannot generate the tags + him/herself without knowing the MAC key. In this sense, to attack the + collision property of AES128-CMAC, an external attacker would need the + cooperation of the legal user to produce an exponentially high number of + tags (e.g. 2^64) to finally be able to look for collisions and benefit + from them. As an extra precaution, the current implementation allows to at + most 2^48 calls to tc_cmac_update function before re-calling tc_cmac_setup + (allowing a new key to be set), as suggested in Appendix B of SP 800-38B. + +* CCM mode: + + * There are a few tradeoffs for the selection of the parameters of CCM mode. + In special, there is a tradeoff between the maximum number of invocations + of CCM under a given key and the maximum payload length for those + invocations. Both things are related to the parameter 'q' of CCM mode. The + maximum number of invocations of CCM under a given key is determined by + the nonce size, which is: 15-q bytes. The maximum payload length for those + invocations is defined as 2^(8q) bytes. + + To achieve minimal code size, TinyCrypt CCM implementation fixes q = 2, + which is a quite reasonable choice for constrained applications. The + implications of this choice are: + + The nonce size is: 13 bytes. + + The maximum payload length is: 2^16 bytes = 65 KB. + + The mac size parameter is an important parameter to estimate the security + against collision attacks (that aim at finding different messages that + produce the same authentication tag). TinyCrypt CCM implementation + accepts any even integer between 4 and 16, as suggested in SP 800-38C. + + * TinyCrypt CCM implementation accepts associated data of any length between + 0 and (2^16 - 2^8) = 65280 bytes. + + * TinyCrypt CCM implementation accepts: + + * Both non-empty payload and associated data (it encrypts and + authenticates the payload and only authenticates the associated data); + + * Non-empty payload and empty associated data (it encrypts and + authenticates the payload); + + * Non-empty associated data and empty payload (it degenerates to an + authentication-only mode on the associated data). + + * RFC-3610, which also specifies CCM, presents a few relevant security + suggestions, such as: it is recommended for most applications to use a + mac size greater than 8. Besides, it is emphasized that the usage of the + same nonce for two different messages which are encrypted with the same + key obviously destroys the security properties of CCM mode. + +* ECC-DH and ECC-DSA: + + * TinyCrypt ECC implementation is based on micro-ecc (see + https://github.com/kmackay/micro-ecc). In the original micro-ecc + documentation, there is an important remark about the way integers are + represented: + + "Integer representation: To reduce code size, all large integers are + represented using little-endian words - so the least significant word is + first. You can use the 'ecc_bytes2native()' and 'ecc_native2bytes()' + functions to convert between the native integer representation and the + standardized octet representation." + + Note that the assumed bit layout is: {31, 30, ..., 0}, {63, 62, ..., 32}, + {95, 94, ..., 64}, {127, 126, ..., 96} for a very-long-integer (vli) + consisting of 4 unsigned integers (as an example). + + * A cryptographically-secure PRNG function must be set (using uECC_set_rng()) + before calling uECC_make_key() or uECC_sign(). + +Examples of Applications +************************ +It is possible to do useful cryptography with only the given small set of +primitives. With this list of primitives it becomes feasible to support a range +of cryptography usages: + + * Measurement of code, data structures, and other digital artifacts (SHA256); + + * Generate commitments (SHA256); + + * Construct keys (HMAC-SHA256); + + * Extract entropy from strings containing some randomness (HMAC-SHA256); + + * Construct random mappings (HMAC-SHA256); + + * Construct nonces and challenges (HMAC-PRNG, CTR-PRNG); + + * Authenticate using a shared secret (HMAC-SHA256); + + * Create an authenticated, replay-protected session (HMAC-SHA256 + HMAC-PRNG); + + * Authenticated encryption (AES-128 + AES-CCM); + + * Key-exchange (EC-DH); + + * Digital signature (EC-DSA); + +Test Vectors +************ + +The library provides a test program for each cryptographic primitive (see 'test' +folder). Besides illustrating how to use the primitives, these tests evaluate +the correctness of the implementations by checking the results against +well-known publicly validated test vectors. + +For the case of the HMAC-PRNG, due to the necessity of performing an extensive +battery test to produce meaningful conclusions, we suggest the user to evaluate +the unpredictability of the implementation by using the NIST Statistical Test +Suite (see References). + +For the case of the EC-DH and EC-DSA implementations, most of the test vectors +were obtained from the site of the NIST Cryptographic Algorithm Validation +Program (CAVP), see References. + +References +********** + +* `NIST FIPS PUB 180-4 (SHA-256)`_ + +.. _NIST FIPS PUB 180-4 (SHA-256): + http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf + +* `NIST FIPS PUB 197 (AES-128)`_ + +.. _NIST FIPS PUB 197 (AES-128): + http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf + +* `NIST SP800-90A (HMAC-PRNG)`_ + +.. _NIST SP800-90A (HMAC-PRNG): + http://csrc.nist.gov/publications/nistpubs/800-90A/SP800-90A.pdf + +* `NIST SP 800-38A (AES-CBC and AES-CTR)`_ + +.. _NIST SP 800-38A (AES-CBC and AES-CTR): + http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + +* `NIST SP 800-38B (AES-CMAC)`_ + +.. _NIST SP 800-38B (AES-CMAC): + http://csrc.nist.gov/publications/nistpubs/800-38B/SP_800-38B.pdf + +* `NIST SP 800-38C (AES-CCM)`_ + +.. _NIST SP 800-38C (AES-CCM): + http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C_updated-July20_2007.pdf + +* `NIST Statistical Test Suite (useful for testing HMAC-PRNG)`_ + +.. _NIST Statistical Test Suite (useful for testing HMAC-PRNG): + http://csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html + +* `NIST Cryptographic Algorithm Validation Program (CAVP) site`_ + +.. _NIST Cryptographic Algorithm Validation Program (CAVP) site: + http://csrc.nist.gov/groups/STM/cavp/ + +* `RFC 2104 (HMAC-SHA256)`_ + +.. _RFC 2104 (HMAC-SHA256): + https://www.ietf.org/rfc/rfc2104.txt + +* `RFC 6090 (ECC-DH and ECC-DSA)`_ + +.. _RFC 6090 (ECC-DH and ECC-DSA): + https://www.ietf.org/rfc/rfc6090.txt diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ecc.h b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ecc.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ecc.h rename to lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ecc.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ecc_dh.h b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ecc_dh.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ecc_dh.h rename to lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ecc_dh.h index 930e9162e..b828e195d 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ecc_dh.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ecc_dh.h @@ -69,7 +69,7 @@ #ifndef __TC_ECC_DH_H__ #define __TC_ECC_DH_H__ -#include "ecc.h" +#include #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ecc_dsa.h b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ecc_dsa.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ecc_dsa.h rename to lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ecc_dsa.h index 8cb421b7a..aca00bc95 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ecc_dsa.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ecc_dsa.h @@ -78,7 +78,7 @@ #ifndef __TC_ECC_DSA_H__ #define __TC_ECC_DSA_H__ -#include "ecc.h" +#include #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ecc_platform_specific.h b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ecc_platform_specific.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/ecc_platform_specific.h rename to lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/ecc_platform_specific.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/hmac.h b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/hmac.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/hmac.h rename to lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/hmac.h index cfa7d38cd..3a081494a 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/hmac.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/hmac.h @@ -63,7 +63,7 @@ #ifndef __TC_HMAC_H__ #define __TC_HMAC_H__ -#include "sha256.h" +#include #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/hmac_prng.h b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/hmac_prng.h similarity index 99% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/hmac_prng.h rename to lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/hmac_prng.h index 24f417e6b..ad12cbbf0 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/hmac_prng.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/hmac_prng.h @@ -68,8 +68,8 @@ #ifndef __TC_HMAC_PRNG_H__ #define __TC_HMAC_PRNG_H__ -#include "sha256.h" -#include "hmac.h" +#include +#include #ifdef __cplusplus extern "C" { diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/sha256.h b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/sha256.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/sha256.h rename to lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/sha256.h diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/utils.h b/lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/utils.h similarity index 100% rename from lib/libesp32_div/NimBLE-Arduino/src/nimble/ext/tinycrypt/include/tinycrypt/utils.h rename to lib/libesp32_div/NimBLE-Arduino/src/tinycrypt/utils.h